schema.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import { Model, Schema, SchemaTypes, Types } from "mongoose";
  2. import { BaseSchema } from "@/types/Schemas";
  3. import config from "./config";
  4. import { UserRole } from "./UserRole";
  5. import { UserAvatarType } from "./UserAvatarType";
  6. import { UserAvatarColor } from "./UserAvatarColor";
  7. export interface UserSchema extends BaseSchema {
  8. username: string;
  9. role: UserRole;
  10. email: {
  11. address: string;
  12. verified: boolean;
  13. verificationToken?: string;
  14. };
  15. avatar: {
  16. type: UserAvatarType;
  17. url?: string;
  18. color?: UserAvatarColor;
  19. };
  20. services: {
  21. password?: {
  22. password: string;
  23. reset: {
  24. code: string;
  25. expires: number;
  26. };
  27. set: {
  28. code: string;
  29. expires: number;
  30. };
  31. };
  32. github?: {
  33. id: number;
  34. access_token: string;
  35. };
  36. };
  37. statistics: {
  38. songsRequested: number;
  39. };
  40. likedSongsPlaylist: Types.ObjectId;
  41. dislikedSongsPlaylist: Types.ObjectId;
  42. favoriteStations: Types.ObjectId[];
  43. name: string;
  44. location?: string;
  45. bio?: string;
  46. preferences: {
  47. orderOfPlaylists: Types.ObjectId[];
  48. nightmode: boolean;
  49. autoSkipDisliked: boolean;
  50. activityLogPublic: boolean;
  51. anonymousSongRequests: boolean;
  52. activityWatch: boolean;
  53. };
  54. }
  55. export type UserModel = Model<UserSchema>;
  56. export const schema = new Schema<UserSchema, UserModel>(
  57. {
  58. username: {
  59. type: SchemaTypes.String,
  60. required: true
  61. },
  62. role: {
  63. type: SchemaTypes.String,
  64. enum: Object.values(UserRole),
  65. required: true
  66. },
  67. email: {
  68. address: {
  69. type: SchemaTypes.String,
  70. required: true
  71. },
  72. verified: {
  73. type: SchemaTypes.Boolean,
  74. default: false,
  75. required: true
  76. },
  77. verificationToken: {
  78. type: SchemaTypes.String,
  79. required: false,
  80. select: false
  81. }
  82. },
  83. avatar: {
  84. type: {
  85. type: SchemaTypes.String,
  86. enum: Object.values(UserAvatarType),
  87. required: true
  88. },
  89. url: {
  90. type: SchemaTypes.String,
  91. required: false
  92. },
  93. color: {
  94. type: SchemaTypes.String,
  95. enum: Object.values(UserAvatarColor),
  96. required: false
  97. }
  98. },
  99. services: {
  100. type: {
  101. password: {
  102. type: {
  103. password: {
  104. type: SchemaTypes.String,
  105. required: true,
  106. select: false
  107. },
  108. reset: {
  109. code: {
  110. type: SchemaTypes.String,
  111. minLength: 8,
  112. maxLength: 8,
  113. required: false,
  114. select: false
  115. },
  116. expires: {
  117. type: SchemaTypes.Date,
  118. required: false,
  119. select: false
  120. }
  121. },
  122. set: {
  123. code: {
  124. type: SchemaTypes.String,
  125. minLength: 8,
  126. maxLength: 8,
  127. required: false,
  128. select: false
  129. },
  130. expires: {
  131. type: SchemaTypes.Date,
  132. required: false,
  133. select: false
  134. }
  135. }
  136. },
  137. required: false
  138. },
  139. github: {
  140. type: {
  141. id: {
  142. type: SchemaTypes.Number,
  143. required: true,
  144. select: false
  145. },
  146. access_token: {
  147. type: SchemaTypes.String,
  148. required: true,
  149. select: false
  150. }
  151. },
  152. required: false
  153. }
  154. },
  155. required: true
  156. },
  157. statistics: {
  158. songsRequested: {
  159. type: SchemaTypes.Number,
  160. default: 0,
  161. required: true
  162. }
  163. },
  164. likedSongsPlaylist: {
  165. type: SchemaTypes.ObjectId,
  166. required: true
  167. },
  168. dislikedSongsPlaylist: {
  169. type: SchemaTypes.ObjectId,
  170. required: true
  171. },
  172. favoriteStations: [
  173. {
  174. type: SchemaTypes.ObjectId,
  175. ref: "stations"
  176. }
  177. ],
  178. name: {
  179. type: SchemaTypes.String,
  180. required: true
  181. },
  182. location: {
  183. type: SchemaTypes.String,
  184. required: false
  185. },
  186. bio: {
  187. type: SchemaTypes.String,
  188. required: false
  189. },
  190. preferences: {
  191. orderOfPlaylists: [SchemaTypes.ObjectId],
  192. nightmode: {
  193. type: SchemaTypes.Boolean,
  194. default: false,
  195. required: true
  196. },
  197. autoSkipDisliked: {
  198. type: SchemaTypes.Boolean,
  199. default: true,
  200. required: true
  201. },
  202. activityLogPublic: {
  203. type: SchemaTypes.Boolean,
  204. default: false,
  205. required: true
  206. },
  207. anonymousSongRequests: {
  208. type: SchemaTypes.Boolean,
  209. default: false,
  210. required: true
  211. },
  212. activityWatch: {
  213. type: SchemaTypes.Boolean,
  214. default: false,
  215. required: true
  216. }
  217. }
  218. },
  219. config
  220. );
  221. export type UserSchemaType = typeof schema;