thread-relation.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { addDays } from 'date-fns';
  2. import { type Model, type Document, Schema } from 'mongoose';
  3. import { getOrCreateModel } from '~/server/util/mongoose-utils';
  4. import type { IThreadRelation } from '../../interfaces/thread-relation';
  5. const DAYS_UNTIL_EXPIRATION = 3;
  6. const generateExpirationDate = (): Date => {
  7. return addDays(new Date(), DAYS_UNTIL_EXPIRATION);
  8. };
  9. export interface ThreadRelationDocument extends IThreadRelation, Document {
  10. updateThreadExpiration(): Promise<void>;
  11. }
  12. interface ThreadRelationModel extends Model<ThreadRelationDocument> {
  13. getExpiredThreadRelations(limit?: number): Promise<ThreadRelationDocument[] | undefined>;
  14. }
  15. const schema = new Schema<ThreadRelationDocument, ThreadRelationModel>({
  16. userId: {
  17. type: Schema.Types.ObjectId,
  18. ref: 'User',
  19. required: true,
  20. },
  21. aiAssistant: {
  22. type: Schema.Types.ObjectId,
  23. ref: 'AiAssistant',
  24. },
  25. threadId: {
  26. type: String,
  27. required: true,
  28. unique: true,
  29. },
  30. title: {
  31. type: String,
  32. },
  33. expiredAt: {
  34. type: Date,
  35. default: generateExpirationDate,
  36. required: true,
  37. },
  38. });
  39. schema.statics.getExpiredThreadRelations = async function(limit?: number): Promise<ThreadRelationDocument[] | undefined> {
  40. const currentDate = new Date();
  41. const expiredThreadRelations = await this.find({ expiredAt: { $lte: currentDate } }).limit(limit ?? 100).exec();
  42. return expiredThreadRelations;
  43. };
  44. schema.methods.updateThreadExpiration = async function(): Promise<void> {
  45. this.expiredAt = generateExpirationDate();
  46. await this.save();
  47. };
  48. export default getOrCreateModel<ThreadRelationDocument, ThreadRelationModel>('ThreadRelation', schema);