1725485641-create-users-table.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import { Sequelize, DataTypes } from "sequelize";
  2. import { MigrationParams } from "umzug";
  3. export const up = async ({
  4. context: sequelize
  5. }: MigrationParams<Sequelize>) => {
  6. await sequelize.getQueryInterface().createTable("users", {
  7. _id: {
  8. // eslint-disable-next-line
  9. // @ts-ignore
  10. type: DataTypes.OBJECTID,
  11. autoNull: false,
  12. primaryKey: true
  13. },
  14. username: {
  15. type: DataTypes.STRING,
  16. allowNull: false
  17. },
  18. role: {
  19. type: DataTypes.ENUM("admin", "moderator", "user"),
  20. allowNull: false
  21. },
  22. emailVerified: {
  23. type: DataTypes.BOOLEAN,
  24. allowNull: true,
  25. defaultValue: false
  26. },
  27. emailVerificationToken: {
  28. type: DataTypes.STRING,
  29. allowNull: true
  30. },
  31. emailAddress: {
  32. type: DataTypes.STRING,
  33. allowNull: false
  34. },
  35. avatarType: {
  36. type: DataTypes.ENUM("gravatar", "initials"),
  37. allowNull: false
  38. },
  39. avatarUrl: {
  40. type: DataTypes.STRING,
  41. allowNull: true
  42. },
  43. avatarColor: {
  44. type: DataTypes.ENUM(
  45. "blue",
  46. "green",
  47. "orange",
  48. "purple",
  49. "red",
  50. "teal"
  51. ),
  52. allowNull: true
  53. },
  54. password: {
  55. type: DataTypes.STRING,
  56. allowNull: true
  57. },
  58. passwordResetCode: {
  59. type: DataTypes.STRING,
  60. allowNull: true
  61. },
  62. passwordResetExpiresAt: {
  63. type: DataTypes.DATE,
  64. allowNull: true
  65. },
  66. passwordSetCode: {
  67. type: DataTypes.STRING,
  68. allowNull: true
  69. },
  70. passwordSetExpiresAt: {
  71. type: DataTypes.DATE,
  72. allowNull: true
  73. },
  74. songsRequested: {
  75. type: DataTypes.BIGINT,
  76. allowNull: false,
  77. defaultValue: 0
  78. },
  79. name: {
  80. type: DataTypes.STRING,
  81. allowNull: false
  82. },
  83. location: {
  84. type: DataTypes.STRING,
  85. allowNull: true
  86. },
  87. bio: {
  88. type: DataTypes.STRING,
  89. allowNull: true
  90. },
  91. nightmode: {
  92. type: DataTypes.BOOLEAN,
  93. allowNull: false,
  94. defaultValue: false
  95. },
  96. autoSkipDisliked: {
  97. type: DataTypes.BOOLEAN,
  98. allowNull: false,
  99. defaultValue: true
  100. },
  101. activityLogPublic: {
  102. type: DataTypes.BOOLEAN,
  103. allowNull: false,
  104. defaultValue: false
  105. },
  106. anonymousSongRequests: {
  107. type: DataTypes.BOOLEAN,
  108. allowNull: false,
  109. defaultValue: false
  110. },
  111. activityWatch: {
  112. type: DataTypes.BOOLEAN,
  113. allowNull: false,
  114. defaultValue: false
  115. },
  116. createdAt: DataTypes.DATE,
  117. updatedAt: DataTypes.DATE
  118. });
  119. await sequelize.query(
  120. "ALTER TABLE users " +
  121. 'ADD COLUMN "hasPassword" ' +
  122. "BOOLEAN GENERATED ALWAYS AS " +
  123. '("password" IS NOT NULL) ' +
  124. "STORED"
  125. );
  126. };
  127. export const down = async ({
  128. context: sequelize
  129. }: MigrationParams<Sequelize>) => {
  130. await sequelize.getQueryInterface().dropTable("users");
  131. };