sync/src/database/metadata_cache.js

66 lines
1.8 KiB
JavaScript
Raw Normal View History

2020-02-06 21:55:47 -08:00
import { createMySQLDuplicateKeyUpdate } from '../util/on-duplicate-key-update';
const Media = require('cytube-mediaquery/lib/media');
// TODO: these fullname-vs-shortcode hacks really need to be abolished
function mediaquery2cytube(type) {
switch (type) {
case 'youtube':
return 'yt';
default:
throw new Error(`mediaquery2cytube: no mapping for ${type}`);
}
}
function cytube2mediaquery(type) {
switch (type) {
case 'yt':
return 'youtube';
default:
throw new Error(`cytube2mediaquery: no mapping for ${type}`);
}
}
class MetadataCacheDB {
constructor(db) {
this.db = db;
}
async put(media) {
media = new Media(media);
media.type = mediaquery2cytube(media.type);
return this.db.runTransaction(async tx => {
let insert = tx.table('media_metadata_cache')
.insert({
id: media.id,
type: media.type,
2020-03-20 19:44:11 -07:00
metadata: JSON.stringify(media),
updated_at: tx.raw('CURRENT_TIMESTAMP')
2020-02-06 21:55:47 -08:00
});
let update = tx.raw(createMySQLDuplicateKeyUpdate(
2020-03-20 19:44:11 -07:00
['metadata', 'updated_at']
2020-02-06 21:55:47 -08:00
));
return tx.raw(insert.toString() + update.toString());
});
}
async get(id, type) {
return this.db.runTransaction(async tx => {
let row = await tx.table('media_metadata_cache')
.where({ id, type })
.first();
if (row === undefined || row === null) {
return null;
}
let metadata = JSON.parse(row.metadata);
metadata.type = cytube2mediaquery(metadata.type);
return new Media(metadata);
});
}
}
export { MetadataCacheDB };