diff --git a/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts b/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts index 37dab4be..1109c125 100644 --- a/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts @@ -35,4 +35,12 @@ export default class ClassicSkinResolver const reviews = await this._model.getReviews(); return reviews.map((row) => new ReviewResolver(row)); } + async last_algolia_index_update_date() { + const updates = await this._model.getAlgoliaIndexUpdates(1); + if (updates.length < 1) { + return null; + } + const update = updates[0]; + return new Date(update.update_timestamp * 1000).toISOString(); + } } diff --git a/packages/skin-database/api/graphql/schema.graphql b/packages/skin-database/api/graphql/schema.graphql index f97665f4..b8f47ab7 100644 --- a/packages/skin-database/api/graphql/schema.graphql +++ b/packages/skin-database/api/graphql/schema.graphql @@ -221,6 +221,12 @@ type ClassicSkin implements Skin & Node { reivew page, or via the Discord bot. """ reviews: [Review] + + """ + The date on which this skin was last updated in the Algolia search index. + Given in simplified extended ISO format (ISO 8601). + """ + last_algolia_index_update_date: String } """ diff --git a/packages/skin-database/data/SkinModel.ts b/packages/skin-database/data/SkinModel.ts index 7c5c2dee..ef3824f3 100644 --- a/packages/skin-database/data/SkinModel.ts +++ b/packages/skin-database/data/SkinModel.ts @@ -370,6 +370,10 @@ export default class SkinModel { ); } + async getAlgoliaIndexUpdates(limit?: number): Promise { + return Skins.searchIndexUpdatesForSkin(this.getMd5(), limit); + } + async withScreenshotTempFile( cb: (file: string) => Promise ): Promise { diff --git a/packages/skin-database/data/skins.ts b/packages/skin-database/data/skins.ts index d2346e6e..61438daf 100644 --- a/packages/skin-database/data/skins.ts +++ b/packages/skin-database/data/skins.ts @@ -342,6 +342,22 @@ export async function getSkinsToShoot(limit: number): Promise { return results.map((row) => row.md5); } +export async function searchIndexUpdatesForSkin( + md5: string, + limit?: number +): Promise< + Array<{ skin_md5: string; update_timestamp: number; field: string }> +> { + let query = knex("algolia_field_updates") + .where({ skin_md5: md5 }) + .orderBy("update_timestamp", "desc"); + + if (limit != null) { + query = query.limit(limit); + } + return query.select(); +} + export async function recordSearchIndexUpdates( md5: string, fields: string[]