{"version":3,"file":"ai-metadata-jobs.mjs","sources":["../../../server/src/services/ai-metadata-jobs.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport { AIMetadataJob } from '../../../shared/contracts/ai-metadata-jobs';\nimport { AI_METADATA_JOB_UID } from '../models/ai-metadata-job';\n\nexport const createAIMetadataJobsService = ({ strapi }: { strapi: Core.Strapi }) => ({\n  async createJob(): Promise<number> {\n    const job = await strapi.db.query(AI_METADATA_JOB_UID).create({\n      data: {\n        status: 'processing',\n        createdAt: new Date(),\n      },\n    });\n\n    return job.id;\n  },\n\n  async getJob(jobId: number): Promise<AIMetadataJob | null> {\n    return strapi.db.query(AI_METADATA_JOB_UID).findOne({\n      where: { id: jobId },\n    });\n  },\n\n  async updateJob(\n    jobId: number,\n    updates: Partial<Omit<AIMetadataJob, 'id' | 'createdAt'>>\n  ): Promise<void> {\n    await strapi.db.query(AI_METADATA_JOB_UID).update({\n      where: { id: jobId },\n      data: updates,\n    });\n  },\n\n  async deleteJob(jobId: number): Promise<void> {\n    await strapi.db.query(AI_METADATA_JOB_UID).delete({\n      where: { id: jobId },\n    });\n  },\n\n  async getLatestActiveJob(): Promise<AIMetadataJob | null> {\n    // Return the most recent job, regardless of status\n    // This allows the frontend to see completed/failed status\n    return strapi.db.query(AI_METADATA_JOB_UID).findOne({\n      orderBy: { createdAt: 'desc' },\n    });\n  },\n\n  async registerCron() {\n    strapi.cron.add({\n      aiMetadataJobsCleanup: {\n        async task() {\n          try {\n            const result = await strapi.db.query(AI_METADATA_JOB_UID).deleteMany({\n              where: {\n                status: { $ne: 'processing' },\n              },\n            });\n\n            if (result.count > 0) {\n              strapi.log.info(`Cleaned up ${result.count} old AI metadata jobs`);\n            }\n          } catch (error) {\n            strapi.log.error('Failed to cleanup AI metadata jobs:', error);\n          }\n        },\n        options: '0 0 * * *', // Run once a day at midnight\n      },\n    });\n  },\n});\n\nexport type { AIMetadataJob };\n"],"names":["createAIMetadataJobsService","strapi","createJob","job","db","query","AI_METADATA_JOB_UID","create","data","status","createdAt","Date","id","getJob","jobId","findOne","where","updateJob","updates","update","deleteJob","delete","getLatestActiveJob","orderBy","registerCron","cron","add","aiMetadataJobsCleanup","task","result","deleteMany","$ne","count","log","info","error","options"],"mappings":";;MAKaA,2BAAAA,GAA8B,CAAC,EAAEC,MAAM,EAA2B,IAAM;QACnF,MAAMC,SAAAA,CAAAA,GAAAA;YACJ,MAAMC,GAAAA,GAAM,MAAMF,MAAAA,CAAOG,EAAE,CAACC,KAAK,CAACC,mBAAAA,CAAAA,CAAqBC,MAAM,CAAC;gBAC5DC,IAAAA,EAAM;oBACJC,MAAAA,EAAQ,YAAA;AACRC,oBAAAA,SAAAA,EAAW,IAAIC,IAAAA;AACjB;AACF,aAAA,CAAA;AAEA,YAAA,OAAOR,IAAIS,EAAE;AACf,QAAA,CAAA;AAEA,QAAA,MAAMC,QAAOC,KAAa,EAAA;AACxB,YAAA,OAAOb,OAAOG,EAAE,CAACC,KAAK,CAACC,mBAAAA,CAAAA,CAAqBS,OAAO,CAAC;gBAClDC,KAAAA,EAAO;oBAAEJ,EAAAA,EAAIE;AAAM;AACrB,aAAA,CAAA;AACF,QAAA,CAAA;QAEA,MAAMG,SAAAA,CAAAA,CACJH,KAAa,EACbI,OAAyD,EAAA;AAEzD,YAAA,MAAMjB,OAAOG,EAAE,CAACC,KAAK,CAACC,mBAAAA,CAAAA,CAAqBa,MAAM,CAAC;gBAChDH,KAAAA,EAAO;oBAAEJ,EAAAA,EAAIE;AAAM,iBAAA;gBACnBN,IAAAA,EAAMU;AACR,aAAA,CAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAME,WAAUN,KAAa,EAAA;AAC3B,YAAA,MAAMb,OAAOG,EAAE,CAACC,KAAK,CAACC,mBAAAA,CAAAA,CAAqBe,MAAM,CAAC;gBAChDL,KAAAA,EAAO;oBAAEJ,EAAAA,EAAIE;AAAM;AACrB,aAAA,CAAA;AACF,QAAA,CAAA;QAEA,MAAMQ,kBAAAA,CAAAA,GAAAA;;;AAGJ,YAAA,OAAOrB,OAAOG,EAAE,CAACC,KAAK,CAACC,mBAAAA,CAAAA,CAAqBS,OAAO,CAAC;gBAClDQ,OAAAA,EAAS;oBAAEb,SAAAA,EAAW;AAAO;AAC/B,aAAA,CAAA;AACF,QAAA,CAAA;QAEA,MAAMc,YAAAA,CAAAA,GAAAA;YACJvB,MAAAA,CAAOwB,IAAI,CAACC,GAAG,CAAC;gBACdC,qBAAAA,EAAuB;oBACrB,MAAMC,IAAAA,CAAAA,GAAAA;wBACJ,IAAI;4BACF,MAAMC,MAAAA,GAAS,MAAM5B,MAAAA,CAAOG,EAAE,CAACC,KAAK,CAACC,mBAAAA,CAAAA,CAAqBwB,UAAU,CAAC;gCACnEd,KAAAA,EAAO;oCACLP,MAAAA,EAAQ;wCAAEsB,GAAAA,EAAK;AAAa;AAC9B;AACF,6BAAA,CAAA;4BAEA,IAAIF,MAAAA,CAAOG,KAAK,GAAG,CAAA,EAAG;gCACpB/B,MAAAA,CAAOgC,GAAG,CAACC,IAAI,CAAC,CAAC,WAAW,EAAEL,MAAAA,CAAOG,KAAK,CAAC,qBAAqB,CAAC,CAAA;AACnE,4BAAA;AACF,wBAAA,CAAA,CAAE,OAAOG,KAAAA,EAAO;AACdlC,4BAAAA,MAAAA,CAAOgC,GAAG,CAACE,KAAK,CAAC,qCAAA,EAAuCA,KAAAA,CAAAA;AAC1D,wBAAA;AACF,oBAAA,CAAA;oBACAC,OAAAA,EAAS;AACX;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;;;;"}