thread-relation.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import type mongoose from 'mongoose';
  2. import { type Model, type Document, Schema } from 'mongoose';
  3. import { getOrCreateModel } from '~/server/util/mongoose-utils';
  4. const DAYS_UNTIL_EXPIRATION = 30;
  5. const generateExpirationDate = (): Date => {
  6. const currentDate = new Date();
  7. const expirationDate = new Date(currentDate.setDate(currentDate.getDate() + DAYS_UNTIL_EXPIRATION));
  8. return expirationDate;
  9. };
  10. interface ThreadRelation {
  11. userId: mongoose.Types.ObjectId;
  12. threadId: string;
  13. expiredAt: Date;
  14. }
  15. interface ThreadRelationDocument extends ThreadRelation, Document {
  16. updateThreadExpiration(): Promise<void>;
  17. }
  18. interface ThreadRelationModel extends Model<ThreadRelationDocument> {
  19. upsertThreadRelation(userId: string, threadId: string): Promise<void>;
  20. getThreadRelation(userId: string, threadId: string): Promise<ThreadRelationDocument | null>
  21. }
  22. const schema = new Schema<ThreadRelationDocument, ThreadRelationModel>({
  23. userId: {
  24. type: Schema.Types.ObjectId,
  25. ref: 'User',
  26. required: true,
  27. },
  28. threadId: {
  29. type: String,
  30. required: true,
  31. unique: true,
  32. },
  33. expiredAt: {
  34. type: Date,
  35. default: generateExpirationDate,
  36. required: true,
  37. },
  38. });
  39. schema.methods.updateThreadExpiration = async function(): Promise<void> {
  40. this.expiredAt = generateExpirationDate();
  41. await this.save();
  42. };
  43. export default getOrCreateModel<ThreadRelationDocument, ThreadRelationModel>('ThreadRelation', schema);