news.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import {
  2. HydratedDocument,
  3. Model,
  4. QueryWithHelpers,
  5. Schema,
  6. SchemaTypes,
  7. Types
  8. } from "mongoose";
  9. export enum NewsStatus {
  10. DRAFT = "draft",
  11. PUBLISHED = "published",
  12. ARCHIVED = "archived"
  13. }
  14. export interface NewsSchema {
  15. title: string;
  16. markdown: string;
  17. status: NewsStatus;
  18. showToNewUsers: boolean;
  19. createdBy: Types.ObjectId;
  20. }
  21. export interface NewsQueryHelpers {
  22. published(
  23. this: QueryWithHelpers<
  24. any,
  25. HydratedDocument<NewsSchema>,
  26. NewsQueryHelpers
  27. >,
  28. published?: boolean
  29. ): QueryWithHelpers<
  30. HydratedDocument<NewsSchema>[],
  31. HydratedDocument<NewsSchema>,
  32. NewsQueryHelpers
  33. >;
  34. newest(
  35. this: QueryWithHelpers<
  36. any,
  37. HydratedDocument<NewsSchema>,
  38. NewsQueryHelpers
  39. >,
  40. showToNewUsers?: boolean
  41. ): QueryWithHelpers<
  42. HydratedDocument<NewsSchema>[],
  43. HydratedDocument<NewsSchema>,
  44. NewsQueryHelpers
  45. >;
  46. }
  47. export const schema = new Schema<
  48. NewsSchema,
  49. Model<NewsSchema, NewsQueryHelpers>,
  50. {},
  51. NewsQueryHelpers
  52. >(
  53. {
  54. title: {
  55. type: SchemaTypes.String,
  56. required: true
  57. },
  58. markdown: {
  59. type: SchemaTypes.String,
  60. required: true
  61. },
  62. status: {
  63. type: SchemaTypes.String,
  64. enum: Object.values(NewsStatus),
  65. default: NewsStatus.DRAFT,
  66. required: true
  67. },
  68. showToNewUsers: {
  69. type: SchemaTypes.Boolean,
  70. default: false,
  71. required: true
  72. },
  73. createdBy: {
  74. type: SchemaTypes.ObjectId,
  75. required: true
  76. }
  77. },
  78. {
  79. timestamps: true,
  80. query: {
  81. published() {
  82. return this.where({ status: NewsStatus.PUBLISHED });
  83. },
  84. newest(showToNewUsers = false) {
  85. const query = this.published().sort({ createdAt: "desc" });
  86. if (showToNewUsers) return query.where({ showToNewUsers });
  87. return query;
  88. }
  89. },
  90. pluginTags: ["useGetDataPlugin"]
  91. }
  92. );