YesPlayMusic/packages/main/database.ts

83 lines
1.7 KiB
TypeScript
Raw Normal View History

2022-03-17 14:45:04 +08:00
import Realm from 'realm'
import type { FetchTracksResponse } from '../renderer/src/api/track'
enum ModelNames {
TRACK = 'Track',
}
const TrackSchema = {
name: ModelNames.TRACK,
properties: {
id: 'int',
json: 'string',
updateAt: 'int',
},
primaryKey: 'id',
}
const realm = new Realm({
path: './dist/db.realm',
schema: [TrackSchema],
})
export const database = {
get: (model: ModelNames, key: number) => {
return realm.objectForPrimaryKey(model, key)
},
set: (model: ModelNames, key: number, value: any) => {
realm.create(
model,
{
id: key,
updateAt: ~~(Date.now() / 1000),
json: JSON.stringify(value),
},
'modified'
)
},
delete: (model: ModelNames, key: number) => {
realm.delete(realm.objectForPrimaryKey(model, key))
},
}
export function setTracks(data: FetchTracksResponse) {
const tracks = data.songs
if (!data.songs) return
const write = async () =>
realm.write(() => {
tracks.forEach(track => {
database.set(ModelNames.TRACK, track.id, track)
})
})
write()
}
export async function setCache(api: string, data: any) {
switch (api) {
case 'song_detail':
setTracks(data)
}
}
export function getCache(api: string, query: any) {
switch (api) {
case 'song_detail': {
const ids: string[] = query.ids.split(',')
const idsQuery = ids.map(id => `id = ${id}`).join(' OR ')
const tracksRaw = realm
.objects(ModelNames.TRACK)
.filtered(`(${idsQuery})`)
if (tracksRaw.length !== ids.length) {
return
}
const tracks = tracksRaw.map(track => JSON.parse(track.json))
return {
code: 200,
songs: tracks,
privileges: {},
}
}
}
}