db-schema.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. import { FieldTypeCode } from "#api/v_0.1.0/types/custom-fields-types.js"; // Удалено, т.к. field_types.code теперь varchar
  2. import { z } from "zod";
  3. const DbSchema = {
  4. usr: {
  5. users: {
  6. userId: z.string().uuid(),
  7. email: z.string().email(),
  8. password: z.string(),
  9. wrongPassTries: z.number().int().default(0),
  10. },
  11. roles: {
  12. roleId: z.string().uuid(),
  13. name: z.string(),
  14. eventId: z.string().uuid().nullable(),
  15. eventTypeId: z.string().uuid().nullable(),
  16. },
  17. groups: {
  18. groupId: z.string().uuid(),
  19. name: z.string(),
  20. },
  21. roleGroups: {
  22. roleId: z.string().uuid(),
  23. groupId: z.string().uuid(),
  24. },
  25. perms: {
  26. permId: z.string().uuid(),
  27. code: z.string(),
  28. name: z.string(),
  29. objId: z.string().uuid(),
  30. },
  31. objects: {
  32. objId: z.string().uuid(),
  33. code: z.string(),
  34. name: z.string(),
  35. description: z.string(),
  36. },
  37. groupPerms: {
  38. groupId: z.string().uuid(),
  39. permId: z.string().uuid(),
  40. },
  41. userRoles: {
  42. roleId: z.string().uuid(),
  43. userId: z.string().uuid(),
  44. eventId: z.string().uuid(),
  45. },
  46. confirmPins: {
  47. transactionId: z.string().uuid(),
  48. email: z.string().email(),
  49. confirmPin: z.string(),
  50. createTime: z.string().datetime(), // timestamp в БД
  51. wrongPinTries: z.number().int().default(0), // int2 в БД
  52. },
  53. userRefreshTokens: {
  54. tokenId: z.string().uuid(),
  55. userId: z.string().uuid(),
  56. refreshToken: z.string(),
  57. rotDate: z.string().datetime(), // timestamp в БД
  58. },
  59. },
  60. ev: {
  61. events: {
  62. eventId: z.string().uuid(),
  63. code: z.string(),
  64. eventTypeId: z.string().uuid(),
  65. ownerId: z.string().uuid(),
  66. },
  67. eventInst: {
  68. eventInstId: z.string().uuid(),
  69. eventId: z.string().uuid(),
  70. privateName: z.string(),
  71. publicName: z.string(),
  72. timezone: z.string(),
  73. isCurrent: z.boolean().default(false),
  74. },
  75. eventTypes: {
  76. eventTypeId: z.string().uuid(),
  77. code: z.string(),
  78. name: z.string(),
  79. },
  80. userEventFields: {
  81. // Таблица user_event_fields из новой БД
  82. userEfId: z.string().uuid(),
  83. eventId: z.string().uuid(),
  84. fieldDefinitionId: z.string().uuid(),
  85. fieldTitleOverride: z.string().nullable(),
  86. userIdentityOrdinalNumber: z.number().int().nullable(),
  87. orderNumber: z.number().int().nullable(),
  88. },
  89. userEventFieldValues: {
  90. // Таблица user_event_fields_values из новой БД
  91. userEfId: z.string().uuid(),
  92. userId: z.string().uuid(),
  93. value: z.string().nullable(),
  94. },
  95. eventDates: {
  96. evDateId: z.string().uuid(),
  97. eventInstId: z.string().uuid(),
  98. date: z.string().datetime(), // timestamp в БД
  99. },
  100. locations: {
  101. locationId: z.string().uuid(),
  102. name: z.string(),
  103. eventInstId: z.string().uuid(),
  104. },
  105. areas: {
  106. areaId: z.string().uuid(),
  107. name: z.string(),
  108. locationId: z.string().uuid(),
  109. parentId: z.string().uuid().nullable(),
  110. },
  111. programBlocks: {
  112. blockId: z.string().uuid(),
  113. name: z.string(),
  114. eventInstId: z.string().uuid(),
  115. },
  116. programPoints: {
  117. pointId: z.string().uuid(),
  118. name: z.string(),
  119. dateStart: z.string().datetime().nullable(), // timestamp в БД
  120. dateEnd: z.string().datetime().nullable(), // timestamp в БД
  121. eventInstId: z.string().uuid(),
  122. areaId: z.string().uuid().nullable(),
  123. blockId: z.string().uuid().nullable(),
  124. isInternal: z.boolean(),
  125. },
  126. },
  127. act: {
  128. activityCategories: {
  129. categoryId: z.string().uuid(),
  130. code: z.string(), // Новое поле
  131. name: z.string(),
  132. eventInstId: z.string().uuid(),
  133. parentId: z.string().uuid().nullable(),
  134. },
  135. peTypes: {
  136. peTypeId: z.string().uuid(),
  137. eventInstId: z.string().uuid(),
  138. code: z.string(),
  139. name: z.string(),
  140. },
  141. actValidators: {
  142. actValidatorId: z.string().uuid(),
  143. code: z.string(),
  144. name: z.string(),
  145. description: z.string(),
  146. isPeValidator: z.boolean(),
  147. },
  148. actRegValidators: {
  149. actValidatorId: z.string().uuid(),
  150. activityId: z.string().uuid(),
  151. value: z.string().nullable(),
  152. value2: z.string().nullable(),
  153. errorMessage: z.string().nullable(),
  154. },
  155. activities: {
  156. activityId: z.string().uuid(),
  157. code: z.string(), // Новое поле
  158. privateName: z.string(),
  159. publicName: z.string(),
  160. eventInstId: z.string().uuid(),
  161. categoryId: z.string().uuid().nullable(),
  162. blockId: z.string().uuid().nullable(),
  163. isUserReg: z.boolean(),
  164. paymentConfig: z.enum([
  165. "PER_REGISTRATION",
  166. "PER_PARTICIPANT",
  167. "FREE",
  168. "NONE",
  169. ]),
  170. registrationProductId: z.string().uuid().nullable(),
  171. participantProductId: z.string().uuid().nullable(),
  172. initialRegStatusId: z.string().uuid(),
  173. nextRegStatusIdAfterPayment: z.string().uuid(),
  174. },
  175. activityPeTypes: {
  176. activityId: z.string().uuid(),
  177. peTypeId: z.string().uuid(),
  178. },
  179. partEntities: {
  180. peId: z.string().uuid(),
  181. peTypeId: z.string().uuid(),
  182. eventInstId: z.string().uuid(),
  183. ownerId: z.string().uuid(),
  184. name: z.string(),
  185. },
  186. peInvites: {
  187. peInviteId: z.string().uuid(),
  188. peInviteUuid: z.string().uuid(),
  189. peId: z.string().uuid(),
  190. limitVal: z.number().int().nullable(),
  191. countVal: z.number().int(),
  192. name: z.string(),
  193. expirationDate: z.string().datetime().nullable(),
  194. },
  195. peMembersRequests: {
  196. peMemberRequestId: z.string().uuid(),
  197. peInviteId: z.string().uuid(),
  198. userId: z.string().uuid(),
  199. status: z.enum(["PENDING", "ACCEPTED", "REJECTED"]),
  200. created_at: z.string().datetime(),
  201. updated_at: z.string().datetime(),
  202. },
  203. peMembers: {
  204. peMemberId: z.string().uuid(),
  205. userId: z.string().uuid(),
  206. peId: z.string().uuid(),
  207. isActive: z.boolean(),
  208. },
  209. activityRegFormFields: {
  210. // Таблица activity_reg_form_fields из новой БД
  211. arffId: z.string().uuid(),
  212. activityId: z.string().uuid(),
  213. fieldDefinitionId: z.string().uuid(),
  214. fieldTitleOverride: z.string().nullable(),
  215. isCopyUserValue: z.boolean(),
  216. isChangeResetStatus: z.boolean(),
  217. orderNumber: z.number().int().nullable(),
  218. },
  219. activityRegs: {
  220. activityRegId: z.string().uuid(),
  221. activityId: z.string().uuid(),
  222. peId: z.string().uuid().nullable(),
  223. userId: z.string().uuid().nullable(),
  224. isPaid: z.boolean(),
  225. number: z.string(),
  226. isCanceled: z.boolean(),
  227. },
  228. actRegStatuses: {
  229. actRegStatusId: z.string().uuid(),
  230. code: z.string(),
  231. name: z.string(),
  232. color: z.string().nullable(),
  233. isPaymentOpen: z.boolean(),
  234. },
  235. actRegStatusHistory: {
  236. statusHistoryId: z.string().uuid(),
  237. activityRegId: z.string().uuid(),
  238. actRegStatusId: z.string().uuid(),
  239. note: z.string().nullable(),
  240. setDate: z.string().datetime(),
  241. },
  242. arFieldValues: {
  243. // Таблица ar_field_values из новой БД
  244. activityRegId: z.string().uuid(),
  245. arffId: z.string().uuid(),
  246. value: z.string().nullable(),
  247. },
  248. peFormFields: {
  249. // Таблица pe_form_fields из новой БД
  250. peFfId: z.string().uuid(),
  251. peTypeId: z.string().uuid(),
  252. fieldDefinitionId: z.string().uuid(),
  253. fieldTitleOverride: z.string().nullable(),
  254. isCopyUserValue: z.boolean(),
  255. orderNumber: z.number().int().nullable(),
  256. },
  257. peFieldValues: {
  258. // Таблица pe_field_values из новой БД
  259. peFfId: z.string().uuid(), // Изменено с fieldDefinitionId
  260. peId: z.string().uuid(),
  261. value: z.string().nullable(),
  262. },
  263. },
  264. cf: {
  265. fieldTypes: {
  266. fieldTypeId: z.string().uuid(),
  267. code: FieldTypeCode, // Ранее FieldTypeCode, теперь varchar в БД
  268. },
  269. fieldValidators: {
  270. validatorId: z.string().uuid(),
  271. code: z.string(),
  272. name: z.string(),
  273. fieldTypeId: z.string().uuid().nullable(),
  274. },
  275. customFieldDefinitions: {
  276. fieldDefinitionId: z.string().uuid(),
  277. code: z.string().nullable(),
  278. fieldTypeId: z.string().uuid(),
  279. title: z.string(),
  280. mask: z.string().nullable(),
  281. options: z.array(z.string()).nullable(), // jsonb в БД, оставляем как массив строк для совместимости с прошлым использованием
  282. },
  283. customFieldValidators: {
  284. fieldDefinitionId: z.string().uuid(),
  285. validatorId: z.string().uuid(),
  286. value: z.string().nullable(),
  287. errorMessage: z.string().nullable(), // Новое поле
  288. },
  289. },
  290. shop: {
  291. productCategories: {
  292. categoryId: z.string().uuid(),
  293. parentCategoryId: z.string().uuid().nullable(),
  294. name: z.string(),
  295. description: z.string().nullable(),
  296. code: z.string(),
  297. },
  298. products: {
  299. productId: z.string().uuid(),
  300. categoryId: z.string().nullable(),
  301. productType: z.enum([
  302. "SHOP_ORDER",
  303. "TICKET",
  304. "ACTIVITY_REGISTRATION",
  305. "ACTIVITY_PARTICIPANT",
  306. ]),
  307. sku: z.string().nullable(),
  308. name: z.string(),
  309. description: z.string().nullable(),
  310. price: z.number(),
  311. currencyCode: z.string().length(3),
  312. stockQuantity: z.number().nullable(),
  313. isActive: z.boolean(),
  314. attributes: z.any().nullable(),
  315. createdAt: z.string().datetime(),
  316. updatedAt: z.string().datetime(),
  317. },
  318. carts: {
  319. cartId: z.string().uuid(),
  320. userId: z.string().uuid().nullable(),
  321. createdAt: z.string().datetime(),
  322. updatedAt: z.string().datetime(),
  323. },
  324. cartItems: {
  325. cartItemId: z.string().uuid(),
  326. cartId: z.string().uuid(),
  327. productId: z.string().uuid(),
  328. // quantity: z.number(),
  329. priceAtAddition: z.number(),
  330. activityRegId: z.string().uuid().nullable(),
  331. peMemberId: z.string().uuid().nullable(),
  332. addedAt: z.string().datetime(),
  333. orderId: z.string().uuid().nullable(),
  334. },
  335. orders: {
  336. orderId: z.string().uuid(),
  337. userId: z.string().uuid().nullable(),
  338. orderNumber: z.string(),
  339. status: z.enum([
  340. "DRAFT",
  341. "PENDING_PAYMENT",
  342. "PAID",
  343. "PROCESSING",
  344. "COMPLETED",
  345. "CANCELLED",
  346. "FAILED",
  347. ]),
  348. totalAmount: z.number(),
  349. currencyCode: z.string().length(3),
  350. billingDataSnapshot: z.any().nullable(),
  351. createdAt: z.string().datetime(),
  352. updatedAt: z.string().datetime(),
  353. paidAt: z.string().datetime().nullable(),
  354. completedAt: z.string().datetime().nullable(),
  355. paymentDueDate: z.string().datetime(),
  356. },
  357. orderItems: {
  358. orderItemId: z.string().uuid(),
  359. orderId: z.string().uuid(),
  360. productId: z.string().uuid(),
  361. // quantity: z.number(),
  362. unitPrice: z.number(),
  363. activityRegId: z.string().uuid().nullable(),
  364. peMemberId: z.string().uuid().nullable(),
  365. attributesSnapshot: z.any().nullable(),
  366. status: z.enum([
  367. "PENDING_PAYMENT",
  368. "PAID",
  369. "CANCELLED",
  370. "FAILED",
  371. "REFUNDED",
  372. ]),
  373. },
  374. payments: {
  375. paymentId: z.string().uuid(),
  376. orderId: z.string().uuid(),
  377. userId: z.string().uuid().nullable(),
  378. amount: z.number(),
  379. currencyCode: z.string().length(3),
  380. paymentMethod: z.enum(["CARD", "SBP"]),
  381. bank: z.enum(["YOOKASSA"]),
  382. status: z.enum([
  383. "PENDING",
  384. "SUCCEEDED",
  385. "FAILED",
  386. "REFUNDED",
  387. "CANCELED",
  388. ]),
  389. externalTransactionId: z.string().nullable(),
  390. paymentGatewayDetails: z.any().nullable(),
  391. createdAt: z.string().datetime(),
  392. updatedAt: z.string().datetime(),
  393. confirmation: z
  394. .object({
  395. type: z.enum([
  396. "redirect",
  397. "qr",
  398. "embedded",
  399. "external",
  400. "mobile_application",
  401. ]),
  402. confirmationUrl: z.string().url().nullable(),
  403. })
  404. .nullable(),
  405. },
  406. },
  407. };
  408. export { DbSchema };