station.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import { Schema, SchemaTypes, Types } from "mongoose";
  2. export enum StationType {
  3. OFFICIAL = "official",
  4. COMMUNITY = "community"
  5. }
  6. export enum StationPrivacy {
  7. PUBLIC = "public",
  8. UNLISTED = "unlisted",
  9. PRIVATE = "private"
  10. }
  11. export enum StationTheme {
  12. BLUE = "blue",
  13. PURPLE = "purple",
  14. TEAL = "teal",
  15. ORANGE = "orange",
  16. RED = "red"
  17. }
  18. export enum StationRequestsAccess {
  19. OWNER = "owner",
  20. USER = "user"
  21. }
  22. export enum StationAutofillMode {
  23. RANDOM = "random",
  24. SEQUENTIAL = "sequential"
  25. }
  26. export interface StationSchema {
  27. type: StationType;
  28. name: string;
  29. displayName: string;
  30. description: string;
  31. privacy: StationPrivacy;
  32. theme: StationTheme;
  33. owner?: Types.ObjectId;
  34. djs: Types.ObjectId[];
  35. currentSong?: Types.ObjectId;
  36. currentSongIndex?: number;
  37. startedAt?: NativeDate;
  38. paused: boolean;
  39. timePaused: number;
  40. pausedAt?: NativeDate;
  41. playlist: Types.ObjectId;
  42. queue: Types.ObjectId[];
  43. blacklist: Types.ObjectId[];
  44. requests?: {
  45. enabled: boolean;
  46. access: StationRequestsAccess;
  47. limit: number;
  48. };
  49. autofill?: {
  50. enabled: boolean;
  51. playlists: Types.ObjectId[];
  52. limit: number;
  53. mode: StationAutofillMode;
  54. };
  55. }
  56. export const schema = new Schema<StationSchema>(
  57. {
  58. type: {
  59. type: SchemaTypes.String,
  60. enum: Object.values(StationType),
  61. required: true
  62. },
  63. name: {
  64. type: SchemaTypes.String,
  65. unique: true,
  66. minLength: 2,
  67. maxLength: 16,
  68. required: true
  69. },
  70. displayName: {
  71. type: SchemaTypes.String,
  72. unique: true,
  73. minLength: 2,
  74. maxLength: 32,
  75. required: true
  76. },
  77. description: {
  78. type: SchemaTypes.String,
  79. minLength: 2,
  80. maxLength: 128,
  81. required: true
  82. },
  83. privacy: {
  84. type: SchemaTypes.String,
  85. default: StationPrivacy.PRIVATE,
  86. enum: Object.values(StationPrivacy),
  87. required: true
  88. },
  89. theme: {
  90. type: SchemaTypes.String,
  91. default: StationTheme.BLUE,
  92. enum: Object.values(StationTheme),
  93. required: true
  94. },
  95. owner: {
  96. type: SchemaTypes.ObjectId,
  97. required: false
  98. },
  99. djs: [{ type: SchemaTypes.ObjectId }],
  100. currentSong: {
  101. type: SchemaTypes.ObjectId,
  102. required: false
  103. },
  104. currentSongIndex: {
  105. type: SchemaTypes.Number,
  106. required: false
  107. },
  108. startedAt: {
  109. type: SchemaTypes.Date,
  110. required: false
  111. },
  112. paused: {
  113. type: SchemaTypes.Boolean,
  114. default: false
  115. },
  116. timePaused: {
  117. type: SchemaTypes.Number,
  118. default: 0
  119. },
  120. pausedAt: {
  121. type: SchemaTypes.Date,
  122. required: false
  123. },
  124. playlist: {
  125. type: SchemaTypes.ObjectId
  126. },
  127. queue: [{ type: SchemaTypes.ObjectId }],
  128. blacklist: [{ type: SchemaTypes.ObjectId }],
  129. requests: {
  130. enabled: {
  131. type: SchemaTypes.Boolean,
  132. default: true
  133. },
  134. access: {
  135. type: SchemaTypes.String,
  136. default: StationRequestsAccess.OWNER,
  137. enum: Object.values(StationRequestsAccess)
  138. },
  139. limit: {
  140. type: SchemaTypes.Number,
  141. default: 5,
  142. min: 1,
  143. max: 50
  144. }
  145. },
  146. autofill: {
  147. enabled: {
  148. type: SchemaTypes.Boolean,
  149. default: true
  150. },
  151. playlists: [{ type: SchemaTypes.ObjectId }],
  152. limit: {
  153. type: SchemaTypes.Number,
  154. default: 30,
  155. min: 1,
  156. max: 50
  157. },
  158. mode: {
  159. type: SchemaTypes.String,
  160. default: StationAutofillMode.RANDOM,
  161. enum: Object.values(StationAutofillMode)
  162. }
  163. }
  164. },
  165. { pluginTags: ["useGetDataPlugin"] }
  166. );