1725485641-create-users-table.ts 2.5 KB

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