haykkh / what-the-playlist

what playlist was that song in again??
https://whattheplaylist.com
6 stars 2 forks source link

feat: implement a db to store data #54

Open haykkh opened 2 years ago

haykkh commented 2 years ago

Probably something like https://docs.deta.sh/docs/base/about/

Also look into https://developer.spotify.com/documentation/general/guides/working-with-playlists/#version-control-and-snapshots

haykkh commented 1 year ago

Initially when creating the server routes I made separate, specific routes for each databases' routes eg:

[server/api/db/playlist/put-many.post.ts]

import { type DetaType } from "deta/dist/types/types/basic"

import { useDetaBase } from "@/composables/deta"
// need to import composable as they aren't auto imported into /server
// https://nuxt.com/docs/guide/concepts/auto-imports
import { type IPlaylist } from "@/stores"
import { chunker } from "@/utils"

type DetaPlaylist = DetaType & IPlaylist

export default defineEventHandler(async (event) => {
  // calls a Deta Base put many method
  // https://docs.deta.sh/docs/base/sdk/#put-many

  const db = useDetaBase("playlists")
  const { playlists }: { playlists: DetaPlaylist[] } = await readBody(event)

  const mappedPlaylists = playlists.map(playlist => (
    // if playlist is spreadable (object type)
    typeof playlist === "object"
      // spread it
      ? {
        ...playlist,
        key: playlist.id
      }
      // else return empty obj
      : {}
  ))

  const chunks = chunker(mappedPlaylists, 25)

  return await Promise.all(chunks.map(async chunk => await db.putMany(chunk)))
})

and [server/api/db/playlist/fetch.get.ts]

import { useDetaBase } from "@/composables/deta"
// need to import composable as they aren't auto imported into /server
// https://nuxt.com/docs/guide/concepts/auto-imports
import { chunker } from "@/utils"

export default defineEventHandler(async (event) => {
  // calls a Deta Base fetch method
  // https://docs.deta.sh/docs/base/sdk/#fetch

  const { id } = getQuery(event)

  const db = useDetaBase("playlists")

  if (Array.isArray(id)) {
    const queries = id.map(id => ({ id }))

    // no idea why
    // but testing showed that db.fetch failed with 37+ queries
    const chunks = chunker(queries, 37)

    return await Promise.all(chunks.map(async chunk => await db.fetch(chunk)))
  } else {
    return await db.fetch({ id })
  }
})

In the end I realized that it's probably better to match route parameters for database name (eg [server/api/db/[dbName]/fetch]), and make generalized routes for Deta Base Put/Get/Put Many etc methods

haykkh commented 1 year ago

Advanced settings have disappeared

Screenshot 2022-11-29 at 22 39 54

moved to #69

haykkh commented 1 year ago

Create profile page:

haykkh commented 1 year ago

Ask user during auth if they want data stored

haykkh commented 1 year ago

Seems more and more like data processing etc should be moved to a separate backend