station.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. type: {
  58. type: SchemaTypes.String,
  59. enum: Object.values(StationType),
  60. required: true
  61. },
  62. name: {
  63. type: SchemaTypes.String,
  64. unique: true,
  65. minLength: 2,
  66. maxLength: 16,
  67. required: true
  68. },
  69. displayName: {
  70. type: SchemaTypes.String,
  71. unique: true,
  72. minLength: 2,
  73. maxLength: 32,
  74. required: true
  75. },
  76. description: {
  77. type: SchemaTypes.String,
  78. minLength: 2,
  79. maxLength: 128,
  80. required: true
  81. },
  82. privacy: {
  83. type: SchemaTypes.String,
  84. default: StationPrivacy.PRIVATE,
  85. enum: Object.values(StationPrivacy),
  86. required: true
  87. },
  88. theme: {
  89. type: SchemaTypes.String,
  90. default: StationTheme.BLUE,
  91. enum: Object.values(StationTheme),
  92. required: true
  93. },
  94. owner: {
  95. type: SchemaTypes.ObjectId,
  96. required: false
  97. },
  98. djs: [{ type: SchemaTypes.ObjectId }],
  99. currentSong: {
  100. type: SchemaTypes.ObjectId,
  101. required: false
  102. },
  103. currentSongIndex: {
  104. type: SchemaTypes.Number,
  105. required: false
  106. },
  107. startedAt: {
  108. type: SchemaTypes.Date,
  109. required: false
  110. },
  111. paused: {
  112. type: SchemaTypes.Boolean,
  113. default: false
  114. },
  115. timePaused: {
  116. type: SchemaTypes.Number,
  117. default: 0
  118. },
  119. pausedAt: {
  120. type: SchemaTypes.Date,
  121. required: false
  122. },
  123. playlist: {
  124. type: SchemaTypes.ObjectId
  125. },
  126. queue: [{ type: SchemaTypes.ObjectId }],
  127. blacklist: [{ type: SchemaTypes.ObjectId }],
  128. requests: {
  129. enabled: {
  130. type: SchemaTypes.Boolean,
  131. default: true
  132. },
  133. access: {
  134. type: SchemaTypes.String,
  135. default: StationRequestsAccess.OWNER,
  136. enum: Object.values(StationRequestsAccess)
  137. },
  138. limit: {
  139. type: SchemaTypes.Number,
  140. default: 5,
  141. min: 1,
  142. max: 50
  143. }
  144. },
  145. autofill: {
  146. enabled: {
  147. type: SchemaTypes.Boolean,
  148. default: true
  149. },
  150. playlists: [{ type: SchemaTypes.ObjectId }],
  151. limit: {
  152. type: SchemaTypes.Number,
  153. default: 30,
  154. min: 1,
  155. max: 50
  156. },
  157. mode: {
  158. type: SchemaTypes.String,
  159. default: StationAutofillMode.RANDOM,
  160. enum: Object.values(StationAutofillMode)
  161. }
  162. }
  163. });