You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 lines
4.2 KiB

  1. const prisma = require("../utils/prisma");
  2. /**
  3. * @typedef {Object} DeptUser
  4. * @property {number} id
  5. * @property {number} deptId
  6. * @property {number} userId
  7. * @property {Date} createdAt
  8. * @property {Date} updatedAt
  9. */
  10. const DeptUsers = {
  11. writable: ["deptId", "userId"],
  12. validations: {
  13. deptId: (newValue) => {
  14. const num = Number(newValue);
  15. if (isNaN(num)) {
  16. throw new Error("Dept ID must be a number");
  17. }
  18. return num;
  19. },
  20. userId: (newValue) => {
  21. const num = Number(newValue);
  22. if (isNaN(num)) {
  23. throw new Error("User ID must be a number");
  24. }
  25. return num;
  26. },
  27. },
  28. castColumnValue: function (key, value) {
  29. switch (key) {
  30. case "deptId":
  31. case "userId":
  32. return Number(value);
  33. default:
  34. return value;
  35. }
  36. },
  37. /**
  38. * 创建部门用户关联
  39. * @param {Object} data - 部门用户数据
  40. * @returns {Promise<{ deptUser: DeptUser | null, error: string | null }>}
  41. */
  42. create: async function (data) {
  43. try {
  44. const validatedData = {};
  45. for (const key of this.writable) {
  46. if (data[key] !== undefined) {
  47. if (this.validations[key]) {
  48. validatedData[key] = this.validations[key](data[key]);
  49. } else {
  50. validatedData[key] = this.castColumnValue(key, data[key]);
  51. }
  52. }
  53. }
  54. const deptUser = await prisma.dept_users.create({
  55. data: {
  56. ...validatedData,
  57. createdAt: new Date(),
  58. updatedAt: new Date(),
  59. },
  60. });
  61. return { deptUser, error: null };
  62. } catch (error) {
  63. console.error("FAILED TO CREATE DEPT USER.", error.message);
  64. return { deptUser: null, error: error.message };
  65. }
  66. },
  67. /**
  68. * 更新部门用户关联
  69. * @param {number} id - 关联 ID
  70. * @param {Object} updates - 更新的字段
  71. * @returns {Promise<{ success: boolean, error: string | null, deptUser: DeptUser | null }>}
  72. */
  73. update: async function (id, updates = {}) {
  74. try {
  75. if (!id) throw new Error("No ID provided for update");
  76. const currentDeptUser = await prisma.dept_users.findUnique({
  77. where: { id },
  78. });
  79. if (!currentDeptUser) throw new Error("Dept user not found");
  80. const validatedUpdates = {};
  81. for (const key of this.writable) {
  82. if (updates[key] !== undefined) {
  83. if (this.validations[key]) {
  84. validatedUpdates[key] = this.validations[key](updates[key]);
  85. } else {
  86. validatedUpdates[key] = this.castColumnValue(key, updates[key]);
  87. }
  88. }
  89. }
  90. validatedUpdates.updatedAt = new Date();
  91. const updatedDeptUser = await prisma.dept_users.update({
  92. where: { id },
  93. data: validatedUpdates,
  94. });
  95. return { success: true, error: null, deptUser: updatedDeptUser };
  96. } catch (error) {
  97. console.error(error.message);
  98. return { success: false, error: error.message, deptUser: null };
  99. }
  100. },
  101. /**
  102. * 获取部门用户关联
  103. * @param {Object} clause - 查询条件
  104. * @returns {Promise<{ deptUser: DeptUser | null }>}
  105. */
  106. get: async function (clause = {}) {
  107. try {
  108. const deptUser = await prisma.dept_users.findFirst({
  109. where: clause,
  110. });
  111. return deptUser ? { deptUser } : null;
  112. } catch (error) {
  113. console.error(error.message);
  114. return null;
  115. }
  116. },
  117. /**
  118. * 删除部门用户关联
  119. * @param {Object} clause - 删除条件
  120. * @returns {Promise<boolean>}
  121. */
  122. delete: async function (clause = {}) {
  123. try {
  124. const affectedRows = await prisma.dept_users.deleteMany({
  125. where: clause,
  126. });
  127. return affectedRows.count > 0;
  128. } catch (error) {
  129. console.error(error.message);
  130. return false;
  131. }
  132. },
  133. /**
  134. * 查询部门用户关联列表
  135. * @param {Object} clause - 查询条件
  136. * @param {number} limit - 限制数量
  137. * @returns {Promise<DeptUser[]>}
  138. */
  139. where: async function (clause = {}, limit = null) {
  140. try {
  141. const deptUsers = await prisma.dept_users.findMany({
  142. where: clause,
  143. take: limit !== null ? limit : undefined,
  144. });
  145. return deptUsers;
  146. } catch (error) {
  147. console.error(error.message);
  148. return [];
  149. }
  150. },
  151. };
  152. module.exports = { DeptUsers };