workspace.validator.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // api/workspaces/workspace.validator.js
  2. import Joi from "@hapi/joi";
  3. class WorkspaceValidator {
  4. async onCreate(obj) {
  5. const schemaKeys = {
  6. name: Joi.string().required(),
  7. slug: Joi.string().allow('').optional(),
  8. description: Joi.string().allow('').optional(),
  9. timezone: Joi.string().allow('').optional(),
  10. filePath: Joi.string().allow(null).optional(),
  11. fileType: Joi.string().allow(null).optional(),
  12. fileSize: Joi.number().optional(),
  13. metadata: Joi.object().optional(),
  14. isPublic: Joi.boolean().optional(),
  15. teams: Joi.array().items(Joi.object({
  16. _id: Joi.string().hex().length(24),
  17. code: Joi.string(),
  18. name: Joi.string()
  19. })).optional(),
  20. // Nested structures are optional
  21. members: Joi.array().items(Joi.object({
  22. userId: Joi.string().hex().length(24).optional(),
  23. name: Joi.string().optional(),
  24. email: Joi.string().email().optional(),
  25. role: Joi.string().valid('admin', 'user', 'guest').optional(),
  26. joinedAt: Joi.date().optional()
  27. })).optional(),
  28. contacts: Joi.array().items(Joi.object()).optional(),
  29. projects: Joi.array().items(Joi.object()).optional(),
  30. meetings: Joi.array().items(Joi.object()).optional(),
  31. notes: Joi.array().items(Joi.object()).optional(),
  32. tasks: Joi.array().items(Joi.object()).optional(),
  33. // MySQL connection fields
  34. mysqlHost: Joi.string().allow(null).optional(),
  35. mysqlPort: Joi.number().integer().min(1).max(65535).optional(),
  36. mysqlUser: Joi.string().allow(null).optional(),
  37. mysqlPassword: Joi.string().allow(null).optional(),
  38. mysqlDatabase: Joi.string().allow(null).optional(),
  39. mysqlTable: Joi.string().allow(null).optional(),
  40. mysqlConnectionType: Joi.string().valid('direct', 'ssh', null).optional()
  41. };
  42. const schema = Joi.object().keys(schemaKeys);
  43. const { error } = schema.validate(obj, { abortEarly: false });
  44. return error;
  45. }
  46. async onUpdate(obj) {
  47. const schemaKeys = {
  48. name: Joi.string().optional(),
  49. slug: Joi.string().allow('').optional(),
  50. description: Joi.string().allow('').optional(),
  51. timezone: Joi.string().allow('').optional(),
  52. filePath: Joi.string().allow(null).optional(),
  53. fileType: Joi.string().allow(null).optional(),
  54. fileSize: Joi.number().optional(),
  55. metadata: Joi.object().optional(),
  56. isPublic: Joi.boolean().optional(),
  57. teams: Joi.array().items(Joi.object({
  58. _id: Joi.string().hex().length(24),
  59. code: Joi.string(),
  60. name: Joi.string()
  61. })).optional(),
  62. lastAccessed: Joi.date().optional(),
  63. // Nested structures are optional
  64. members: Joi.array().items(Joi.object({
  65. userId: Joi.string().hex().length(24).optional(),
  66. name: Joi.string().optional(),
  67. email: Joi.string().email().optional(),
  68. role: Joi.string().valid('admin', 'user', 'guest').optional(),
  69. joinedAt: Joi.date().optional()
  70. })).optional(),
  71. contacts: Joi.array().items(Joi.object()).optional(),
  72. projects: Joi.array().items(Joi.object()).optional(),
  73. meetings: Joi.array().items(Joi.object()).optional(),
  74. notes: Joi.array().items(Joi.object()).optional(),
  75. tasks: Joi.array().items(Joi.object()).optional(),
  76. // MySQL connection fields
  77. mysqlHost: Joi.string().allow(null).optional(),
  78. mysqlPort: Joi.number().integer().min(1).max(65535).optional(),
  79. mysqlUser: Joi.string().allow(null).optional(),
  80. mysqlPassword: Joi.string().allow(null).optional(),
  81. mysqlDatabase: Joi.string().allow(null).optional(),
  82. mysqlTable: Joi.string().allow(null).optional(),
  83. mysqlConnectionType: Joi.string().valid('direct', 'ssh', null).optional()
  84. };
  85. const schema = Joi.object().keys(schemaKeys);
  86. const { error } = schema.validate(obj, { abortEarly: false });
  87. return error;
  88. }
  89. }
  90. export default new WorkspaceValidator();