create-bubbles 0.1.26 → 0.1.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (496) hide show
  1. package/package.json +1 -1
  2. package/template-vp-monorepo-react-nestjs/.agents/rules//345/205/261/344/272/253/344/273/243/347/240/201.md +2 -2
  3. package/template-vp-monorepo-react-nestjs/.agents/rules//351/234/200/346/261/202/344/270/216/350/256/276/350/256/241/346/226/207/346/241/243.md +50 -0
  4. package/template-vp-monorepo-react-nestjs/.codegraph/.gitignore +5 -0
  5. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/PRD.md +121 -0
  6. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/cleanup-empty-preview.png +0 -0
  7. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/company-created.png +0 -0
  8. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/login-desktop.png +0 -0
  9. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/member-role-assigned.png +0 -0
  10. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/permission-revoked.png +0 -0
  11. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/platform-menu-recovery.png +0 -0
  12. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/project-created.png +0 -0
  13. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/project-member-home.png +0 -0
  14. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/replacement-administrator.png +0 -0
  15. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225/ui/workspace-empty.png +0 -0
  16. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//345/206/263/347/255/226/350/256/260/345/275/225.md +29 -0
  17. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//345/211/215/347/253/257/344/272/244/346/216/245.md +74 -0
  18. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//345/220/216/347/253/257/346/265/213/350/257/225/346/212/245/345/221/212.md +115 -0
  19. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/212/200/346/234/257/345/245/221/347/272/246.md +578 -0
  20. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/265/213/350/257/225/346/212/245/345/221/212.md +137 -0
  21. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/265/213/350/257/225/350/257/201/346/215/256/browser.json +84 -0
  22. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/265/213/350/257/225/350/257/201/346/215/256/http.json +108 -0
  23. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/265/213/350/257/225/350/257/201/346/215/256/legacy-http.json +18 -0
  24. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//346/265/213/350/257/225/350/257/201/346/215/256/legacy.json +24 -0
  25. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//350/201/224/350/260/203/350/256/260/345/275/225.md +76 -0
  26. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//350/277/220/350/241/214/350/257/264/346/230/216.md +117 -0
  27. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//346/235/203/351/231/220/344/270/216/350/217/234/345/215/225//351/234/200/346/261/202/346/226/207/346/241/243.md +275 -0
  28. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//345/206/263/347/255/226/350/256/260/345/275/225.md +35 -0
  29. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//346/212/200/346/234/257/345/245/221/347/272/246.md +744 -0
  30. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//346/265/213/350/257/225/346/212/245/345/221/212.md +174 -0
  31. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//350/201/224/350/260/203/350/256/260/345/275/225.md +137 -0
  32. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//350/256/276/350/256/241/346/226/271/346/241/210.md +215 -0
  33. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//347/273/204/347/273/207/346/236/266/346/236/204//351/234/200/346/261/202/346/226/207/346/241/243.md +421 -0
  34. package/template-vp-monorepo-react-nestjs/.spaces/{server/05./344/270/212/344/274/240/346/224/271/351/200/240/346/226/271/346/241/210/README.md → 02./344/270/212/344/274/240/344/270/216/346/226/207/344/273/266//344/270/212/344/274/240/346/224/271/351/200/240//350/256/276/350/256/241/346/226/271/346/241/210.md} +13 -20
  35. package/template-vp-monorepo-react-nestjs/.spaces/{server/06./345/205/254/345/205/261/351/230/237/345/210/227/346/216/245/345/205/245/346/226/271/346/241/210//344/270/212/344/274/240/346/270/205/347/220/206.md → 02./344/270/212/344/274/240/344/270/216/346/226/207/344/273/266//344/270/212/344/274/240/346/270/205/347/220/206//350/256/276/350/256/241/346/226/271/346/241/210.md} +13 -8
  36. package/template-vp-monorepo-react-nestjs/.spaces/{server/04.upload.md → 02./344/270/212/344/274/240/344/270/216/346/226/207/344/273/266//345/210/206/347/211/207/344/270/212/344/274/240//345/256/236/346/226/275/346/225/231/347/250/213.md} +21 -18
  37. package/template-vp-monorepo-react-nestjs/.spaces/{server/06./345/205/254/345/205/261/351/230/237/345/210/227/346/216/245/345/205/245/346/226/271/346/241/210/README.md → 03./344/273/273/345/212/241/351/230/237/345/210/227//345/205/254/345/205/261/351/230/237/345/210/227//350/256/276/350/256/241/346/226/271/346/241/210.md} +13 -6
  38. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/accounts-mobile-320.png +0 -0
  39. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/accounts-mobile-360.png +0 -0
  40. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/accounts-mobile-390.png +0 -0
  41. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/companies-desktop-data.png +0 -0
  42. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/companies-desktop-empty.png +0 -0
  43. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/companies-mobile-320.png +0 -0
  44. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/companies-mobile-360.png +0 -0
  45. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/companies-mobile-390.png +0 -0
  46. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/company-create-dialog.png +0 -0
  47. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/company-projects-1440.png +0 -0
  48. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/company-projects-390.png +0 -0
  49. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/login-1440.png +0 -0
  50. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/login-390.png +0 -0
  51. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/project-home-1440.png +0 -0
  52. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/project-home-390.png +0 -0
  53. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/register-1440.png +0 -0
  54. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/register-390.png +0 -0
  55. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/workspaces-1440.png +0 -0
  56. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/workspaces-390.png +0 -0
  57. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273/ui/workspaces-empty.png +0 -0
  58. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273//345/267/245/345/205/267/fixtures.mjs +132 -0
  59. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273//345/267/245/345/205/267/visual-check.mjs +274 -0
  60. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273//346/265/213/350/257/225/350/257/201/346/215/256/visual-report.json +104 -0
  61. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//344/270/207/347/211/251/346/242/246/345/271/273//351/252/214/350/257/201/350/257/264/346/230/216.md +25 -0
  62. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//344/272/244/344/273/230/350/256/260/345/275/225.md +12 -0
  63. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//346/265/213/350/257/225/346/212/245/345/221/212.md +19 -0
  64. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//350/256/276/350/256/241/346/226/271/346/241/210.md +18 -0
  65. package/template-vp-monorepo-react-nestjs/.spaces/04./347/225/214/351/235/242/344/270/216/344/270/273/351/242/230//345/233/275/351/231/205/345/214/226//351/234/200/346/261/202/346/226/207/346/241/243.md +24 -0
  66. package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//345/271/263/345/217/260/346/223/215/344/275/234/346/211/213/345/206/214.md +397 -0
  67. package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273//345/244/207/344/273/275/backup.dump +0 -0
  68. package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273//345/244/207/344/273/275/export-dump.ps1 +34 -0
  69. package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273//345/244/207/344/273/275/restore-dump.ps1 +73 -0
  70. package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273//346/223/215/344/275/234/346/214/207/345/215/227.md +227 -0
  71. package/template-vp-monorepo-react-nestjs/.spaces/05./350/277/220/350/241/214/347/273/264/346/212/244//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273//351/234/200/346/261/202/346/226/207/346/241/243.md +31 -0
  72. package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/274/232/350/257/235/347/256/241/347/220/206//346/212/200/346/234/257/345/245/221/347/272/246.md +93 -0
  73. package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/274/232/350/257/235/347/256/241/347/220/206//351/234/200/346/261/202/346/226/207/346/241/243.md +87 -0
  74. package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201/PRD.md +55 -0
  75. package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201//346/212/200/346/234/257/345/245/221/347/272/246.md +92 -0
  76. package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201//346/265/213/350/257/225/346/212/245/345/221/212.md +38 -0
  77. package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201//350/201/224/350/260/203/350/256/260/345/275/225.md +26 -0
  78. package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201//350/256/276/350/256/241/346/226/271/346/241/210.md +53 -0
  79. package/template-vp-monorepo-react-nestjs/.spaces/06./350/256/244/350/257/201/344/270/216/344/274/232/350/257/235//344/277/256/346/224/271/345/257/206/347/240/201//351/234/200/346/261/202/346/226/207/346/241/243.md +63 -0
  80. package/template-vp-monorepo-react-nestjs/.spaces/07.API/344/270/216/351/224/231/350/257/257//346/212/200/346/234/257/345/245/221/347/272/246.md +95 -0
  81. package/template-vp-monorepo-react-nestjs/.spaces/README.md +85 -0
  82. package/template-vp-monorepo-react-nestjs/.spaces//346/226/207/346/241/243/350/247/204/350/214/203.md +97 -0
  83. package/template-vp-monorepo-react-nestjs/AGENTS.md +12 -0
  84. package/template-vp-monorepo-react-nestjs/README.md +3 -27
  85. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0002_enterprise_access.sql +182 -0
  86. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0003_cute_killmonger.sql +357 -0
  87. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0004_company-member-invitations.sql +25 -0
  88. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0005_menu_svg_icons.sql +54 -0
  89. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0002_snapshot.json +1801 -0
  90. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0003_snapshot.json +3511 -0
  91. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0004_snapshot.json +3713 -0
  92. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/_journal.json +29 -1
  93. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/rollback/0003_organization_backfill.sql +32 -0
  94. package/template-vp-monorepo-react-nestjs/apps/server/package.json +6 -4
  95. package/template-vp-monorepo-react-nestjs/apps/server/src/access-init.ts +45 -0
  96. package/template-vp-monorepo-react-nestjs/apps/server/src/app.controller.ts +3 -0
  97. package/template-vp-monorepo-react-nestjs/apps/server/src/app.module.ts +28 -5
  98. package/template-vp-monorepo-react-nestjs/apps/server/src/app.service.ts +3 -0
  99. package/template-vp-monorepo-react-nestjs/apps/server/src/common/adapters/fastify.adapter.ts +11 -0
  100. package/template-vp-monorepo-react-nestjs/apps/server/src/common/constants/session.constants.ts +9 -0
  101. package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/access-policy.decorator.ts +18 -0
  102. package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/current-auth.decorator.ts +4 -0
  103. package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/public.decorator.ts +3 -0
  104. package/template-vp-monorepo-react-nestjs/apps/server/src/common/exceptions/app.exception.ts +9 -0
  105. package/template-vp-monorepo-react-nestjs/apps/server/src/common/filters/global-exception.filter.ts +38 -5
  106. package/template-vp-monorepo-react-nestjs/apps/server/src/common/security/password-security-event.ts +98 -0
  107. package/template-vp-monorepo-react-nestjs/apps/server/src/config/app.config.ts +3 -0
  108. package/template-vp-monorepo-react-nestjs/apps/server/src/config/database.config.ts +3 -0
  109. package/template-vp-monorepo-react-nestjs/apps/server/src/config/llm.config.ts +3 -0
  110. package/template-vp-monorepo-react-nestjs/apps/server/src/config/queue.config.ts +14 -0
  111. package/template-vp-monorepo-react-nestjs/apps/server/src/config/redis.config.ts +3 -0
  112. package/template-vp-monorepo-react-nestjs/apps/server/src/config/session.config.ts +7 -0
  113. package/template-vp-monorepo-react-nestjs/apps/server/src/config/storage.config.ts +9 -0
  114. package/template-vp-monorepo-react-nestjs/apps/server/src/database/access.schema.ts +394 -0
  115. package/template-vp-monorepo-react-nestjs/apps/server/src/database/db.module.ts +3 -0
  116. package/template-vp-monorepo-react-nestjs/apps/server/src/database/organization.schema.ts +453 -0
  117. package/template-vp-monorepo-react-nestjs/apps/server/src/database/schema.ts +6 -0
  118. package/template-vp-monorepo-react-nestjs/apps/server/src/main.ts +4 -0
  119. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access-http.ts +29 -0
  120. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.errors.ts +130 -0
  121. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.guard.ts +63 -0
  122. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.module.ts +27 -0
  123. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.service.ts +441 -0
  124. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.store.ts +68 -0
  125. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/access.validation.ts +44 -0
  126. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.controller.ts +27 -0
  127. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.service.ts +260 -0
  128. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/maintenance/permissions-cleanup.validation.ts +7 -0
  129. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.controller.ts +80 -0
  130. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.service.ts +249 -0
  131. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/roles/roles.validation.ts +24 -0
  132. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/seed/access-seed.service.ts +183 -0
  133. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.controller.ts +28 -0
  134. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.service.ts +94 -0
  135. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/access/workspaces/workspaces.validation.ts +5 -0
  136. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.controller.ts +26 -0
  137. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.module.ts +11 -0
  138. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.service.ts +74 -0
  139. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/audit/audit.validation.ts +11 -0
  140. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.controller.ts +25 -0
  141. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.errors.ts +10 -0
  142. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.module.ts +1 -1
  143. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.repository.ts +60 -0
  144. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.service.ts +69 -11
  145. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/dto/register.dto.ts +1 -1
  146. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/guards/session-auth.guard.ts +8 -0
  147. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/password/change-password.dto.ts +17 -0
  148. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/password.service.ts +6 -0
  149. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session-store.service.ts +46 -0
  150. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session-token.service.ts +12 -0
  151. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session.script.ts +7 -1
  152. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.controller.ts +105 -0
  153. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.module.ts +12 -0
  154. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/companies/companies.service.ts +523 -0
  155. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.controller.ts +72 -0
  156. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.service.ts +154 -0
  157. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/accounts.validation.ts +8 -0
  158. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/password-reset/password-reset.service.ts +81 -0
  159. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/accounts/password-reset/reset-password.validation.ts +13 -0
  160. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/administrators/administrators.service.ts +116 -0
  161. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/administrators/administrators.validation.ts +1 -0
  162. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/company-member-invitations.controller.ts +69 -0
  163. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitation-acceptance.controller.ts +23 -0
  164. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitations.service.ts +344 -0
  165. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/invitations/member-invitations.validation.ts +23 -0
  166. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.controller.ts +88 -0
  167. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.module.ts +31 -0
  168. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.service.ts +573 -0
  169. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/members/members.validation.ts +19 -0
  170. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.controller.ts +56 -0
  171. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.module.ts +11 -0
  172. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.service.ts +230 -0
  173. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/menus/menus.validation.ts +30 -0
  174. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/global-account/global-account-candidates.controller.ts +35 -0
  175. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/global-account/global-account-candidates.service.ts +109 -0
  176. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/member-candidates.controller.ts +60 -0
  177. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/candidates/member-candidates.service.ts +939 -0
  178. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/initialization/project-organization-initialization.service.ts +189 -0
  179. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.module.ts +34 -0
  180. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.store.ts +150 -0
  181. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/organization.validation.ts +23 -0
  182. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/positions/positions.controller.ts +160 -0
  183. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/positions/positions.service.ts +636 -0
  184. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.controller.ts +77 -0
  185. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.service.ts +501 -0
  186. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/templates/organization-templates.store.ts +163 -0
  187. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/units/organization-units.controller.ts +187 -0
  188. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/organization/units/organization-units.service.ts +947 -0
  189. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.controller.ts +94 -0
  190. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.module.ts +13 -0
  191. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/projects/projects.service.ts +369 -0
  192. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/queue-worker.bootstrap.ts +3 -0
  193. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.contracts.ts +4 -0
  194. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.module.ts +5 -0
  195. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.processor.ts +13 -0
  196. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.service.ts +9 -0
  197. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.controller.ts +9 -0
  198. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.service.ts +9 -0
  199. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.controller.ts +9 -0
  200. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.service.ts +18 -0
  201. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/dto/upload-params.dto.ts +1 -1
  202. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/exact-size.transform.ts +14 -3
  203. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/minio-storage.adapter.ts +37 -0
  204. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/storage.port.ts +21 -0
  205. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.constants.ts +9 -0
  206. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.controller.ts +25 -0
  207. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.reponsitory.ts +27 -0
  208. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.service.ts +78 -0
  209. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/utils/object-key.ts +4 -0
  210. package/template-vp-monorepo-react-nestjs/apps/server/src/utils/server-address.ts +6 -0
  211. package/template-vp-monorepo-react-nestjs/apps/server/test/access/access-policy.spec.ts +95 -0
  212. package/template-vp-monorepo-react-nestjs/apps/server/test/access/access.integration.spec.ts +2250 -0
  213. package/template-vp-monorepo-react-nestjs/apps/server/test/access/member-onboarding.validation.spec.ts +78 -0
  214. package/template-vp-monorepo-react-nestjs/apps/server/test/auth/password-operations.spec.ts +433 -0
  215. package/template-vp-monorepo-react-nestjs/apps/server/test/auth/password.integration.spec.ts +300 -0
  216. package/template-vp-monorepo-react-nestjs/apps/server/test/error-catalog.spec.ts +6 -1
  217. package/template-vp-monorepo-react-nestjs/apps/server/test/menus.validation.spec.ts +28 -0
  218. package/template-vp-monorepo-react-nestjs/apps/server/test/organization/organization-domain.spec.ts +260 -0
  219. package/template-vp-monorepo-react-nestjs/apps/server/tsconfig.scripts.json +5 -0
  220. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//347/273/204/344/273/266/345/244/215/347/224/250.md +7 -0
  221. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//350/241/250/345/215/225/345/233/236/345/241/253.md +4 -0
  222. package/template-vp-monorepo-react-nestjs/apps/web/AGENTS.md +17 -8
  223. package/template-vp-monorepo-react-nestjs/apps/web/README.MD +36 -8
  224. package/template-vp-monorepo-react-nestjs/apps/web/index.html +2 -2
  225. package/template-vp-monorepo-react-nestjs/apps/web/package.json +1 -0
  226. package/template-vp-monorepo-react-nestjs/apps/web/src/App.tsx +19 -8
  227. package/template-vp-monorepo-react-nestjs/apps/web/src/api/auth.ts +14 -1
  228. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/accounts.svg +4 -0
  229. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/audit-log.svg +4 -0
  230. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/companies.svg +5 -0
  231. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/dashboard.svg +6 -0
  232. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/home.svg +4 -0
  233. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/members.svg +4 -0
  234. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/menu-item.svg +4 -0
  235. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/menus.svg +6 -0
  236. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/organization-template.svg +4 -0
  237. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/organization.svg +6 -0
  238. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/positions.svg +4 -0
  239. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/profile.svg +5 -0
  240. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/projects.svg +4 -0
  241. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/roles.svg +4 -0
  242. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Brand/Brand.module.css +125 -0
  243. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Brand/Brand.tsx +56 -0
  244. package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/DraftProTable.tsx +11 -5
  245. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/IconSelector.tsx +38 -0
  246. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/SvgAssetIcon.tsx +14 -0
  247. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/SvgAssetRegistry.ts +32 -0
  248. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/SvgAsset/index.ts +10 -0
  249. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/svg-icon/SvgIcon.tsx +0 -2
  250. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Loading/PageLoading.tsx +5 -1
  251. package/template-vp-monorepo-react-nestjs/apps/web/src/components/LocaleSwitch/LocaleSwitch.tsx +52 -0
  252. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/ChangePasswordDialog.tsx +90 -0
  253. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/PasswordFields.module.css +12 -0
  254. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/PasswordFields.tsx +54 -0
  255. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/ResetAccountPasswordDialog.tsx +100 -0
  256. package/template-vp-monorepo-react-nestjs/apps/web/src/components/PasswordActions/change-password-session.ts +13 -0
  257. package/template-vp-monorepo-react-nestjs/apps/web/src/components/RouteTransition/RouteTransition.css +60 -0
  258. package/template-vp-monorepo-react-nestjs/apps/web/src/components/RouteTransition/RouteTransition.tsx +44 -0
  259. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelector.tsx +218 -0
  260. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelectorSelection.ts +91 -0
  261. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/BasicTableSelectorTypes.ts +60 -0
  262. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/README.md +110 -0
  263. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/BasicTableSelector/index.ts +7 -0
  264. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/GlobalAccountSelect.tsx +211 -0
  265. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/GlobalAccountSelectTypes.ts +75 -0
  266. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/README.md +35 -0
  267. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/GlobalAccountSelect/index.ts +9 -0
  268. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberBrowser.tsx +146 -0
  269. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberCandidateColumns.tsx +137 -0
  270. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberFilterPanel.tsx +209 -0
  271. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberSelector.tsx +196 -0
  272. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/OrganizationMemberSelectorTypes.ts +103 -0
  273. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/README.md +8 -0
  274. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/OrganizationMemberSelector/index.ts +13 -0
  275. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/README.md +13 -0
  276. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Selector/index.ts +30 -0
  277. package/template-vp-monorepo-react-nestjs/apps/web/src/config/theme.ts +41 -9
  278. package/template-vp-monorepo-react-nestjs/apps/web/src/hooks/useLatestDialogRequest.ts +71 -0
  279. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/config.ts +40 -0
  280. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/index.ts +10 -0
  281. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/instance.ts +36 -0
  282. package/template-vp-monorepo-react-nestjs/apps/web/src/i18n/ui-locale.ts +30 -0
  283. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/{BasicLayout.tsx → BasicLayout/index.tsx} +42 -35
  284. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/components/WorkspaceNavigationBoundary.tsx +50 -0
  285. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/index.tsx +196 -0
  286. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace-landing.css +119 -0
  287. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace-surfaces.css +110 -0
  288. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/WorkspaceLayout/workspace.css +223 -0
  289. package/template-vp-monorepo-react-nestjs/apps/web/src/locales/en_US.json +639 -1
  290. package/template-vp-monorepo-react-nestjs/apps/web/src/locales/zh_CN.json +621 -1
  291. package/template-vp-monorepo-react-nestjs/apps/web/src/main.tsx +8 -2
  292. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/api.ts +226 -0
  293. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/audit.tsx +169 -0
  294. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/AdministratorDialog.tsx +128 -0
  295. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/CleanupDialog.tsx +140 -0
  296. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/CompanyHierarchyDialog.tsx +244 -0
  297. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntityFormDialog.tsx +285 -0
  298. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntitySelectors/index.ts +6 -0
  299. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/EntitySelectors/selector-requests.ts +59 -0
  300. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/MemberOrganizationsDialog.tsx +188 -0
  301. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/MemberPositionsDialog.tsx +116 -0
  302. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/affiliation-loaders.ts +18 -0
  303. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberAffiliations/index.ts +5 -0
  304. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/AddProjectMemberDialog.tsx +75 -0
  305. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/CompanyMemberInvitationDialog.tsx +246 -0
  306. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/InvitationRecordsTable.tsx +152 -0
  307. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/CompanyMemberInvitation/invitation-link.ts +9 -0
  308. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/MemberOnboardingActions.tsx +79 -0
  309. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/RegisterCompanyMember/RegisterCompanyMemberDialog.module.css +12 -0
  310. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberOnboarding/RegisterCompanyMember/RegisterCompanyMemberDialog.tsx +122 -0
  311. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberRolesDialog.tsx +80 -0
  312. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/MemberTableColumns.tsx +234 -0
  313. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/index.ts +2 -0
  314. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MemberTable/member-candidate-cache.ts +12 -0
  315. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/MenuFormDialog.tsx +251 -0
  316. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/RoleFormDialog.tsx +73 -0
  317. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/components/RolePermissionsDialog.tsx +185 -0
  318. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/entities.tsx +268 -0
  319. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/home.tsx +67 -0
  320. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/members.tsx +310 -0
  321. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/menus/api.ts +74 -0
  322. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/menus/index.tsx +325 -0
  323. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/profile.tsx +160 -0
  324. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/roles.tsx +173 -0
  325. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/access/use-access.ts +35 -0
  326. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/error/404.tsx +20 -0
  327. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/error/error.tsx +42 -0
  328. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/i18n/index.tsx +20 -38
  329. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/components/ProjectFormDialog.tsx +46 -41
  330. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/columns.tsx +20 -15
  331. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/index.ts +32 -22
  332. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/components/DraftProjectFormDialog.tsx +41 -34
  333. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/columns.tsx +27 -20
  334. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/projects.ts +21 -13
  335. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/index.tsx +47 -27
  336. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/index.tsx +51 -36
  337. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/home/index.tsx +9 -6
  338. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/api.ts +3 -0
  339. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/index.tsx +62 -82
  340. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/login-form.css +199 -0
  341. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/login.css +146 -124
  342. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/accept.css +47 -0
  343. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/accept.tsx +143 -0
  344. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/member-invitations/api.ts +20 -0
  345. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/api.ts +91 -0
  346. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/MoveOrganizationUnitDialog.tsx +82 -0
  347. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationMemberColumns.tsx +87 -0
  348. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationMemberHeader.tsx +102 -0
  349. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationTreeModel.tsx +59 -0
  350. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/OrganizationTreePanel.tsx +88 -0
  351. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/index.ts +11 -0
  352. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/organization-loaders.ts +47 -0
  353. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationBrowser/organization-member-filter-loaders.ts +187 -0
  354. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationMembersDialog.tsx +207 -0
  355. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/components/OrganizationUnitDialog.tsx +110 -0
  356. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization/index.tsx +258 -0
  357. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/api.ts +53 -0
  358. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/TemplateDefinitionTabs.tsx +189 -0
  359. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/index.tsx +135 -0
  360. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/components/OrganizationTemplateDialog/types.ts +25 -0
  361. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/organization-templates/index.tsx +201 -0
  362. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/api.ts +81 -0
  363. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/components/PositionFormDialog.tsx +86 -0
  364. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/components/PositionMembersDialog.tsx +102 -0
  365. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/index.tsx +198 -0
  366. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/positions/loaders.ts +35 -0
  367. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/register/api.ts +14 -0
  368. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/register/index.tsx +157 -0
  369. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/api.ts +32 -0
  370. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/index.tsx +146 -0
  371. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/workspaces/state.ts +24 -0
  372. package/template-vp-monorepo-react-nestjs/apps/web/src/router/AGENTS.MD +6 -0
  373. package/template-vp-monorepo-react-nestjs/apps/web/src/router/index.tsx +2 -46
  374. package/template-vp-monorepo-react-nestjs/apps/web/src/router/lazy-load/index.tsx +26 -0
  375. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/README.md +23 -0
  376. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/auth.ts +6 -0
  377. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/index.ts +4 -0
  378. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/access.ts +23 -0
  379. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/data.ts +55 -0
  380. package/template-vp-monorepo-react-nestjs/apps/web/src/router/middleware/workspace/entry.ts +52 -0
  381. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/access/page.tsx +20 -0
  382. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/auth.tsx +17 -0
  383. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/company.tsx +30 -0
  384. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/entry.tsx +20 -0
  385. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/examples.tsx +23 -0
  386. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/fallback.tsx +13 -0
  387. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/index.tsx +32 -0
  388. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/platform.tsx +27 -0
  389. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/project.tsx +28 -0
  390. package/template-vp-monorepo-react-nestjs/apps/web/src/router/page-registry.tsx +94 -0
  391. package/template-vp-monorepo-react-nestjs/apps/web/src/styles/dream.css +34 -0
  392. package/template-vp-monorepo-react-nestjs/apps/web/src/styles/index.css +6 -0
  393. package/template-vp-monorepo-react-nestjs/apps/web/src/types/auto-imports.d.ts +26 -0
  394. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/organization-assignment.ts +66 -0
  395. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/index.ts +48 -13
  396. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/utils.ts +5 -0
  397. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/index.ts +7 -2
  398. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/workspace.ts +82 -0
  399. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/safe-next.ts +36 -0
  400. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/cookie.ts +1 -0
  401. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/session.ts +1 -0
  402. package/template-vp-monorepo-react-nestjs/apps/web/test/i18n-locale.spec.ts +22 -0
  403. package/template-vp-monorepo-react-nestjs/apps/web/test/icon-selector.spec.tsx +23 -0
  404. package/template-vp-monorepo-react-nestjs/apps/web/test/latest-dialog-request.spec.ts +89 -0
  405. package/template-vp-monorepo-react-nestjs/apps/web/test/member-invitation-navigation.spec.ts +34 -0
  406. package/template-vp-monorepo-react-nestjs/apps/web/test/organization-assignment.spec.ts +137 -0
  407. package/template-vp-monorepo-react-nestjs/apps/web/test/password-actions.spec.ts +40 -0
  408. package/template-vp-monorepo-react-nestjs/apps/web/test/password-reset-action.spec.ts +64 -0
  409. package/template-vp-monorepo-react-nestjs/apps/web/test/request.spec.ts +1 -0
  410. package/template-vp-monorepo-react-nestjs/apps/web/test/router/access.spec.ts +136 -0
  411. package/template-vp-monorepo-react-nestjs/apps/web/test/router/config.ts +140 -0
  412. package/template-vp-monorepo-react-nestjs/apps/web/test/router/entry.spec.ts +179 -0
  413. package/template-vp-monorepo-react-nestjs/apps/web/test/router/workspace-data.spec.ts +112 -0
  414. package/template-vp-monorepo-react-nestjs/apps/web/test/selector/global-account-select.spec.ts +311 -0
  415. package/template-vp-monorepo-react-nestjs/apps/web/test/selector/organization-member-selector.spec.ts +454 -0
  416. package/template-vp-monorepo-react-nestjs/apps/web/test/selector/selector-selection.spec.ts +132 -0
  417. package/template-vp-monorepo-react-nestjs/apps/web/test/storage.spec.ts +1 -0
  418. package/template-vp-monorepo-react-nestjs/apps/web/test/tsconfig.json +2 -2
  419. package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-navigation-boundary.spec.tsx +169 -0
  420. package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-navigation.spec.ts +105 -0
  421. package/template-vp-monorepo-react-nestjs/apps/web/test/workspace-requests.spec.ts +174 -0
  422. package/template-vp-monorepo-react-nestjs/apps/web/test/workspaces-password-entry.spec.tsx +71 -0
  423. package/template-vp-monorepo-react-nestjs/apps/web/vite.config.ts +84 -35
  424. package/template-vp-monorepo-react-nestjs/apps/web-vue/package.json +2 -0
  425. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/api/index.ts +1 -0
  426. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/hooks/chart/useEcharts.ts +13 -1
  427. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/layout/default/header/index.vue +1 -0
  428. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/layout/default/index.vue +6 -2
  429. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/index.ts +1 -0
  430. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/permissionGuard.ts +1 -0
  431. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/index.ts +1 -0
  432. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/index.ts +1 -0
  433. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/modules/user.ts +1 -0
  434. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/types/auto-import.d.ts +2 -0
  435. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/index.ts +30 -0
  436. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/utils.ts +5 -0
  437. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/index.ts +2 -0
  438. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/example/echart/config.ts +1 -0
  439. package/template-vp-monorepo-react-nestjs/apps/web-vue/tsconfig.tsbuildinfo +1 -1
  440. package/template-vp-monorepo-react-nestjs/package.json +1 -8
  441. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/command.ts +22 -2
  442. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/config.ts +1 -0
  443. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/files.ts +1 -0
  444. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/load-config.ts +8 -0
  445. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/report.ts +2 -0
  446. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/scanner.ts +11 -0
  447. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/sync.ts +12 -0
  448. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/command.test.ts +1 -0
  449. package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/temporary-directory.ts +5 -0
  450. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/format.ts +1 -0
  451. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/i18n.ts +14 -0
  452. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/storage.ts +8 -0
  453. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/store.ts +9 -0
  454. package/template-vp-monorepo-react-nestjs/packages/i18n/react/src/index.tsx +5 -0
  455. package/template-vp-monorepo-react-nestjs/packages/i18n/react/src/use-store.ts +3 -0
  456. package/template-vp-monorepo-react-nestjs/packages/i18n/vue/src/index.ts +6 -0
  457. package/template-vp-monorepo-react-nestjs/packages/i18n/vue/src/use-store.ts +3 -0
  458. package/template-vp-monorepo-react-nestjs/packages/shared/package.json +5 -1
  459. package/template-vp-monorepo-react-nestjs/packages/shared/src/index.ts +2 -13
  460. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-maintenance.ts +68 -0
  461. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-menus.ts +94 -0
  462. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access-resources.ts +168 -0
  463. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/access.ts +71 -0
  464. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/auth.ts +23 -0
  465. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/index.ts +9 -0
  466. package/template-vp-monorepo-react-nestjs/packages/shared/src/types/organization/models.ts +361 -0
  467. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/access-catalog.ts +304 -0
  468. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/access-scope.ts +97 -0
  469. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/account.ts +1 -0
  470. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/index.ts +65 -0
  471. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/organization/contracts.ts +237 -0
  472. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/record.ts +10 -0
  473. package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/session-terminal.ts +1 -0
  474. package/template-vp-monorepo-react-nestjs/packages/shared/test/access.spec.ts +194 -0
  475. package/template-vp-monorepo-react-nestjs/packages/shared/test/organization.spec.ts +168 -0
  476. package/template-vp-monorepo-react-nestjs/pnpm-workspace.yaml +103 -69
  477. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/browser.mjs +696 -0
  478. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/http-support.mjs +105 -0
  479. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/http.mjs +1091 -0
  480. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/legacy-http.mjs +140 -0
  481. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/legacy.mjs +196 -0
  482. package/template-vp-monorepo-react-nestjs/scripts/enterprise-qa/runtime.mjs +110 -0
  483. package/template-vp-monorepo-react-nestjs/scripts/with-enterprise-test-env.mjs +80 -0
  484. package/template-vp-monorepo-react-nestjs/src/types/auto-imports.d.ts +60 -0
  485. package/template-vp-react/.vscode/settings.json +8 -1
  486. package/template-vp-react/package.json +10 -10
  487. package/template-vp-react/src/types/auto-imports.d.ts +2 -0
  488. package/template-vp-vue-eslint-vapor/package.json +20 -20
  489. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//351/234/200/346/261/202/346/226/207/346/241/243.md +0 -177
  490. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/BasicLayout.module.css +0 -17
  491. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/.gitkeep +0 -0
  492. package/template-vp-react/.agents/rules/SVG/344/275/277/347/224/250.md +0 -8
  493. package/template-vp-react/AGENTS.md +0 -11
  494. /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{hero.png → image/hero.png} +0 -0
  495. /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{react.svg → svg/react.svg} +0 -0
  496. /package/template-vp-monorepo-react-nestjs/apps/web/src/assets/{vite.svg → svg/vite.svg} +0 -0
@@ -1,29 +1,5 @@
1
- # Vite+ Monorepo Starter
1
+ # 账号 密码
2
2
 
3
- A starter for creating a Vite+ monorepo.
3
+ admin admin123456
4
4
 
5
- ## Development
6
-
7
- - Check everything is ready:
8
-
9
- ```bash
10
- vp run ready
11
- ```
12
-
13
- - Run the tests:
14
-
15
- ```bash
16
- vp run -r test
17
- ```
18
-
19
- - Build the monorepo:
20
-
21
- ```bash
22
- vp run -r build
23
- ```
24
-
25
- - Run the development server:
26
-
27
- ```bash
28
- vp run dev
29
- ```
5
+ 运行 vp run server#access:init --account admin 将某个账号设置成平台管理员
@@ -0,0 +1,182 @@
1
+ CREATE TYPE "public"."access_status" AS ENUM('active', 'disabled');--> statement-breakpoint
2
+ CREATE TYPE "public"."builtin_role" AS ENUM('administrator', 'member');--> statement-breakpoint
3
+ CREATE TYPE "public"."menu_type" AS ENUM('directory', 'page', 'operation');--> statement-breakpoint
4
+ CREATE TYPE "public"."access_scope_type" AS ENUM('platform', 'company', 'project');--> statement-breakpoint
5
+ CREATE TABLE "access_bootstrap" (
6
+ "id" integer PRIMARY KEY NOT NULL,
7
+ "initialized_admin_user_id" uuid NOT NULL,
8
+ "initialized_at" timestamp with time zone DEFAULT now() NOT NULL,
9
+ CONSTRAINT "access_bootstrap_singleton" CHECK ("access_bootstrap"."id" = 1)
10
+ );
11
+ --> statement-breakpoint
12
+ CREATE TABLE "audit_logs" (
13
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
14
+ "actor_user_id" uuid NOT NULL,
15
+ "actor_account" varchar(32) NOT NULL,
16
+ "actor_name" varchar(100) NOT NULL,
17
+ "scope_type" "access_scope_type" NOT NULL,
18
+ "company_id" uuid,
19
+ "project_id" uuid,
20
+ "action" varchar(120) NOT NULL,
21
+ "object_type" varchar(60) NOT NULL,
22
+ "object_id" text NOT NULL,
23
+ "summary" jsonb NOT NULL,
24
+ "request_id" varchar(128) NOT NULL,
25
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
26
+ CONSTRAINT "audit_scope_check" CHECK (("audit_logs"."scope_type" = 'platform' AND "audit_logs"."company_id" IS NULL AND "audit_logs"."project_id" IS NULL) OR ("audit_logs"."scope_type" = 'company' AND "audit_logs"."company_id" IS NOT NULL AND "audit_logs"."project_id" IS NULL) OR ("audit_logs"."scope_type" = 'project' AND "audit_logs"."company_id" IS NOT NULL AND "audit_logs"."project_id" IS NOT NULL))
27
+ );
28
+ --> statement-breakpoint
29
+ CREATE TABLE "permission_cleanup_tombstones" (
30
+ "permission_key" varchar(150) PRIMARY KEY NOT NULL,
31
+ "cleaned_at" timestamp with time zone DEFAULT now() NOT NULL,
32
+ "deployment_id" text NOT NULL
33
+ );
34
+ --> statement-breakpoint
35
+ CREATE TABLE "companies" (
36
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
37
+ "name" varchar(100) NOT NULL,
38
+ "code" varchar(64) NOT NULL,
39
+ "description" text DEFAULT '' NOT NULL,
40
+ "status" "access_status" DEFAULT 'active' NOT NULL,
41
+ "version" integer DEFAULT 1 NOT NULL,
42
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
43
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
44
+ CONSTRAINT "companies_code_unique" UNIQUE("code"),
45
+ CONSTRAINT "companies_version_positive" CHECK ("companies"."version" > 0)
46
+ );
47
+ --> statement-breakpoint
48
+ CREATE TABLE "company_members" (
49
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
50
+ "company_id" uuid NOT NULL,
51
+ "user_id" uuid NOT NULL,
52
+ "status" "access_status" DEFAULT 'active' NOT NULL,
53
+ "version" integer DEFAULT 1 NOT NULL,
54
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
55
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
56
+ CONSTRAINT "company_members_company_user_uq" UNIQUE("company_id","user_id"),
57
+ CONSTRAINT "company_members_version_positive" CHECK ("company_members"."version" > 0)
58
+ );
59
+ --> statement-breakpoint
60
+ CREATE TABLE "menu_versions" (
61
+ "scope_type" "access_scope_type" PRIMARY KEY NOT NULL,
62
+ "version" integer DEFAULT 1 NOT NULL,
63
+ CONSTRAINT "menu_versions_positive" CHECK ("menu_versions"."version" > 0)
64
+ );
65
+ --> statement-breakpoint
66
+ CREATE TABLE "menus" (
67
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
68
+ "scope_type" "access_scope_type" NOT NULL,
69
+ "parent_id" uuid,
70
+ "type" "menu_type" NOT NULL,
71
+ "name" varchar(100) NOT NULL,
72
+ "icon" varchar(80) DEFAULT '' NOT NULL,
73
+ "sort" integer DEFAULT 0 NOT NULL,
74
+ "hidden" boolean DEFAULT false NOT NULL,
75
+ "status" "access_status" DEFAULT 'active' NOT NULL,
76
+ "route_key" varchar(120),
77
+ "permission_key" varchar(150),
78
+ "protected" boolean DEFAULT false NOT NULL,
79
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
80
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
81
+ CONSTRAINT "menus_permission_uq" UNIQUE("scope_type","permission_key")
82
+ );
83
+ --> statement-breakpoint
84
+ CREATE TABLE "permissions" (
85
+ "key" varchar(150) PRIMARY KEY NOT NULL,
86
+ "scope_type" "access_scope_type" NOT NULL,
87
+ "title" varchar(100) NOT NULL,
88
+ "route_key" varchar(120) NOT NULL,
89
+ "kind" varchar(20) NOT NULL,
90
+ "page_permission_key" varchar(150),
91
+ "admin_only" boolean DEFAULT false NOT NULL,
92
+ "deprecated" boolean DEFAULT false NOT NULL,
93
+ CONSTRAINT "permissions_scope_key_uq" UNIQUE("scope_type","key"),
94
+ CONSTRAINT "permissions_kind_check" CHECK (("permissions"."kind" = 'page' AND "permissions"."page_permission_key" IS NULL) OR ("permissions"."kind" = 'operation' AND "permissions"."page_permission_key" IS NOT NULL AND "permissions"."page_permission_key" <> "permissions"."key"))
95
+ );
96
+ --> statement-breakpoint
97
+ CREATE TABLE "project_members" (
98
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
99
+ "company_id" uuid NOT NULL,
100
+ "project_id" uuid NOT NULL,
101
+ "user_id" uuid NOT NULL,
102
+ "status" "access_status" DEFAULT 'active' NOT NULL,
103
+ "version" integer DEFAULT 1 NOT NULL,
104
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
105
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
106
+ CONSTRAINT "project_members_project_user_uq" UNIQUE("project_id","user_id"),
107
+ CONSTRAINT "project_members_version_positive" CHECK ("project_members"."version" > 0)
108
+ );
109
+ --> statement-breakpoint
110
+ CREATE TABLE "projects" (
111
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
112
+ "company_id" uuid NOT NULL,
113
+ "name" varchar(100) NOT NULL,
114
+ "code" varchar(64) NOT NULL,
115
+ "description" text DEFAULT '' NOT NULL,
116
+ "status" "access_status" DEFAULT 'active' NOT NULL,
117
+ "version" integer DEFAULT 1 NOT NULL,
118
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
119
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
120
+ CONSTRAINT "projects_company_code_uq" UNIQUE("company_id","code"),
121
+ CONSTRAINT "projects_company_id_uq" UNIQUE("company_id","id"),
122
+ CONSTRAINT "projects_version_positive" CHECK ("projects"."version" > 0)
123
+ );
124
+ --> statement-breakpoint
125
+ CREATE TABLE "role_permissions" (
126
+ "role_id" uuid NOT NULL,
127
+ "permission_key" varchar(150) NOT NULL,
128
+ CONSTRAINT "role_permissions_role_id_permission_key_pk" PRIMARY KEY("role_id","permission_key")
129
+ );
130
+ --> statement-breakpoint
131
+ CREATE TABLE "roles" (
132
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
133
+ "scope_type" "access_scope_type" NOT NULL,
134
+ "company_id" uuid,
135
+ "project_id" uuid,
136
+ "name" varchar(100) NOT NULL,
137
+ "description" text DEFAULT '' NOT NULL,
138
+ "builtin" "builtin_role",
139
+ "version" integer DEFAULT 1 NOT NULL,
140
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
141
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
142
+ CONSTRAINT "roles_scope_check" CHECK (("roles"."scope_type" = 'platform' AND "roles"."company_id" IS NULL AND "roles"."project_id" IS NULL) OR ("roles"."scope_type" = 'company' AND "roles"."company_id" IS NOT NULL AND "roles"."project_id" IS NULL) OR ("roles"."scope_type" = 'project' AND "roles"."company_id" IS NOT NULL AND "roles"."project_id" IS NOT NULL)),
143
+ CONSTRAINT "roles_version_positive" CHECK ("roles"."version" > 0)
144
+ );
145
+ --> statement-breakpoint
146
+ CREATE TABLE "user_roles" (
147
+ "user_id" uuid NOT NULL,
148
+ "role_id" uuid NOT NULL,
149
+ CONSTRAINT "user_roles_user_id_role_id_pk" PRIMARY KEY("user_id","role_id")
150
+ );
151
+ --> statement-breakpoint
152
+ ALTER TABLE "access_bootstrap" ADD CONSTRAINT "access_bootstrap_initialized_admin_user_id_users_id_fk" FOREIGN KEY ("initialized_admin_user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
153
+ ALTER TABLE "audit_logs" ADD CONSTRAINT "audit_logs_actor_user_id_users_id_fk" FOREIGN KEY ("actor_user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
154
+ ALTER TABLE "company_members" ADD CONSTRAINT "company_members_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
155
+ ALTER TABLE "company_members" ADD CONSTRAINT "company_members_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
156
+ ALTER TABLE "menus" ADD CONSTRAINT "menus_permission_key_permissions_key_fk" FOREIGN KEY ("permission_key") REFERENCES "public"."permissions"("key") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
157
+ ALTER TABLE "menus" ADD CONSTRAINT "menus_parent_id_menus_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."menus"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
158
+ ALTER TABLE "permissions" ADD CONSTRAINT "permissions_scope_type_page_permission_key_permissions_scope_type_key_fk" FOREIGN KEY ("scope_type","page_permission_key") REFERENCES "public"."permissions"("scope_type","key") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
159
+ ALTER TABLE "project_members" ADD CONSTRAINT "project_members_company_id_project_id_projects_company_id_id_fk" FOREIGN KEY ("company_id","project_id") REFERENCES "public"."projects"("company_id","id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
160
+ ALTER TABLE "project_members" ADD CONSTRAINT "project_members_company_id_user_id_company_members_company_id_user_id_fk" FOREIGN KEY ("company_id","user_id") REFERENCES "public"."company_members"("company_id","user_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
161
+ ALTER TABLE "projects" ADD CONSTRAINT "projects_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
162
+ ALTER TABLE "role_permissions" ADD CONSTRAINT "role_permissions_role_id_roles_id_fk" FOREIGN KEY ("role_id") REFERENCES "public"."roles"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
163
+ ALTER TABLE "role_permissions" ADD CONSTRAINT "role_permissions_permission_key_permissions_key_fk" FOREIGN KEY ("permission_key") REFERENCES "public"."permissions"("key") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
164
+ ALTER TABLE "roles" ADD CONSTRAINT "roles_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
165
+ ALTER TABLE "roles" ADD CONSTRAINT "roles_project_id_projects_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."projects"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
166
+ ALTER TABLE "roles" ADD CONSTRAINT "roles_company_id_project_id_projects_company_id_id_fk" FOREIGN KEY ("company_id","project_id") REFERENCES "public"."projects"("company_id","id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
167
+ ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
168
+ ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_role_id_roles_id_fk" FOREIGN KEY ("role_id") REFERENCES "public"."roles"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
169
+ CREATE INDEX "audit_scope_created_idx" ON "audit_logs" USING btree ("scope_type","company_id","project_id","created_at","id");--> statement-breakpoint
170
+ CREATE INDEX "company_members_user_idx" ON "company_members" USING btree ("user_id");--> statement-breakpoint
171
+ CREATE UNIQUE INDEX "menus_page_uq" ON "menus" USING btree ("scope_type","route_key") WHERE "menus"."type" = 'page';--> statement-breakpoint
172
+ CREATE INDEX "menus_scope_parent_idx" ON "menus" USING btree ("scope_type","parent_id");--> statement-breakpoint
173
+ CREATE INDEX "project_members_user_idx" ON "project_members" USING btree ("user_id");--> statement-breakpoint
174
+ CREATE INDEX "projects_company_status_idx" ON "projects" USING btree ("company_id","status");--> statement-breakpoint
175
+ CREATE INDEX "role_permissions_key_idx" ON "role_permissions" USING btree ("permission_key");--> statement-breakpoint
176
+ CREATE UNIQUE INDEX "roles_platform_name_uq" ON "roles" USING btree ("name") WHERE "roles"."scope_type" = 'platform';--> statement-breakpoint
177
+ CREATE UNIQUE INDEX "roles_company_name_uq" ON "roles" USING btree ("company_id","name") WHERE "roles"."scope_type" = 'company';--> statement-breakpoint
178
+ CREATE UNIQUE INDEX "roles_project_name_uq" ON "roles" USING btree ("project_id","name") WHERE "roles"."scope_type" = 'project';--> statement-breakpoint
179
+ CREATE UNIQUE INDEX "roles_platform_builtin_uq" ON "roles" USING btree ("builtin") WHERE "roles"."scope_type" = 'platform' AND "roles"."builtin" IS NOT NULL;--> statement-breakpoint
180
+ CREATE UNIQUE INDEX "roles_company_builtin_uq" ON "roles" USING btree ("company_id","builtin") WHERE "roles"."scope_type" = 'company' AND "roles"."builtin" IS NOT NULL;--> statement-breakpoint
181
+ CREATE UNIQUE INDEX "roles_project_builtin_uq" ON "roles" USING btree ("project_id","builtin") WHERE "roles"."scope_type" = 'project' AND "roles"."builtin" IS NOT NULL;--> statement-breakpoint
182
+ CREATE INDEX "user_roles_role_idx" ON "user_roles" USING btree ("role_id");
@@ -0,0 +1,357 @@
1
+ DO $$
2
+ DECLARE
3
+ invalid_company_code_ids text;
4
+ invalid_project_code_ids text;
5
+ duplicate_company_code_ids text;
6
+ duplicate_project_code_ids text;
7
+ duplicate_company_name_ids text;
8
+ BEGIN
9
+ SELECT string_agg(id::text, ', ' ORDER BY id::text)
10
+ INTO invalid_company_code_ids
11
+ FROM "companies"
12
+ WHERE char_length(btrim("code")) NOT BETWEEN 2 AND 32
13
+ OR btrim("code") !~ '^[A-Za-z0-9_-]+$';
14
+
15
+ IF invalid_company_code_ids IS NOT NULL THEN
16
+ RAISE EXCEPTION '组织架构迁移已终止:以下企业 code 不符合 2~32 位 ASCII 字母、数字、下划线或短横线规则:%', invalid_company_code_ids;
17
+ END IF;
18
+
19
+ SELECT string_agg(id::text, ', ' ORDER BY id::text)
20
+ INTO invalid_project_code_ids
21
+ FROM "projects"
22
+ WHERE char_length(btrim("code")) NOT BETWEEN 2 AND 32
23
+ OR btrim("code") !~ '^[A-Za-z0-9_-]+$';
24
+
25
+ IF invalid_project_code_ids IS NOT NULL THEN
26
+ RAISE EXCEPTION '组织架构迁移已终止:以下项目 code 不符合 2~32 位 ASCII 字母、数字、下划线或短横线规则:%', invalid_project_code_ids;
27
+ END IF;
28
+
29
+ SELECT string_agg(company.id::text, ', ' ORDER BY company.id::text)
30
+ INTO duplicate_company_code_ids
31
+ FROM "companies" AS company
32
+ INNER JOIN (
33
+ SELECT lower(normalize(btrim("code"), NFKC)) AS normalized_code
34
+ FROM "companies"
35
+ GROUP BY lower(normalize(btrim("code"), NFKC))
36
+ HAVING count(*) > 1
37
+ ) AS duplicate
38
+ ON duplicate.normalized_code = lower(normalize(btrim(company."code"), NFKC));
39
+
40
+ IF duplicate_company_code_ids IS NOT NULL THEN
41
+ RAISE EXCEPTION '组织架构迁移已终止:以下企业 code 在 NFKC + 不区分大小写后冲突:%', duplicate_company_code_ids;
42
+ END IF;
43
+
44
+ SELECT string_agg(project.id::text, ', ' ORDER BY project.id::text)
45
+ INTO duplicate_project_code_ids
46
+ FROM "projects" AS project
47
+ INNER JOIN (
48
+ SELECT "company_id", lower(normalize(btrim("code"), NFKC)) AS normalized_code
49
+ FROM "projects"
50
+ GROUP BY "company_id", lower(normalize(btrim("code"), NFKC))
51
+ HAVING count(*) > 1
52
+ ) AS duplicate
53
+ ON duplicate."company_id" = project."company_id"
54
+ AND duplicate.normalized_code = lower(normalize(btrim(project."code"), NFKC));
55
+
56
+ IF duplicate_project_code_ids IS NOT NULL THEN
57
+ RAISE EXCEPTION '组织架构迁移已终止:以下项目 code 在所属企业内按 NFKC + 不区分大小写后冲突:%', duplicate_project_code_ids;
58
+ END IF;
59
+
60
+ SELECT string_agg(company.id::text, ', ' ORDER BY company.id::text)
61
+ INTO duplicate_company_name_ids
62
+ FROM "companies" AS company
63
+ INNER JOIN (
64
+ SELECT lower(normalize(btrim("name"), NFKC)) AS normalized_name
65
+ FROM "companies"
66
+ GROUP BY lower(normalize(btrim("name"), NFKC))
67
+ HAVING count(*) > 1
68
+ ) AS duplicate
69
+ ON duplicate.normalized_name = lower(normalize(btrim(company."name"), NFKC));
70
+
71
+ IF duplicate_company_name_ids IS NOT NULL THEN
72
+ RAISE EXCEPTION '组织架构迁移已终止:以下根级企业名称在 NFKC + 不区分大小写后冲突:%', duplicate_company_name_ids;
73
+ END IF;
74
+ END $$;--> statement-breakpoint
75
+ CREATE TYPE "public"."company_entity_type" AS ENUM('group', 'company');--> statement-breakpoint
76
+ CREATE TYPE "public"."organization_duty" AS ENUM('member', 'leader', 'deputy');--> statement-breakpoint
77
+ CREATE TABLE "company_organization_unit_members" (
78
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
79
+ "scope_type" "access_scope_type" DEFAULT 'company' NOT NULL,
80
+ "company_id" uuid NOT NULL,
81
+ "tree_id" uuid NOT NULL,
82
+ "organization_unit_id" uuid NOT NULL,
83
+ "user_id" uuid NOT NULL,
84
+ "duty" "organization_duty" DEFAULT 'member' NOT NULL,
85
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
86
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
87
+ CONSTRAINT "company_organization_members_member_unit_uq" UNIQUE("user_id","organization_unit_id"),
88
+ CONSTRAINT "company_organization_members_scope_check" CHECK ("company_organization_unit_members"."scope_type" = 'company')
89
+ );
90
+ --> statement-breakpoint
91
+ CREATE TABLE "company_position_members" (
92
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
93
+ "scope_type" "access_scope_type" DEFAULT 'company' NOT NULL,
94
+ "company_id" uuid NOT NULL,
95
+ "position_id" uuid NOT NULL,
96
+ "user_id" uuid NOT NULL,
97
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
98
+ CONSTRAINT "company_position_members_user_position_uq" UNIQUE("user_id","position_id"),
99
+ CONSTRAINT "company_position_members_scope_check" CHECK ("company_position_members"."scope_type" = 'company')
100
+ );
101
+ --> statement-breakpoint
102
+ CREATE TABLE "organization_template_positions" (
103
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
104
+ "template_id" uuid NOT NULL,
105
+ "template_version" integer NOT NULL,
106
+ "name" varchar(100) NOT NULL,
107
+ "name_key" text NOT NULL,
108
+ "code" varchar(32) NOT NULL,
109
+ "code_key" varchar(32) NOT NULL,
110
+ "description" varchar(500) DEFAULT '' NOT NULL,
111
+ "status" "access_status" NOT NULL,
112
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
113
+ CONSTRAINT "organization_template_positions_name_length" CHECK (char_length("organization_template_positions"."name") BETWEEN 2 AND 100),
114
+ CONSTRAINT "organization_template_positions_name_key_normalized" CHECK ("organization_template_positions"."name_key" = lower(normalize(btrim("organization_template_positions"."name"), NFKC))),
115
+ CONSTRAINT "organization_template_positions_code_check" CHECK (char_length("organization_template_positions"."code") BETWEEN 2 AND 32 AND "organization_template_positions"."code" ~ '^[a-z0-9_-]+$'),
116
+ CONSTRAINT "organization_template_positions_code_key_normalized" CHECK ("organization_template_positions"."code_key" = lower(normalize(btrim("organization_template_positions"."code"), NFKC))),
117
+ CONSTRAINT "organization_template_positions_version_positive" CHECK ("organization_template_positions"."template_version" > 0)
118
+ );
119
+ --> statement-breakpoint
120
+ CREATE TABLE "organization_template_units" (
121
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
122
+ "template_id" uuid NOT NULL,
123
+ "template_version" integer NOT NULL,
124
+ "parent_id" uuid,
125
+ "name" varchar(100) NOT NULL,
126
+ "name_key" text NOT NULL,
127
+ "code" varchar(32) NOT NULL,
128
+ "code_key" varchar(32) NOT NULL,
129
+ "description" varchar(500) DEFAULT '' NOT NULL,
130
+ "sort" integer NOT NULL,
131
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
132
+ CONSTRAINT "organization_template_units_version_id_uq" UNIQUE("template_id","template_version","id"),
133
+ CONSTRAINT "organization_template_units_name_length" CHECK (char_length("organization_template_units"."name") BETWEEN 2 AND 100),
134
+ CONSTRAINT "organization_template_units_name_key_normalized" CHECK ("organization_template_units"."name_key" = lower(normalize(btrim("organization_template_units"."name"), NFKC))),
135
+ CONSTRAINT "organization_template_units_code_check" CHECK (char_length("organization_template_units"."code") BETWEEN 2 AND 32 AND "organization_template_units"."code" ~ '^[a-z0-9_-]+$'),
136
+ CONSTRAINT "organization_template_units_code_key_normalized" CHECK ("organization_template_units"."code_key" = lower(normalize(btrim("organization_template_units"."code"), NFKC))),
137
+ CONSTRAINT "organization_template_units_sort_range" CHECK ("organization_template_units"."sort" BETWEEN 0 AND 999999999),
138
+ CONSTRAINT "organization_template_units_version_positive" CHECK ("organization_template_units"."template_version" > 0)
139
+ );
140
+ --> statement-breakpoint
141
+ CREATE TABLE "organization_templates" (
142
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
143
+ "company_id" uuid NOT NULL,
144
+ "name" varchar(100) NOT NULL,
145
+ "name_key" text NOT NULL,
146
+ "description" varchar(500) DEFAULT '' NOT NULL,
147
+ "status" "access_status" DEFAULT 'active' NOT NULL,
148
+ "is_default" boolean DEFAULT false NOT NULL,
149
+ "version" integer DEFAULT 1 NOT NULL,
150
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
151
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
152
+ CONSTRAINT "organization_templates_name_length" CHECK (char_length("organization_templates"."name") BETWEEN 2 AND 100),
153
+ CONSTRAINT "organization_templates_name_key_normalized" CHECK ("organization_templates"."name_key" = lower(normalize(btrim("organization_templates"."name"), NFKC))),
154
+ CONSTRAINT "organization_templates_version_positive" CHECK ("organization_templates"."version" > 0)
155
+ );
156
+ --> statement-breakpoint
157
+ CREATE TABLE "organization_trees" (
158
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
159
+ "scope_type" "access_scope_type" NOT NULL,
160
+ "company_id" uuid NOT NULL,
161
+ "project_id" uuid,
162
+ "backfill_batch_key" varchar(100),
163
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
164
+ CONSTRAINT "organization_trees_company_ref_uq" UNIQUE("id","scope_type","company_id"),
165
+ CONSTRAINT "organization_trees_project_ref_uq" UNIQUE("id","scope_type","company_id","project_id"),
166
+ CONSTRAINT "organization_trees_scope_check" CHECK (("organization_trees"."scope_type" = 'company' AND "organization_trees"."project_id" IS NULL) OR ("organization_trees"."scope_type" = 'project' AND "organization_trees"."project_id" IS NOT NULL))
167
+ );
168
+ --> statement-breakpoint
169
+ CREATE TABLE "organization_units" (
170
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
171
+ "tree_id" uuid NOT NULL,
172
+ "parent_id" uuid,
173
+ "name" varchar(100) NOT NULL,
174
+ "name_key" text NOT NULL,
175
+ "code" varchar(32) NOT NULL,
176
+ "code_key" varchar(32) NOT NULL,
177
+ "description" varchar(500) DEFAULT '' NOT NULL,
178
+ "sort" integer NOT NULL,
179
+ "status" "access_status" DEFAULT 'active' NOT NULL,
180
+ "version" integer DEFAULT 1 NOT NULL,
181
+ "source_template_unit_id" uuid,
182
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
183
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
184
+ CONSTRAINT "organization_units_tree_id_uq" UNIQUE("tree_id","id"),
185
+ CONSTRAINT "organization_units_name_length" CHECK (char_length("organization_units"."name") BETWEEN 2 AND 100),
186
+ CONSTRAINT "organization_units_name_key_normalized" CHECK ("organization_units"."name_key" = lower(normalize(btrim("organization_units"."name"), NFKC))),
187
+ CONSTRAINT "organization_units_code_check" CHECK (char_length("organization_units"."code") BETWEEN 2 AND 32 AND "organization_units"."code" ~ '^[a-z0-9_-]+$'),
188
+ CONSTRAINT "organization_units_code_key_normalized" CHECK ("organization_units"."code_key" = lower(normalize(btrim("organization_units"."code"), NFKC))),
189
+ CONSTRAINT "organization_units_sort_range" CHECK ("organization_units"."sort" BETWEEN 0 AND 999999999),
190
+ CONSTRAINT "organization_units_version_positive" CHECK ("organization_units"."version" > 0)
191
+ );
192
+ --> statement-breakpoint
193
+ CREATE TABLE "positions" (
194
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
195
+ "scope_type" "access_scope_type" NOT NULL,
196
+ "company_id" uuid NOT NULL,
197
+ "project_id" uuid,
198
+ "name" varchar(100) NOT NULL,
199
+ "name_key" text NOT NULL,
200
+ "code" varchar(32) NOT NULL,
201
+ "code_key" varchar(32) NOT NULL,
202
+ "description" varchar(500) DEFAULT '' NOT NULL,
203
+ "status" "access_status" DEFAULT 'active' NOT NULL,
204
+ "version" integer DEFAULT 1 NOT NULL,
205
+ "source_template_position_id" uuid,
206
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
207
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
208
+ CONSTRAINT "positions_company_ref_uq" UNIQUE("id","scope_type","company_id"),
209
+ CONSTRAINT "positions_project_ref_uq" UNIQUE("id","scope_type","company_id","project_id"),
210
+ CONSTRAINT "positions_scope_check" CHECK (("positions"."scope_type" = 'company' AND "positions"."project_id" IS NULL) OR ("positions"."scope_type" = 'project' AND "positions"."project_id" IS NOT NULL)),
211
+ CONSTRAINT "positions_name_length" CHECK (char_length("positions"."name") BETWEEN 2 AND 100),
212
+ CONSTRAINT "positions_name_key_normalized" CHECK ("positions"."name_key" = lower(normalize(btrim("positions"."name"), NFKC))),
213
+ CONSTRAINT "positions_code_check" CHECK (char_length("positions"."code") BETWEEN 2 AND 32 AND "positions"."code" ~ '^[a-z0-9_-]+$'),
214
+ CONSTRAINT "positions_code_key_normalized" CHECK ("positions"."code_key" = lower(normalize(btrim("positions"."code"), NFKC))),
215
+ CONSTRAINT "positions_version_positive" CHECK ("positions"."version" > 0)
216
+ );
217
+ --> statement-breakpoint
218
+ CREATE TABLE "project_organization_unit_members" (
219
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
220
+ "scope_type" "access_scope_type" DEFAULT 'project' NOT NULL,
221
+ "company_id" uuid NOT NULL,
222
+ "project_id" uuid NOT NULL,
223
+ "tree_id" uuid NOT NULL,
224
+ "organization_unit_id" uuid NOT NULL,
225
+ "user_id" uuid NOT NULL,
226
+ "duty" "organization_duty" DEFAULT 'member' NOT NULL,
227
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
228
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
229
+ CONSTRAINT "project_organization_members_member_unit_uq" UNIQUE("user_id","organization_unit_id"),
230
+ CONSTRAINT "project_organization_members_scope_check" CHECK ("project_organization_unit_members"."scope_type" = 'project')
231
+ );
232
+ --> statement-breakpoint
233
+ CREATE TABLE "project_position_members" (
234
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
235
+ "scope_type" "access_scope_type" DEFAULT 'project' NOT NULL,
236
+ "company_id" uuid NOT NULL,
237
+ "project_id" uuid NOT NULL,
238
+ "position_id" uuid NOT NULL,
239
+ "user_id" uuid NOT NULL,
240
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
241
+ CONSTRAINT "project_position_members_user_position_uq" UNIQUE("user_id","position_id"),
242
+ CONSTRAINT "project_position_members_scope_check" CHECK ("project_position_members"."scope_type" = 'project')
243
+ );
244
+ --> statement-breakpoint
245
+ ALTER TABLE "companies" ADD COLUMN "parent_company_id" uuid;--> statement-breakpoint
246
+ ALTER TABLE "companies" ADD COLUMN "entity_type" "company_entity_type";--> statement-breakpoint
247
+ ALTER TABLE "companies" ADD COLUMN "name_key" text;--> statement-breakpoint
248
+ ALTER TABLE "companies" ADD COLUMN "sort" integer;--> statement-breakpoint
249
+ UPDATE "companies"
250
+ SET "entity_type" = 'company',
251
+ "name_key" = lower(normalize(btrim("name"), NFKC));--> statement-breakpoint
252
+ WITH stable_company_sort AS (
253
+ SELECT "id", row_number() OVER (ORDER BY "id")::integer AS "sort"
254
+ FROM "companies"
255
+ )
256
+ UPDATE "companies" AS company
257
+ SET "sort" = stable_company_sort."sort"
258
+ FROM stable_company_sort
259
+ WHERE company."id" = stable_company_sort."id";--> statement-breakpoint
260
+ ALTER TABLE "companies" ALTER COLUMN "entity_type" SET DEFAULT 'company';--> statement-breakpoint
261
+ ALTER TABLE "companies" ALTER COLUMN "entity_type" SET NOT NULL;--> statement-breakpoint
262
+ ALTER TABLE "companies" ALTER COLUMN "name_key" SET NOT NULL;--> statement-breakpoint
263
+ ALTER TABLE "companies" ALTER COLUMN "sort" SET DEFAULT 1;--> statement-breakpoint
264
+ ALTER TABLE "companies" ALTER COLUMN "sort" SET NOT NULL;--> statement-breakpoint
265
+ ALTER TABLE "company_organization_unit_members" ADD CONSTRAINT "company_organization_unit_members_tree_id_scope_type_company_id_organization_trees_id_scope_type_company_id_fk" FOREIGN KEY ("tree_id","scope_type","company_id") REFERENCES "public"."organization_trees"("id","scope_type","company_id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
266
+ ALTER TABLE "company_organization_unit_members" ADD CONSTRAINT "company_organization_unit_members_tree_id_organization_unit_id_organization_units_tree_id_id_fk" FOREIGN KEY ("tree_id","organization_unit_id") REFERENCES "public"."organization_units"("tree_id","id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
267
+ ALTER TABLE "company_organization_unit_members" ADD CONSTRAINT "company_organization_unit_members_company_id_user_id_company_members_company_id_user_id_fk" FOREIGN KEY ("company_id","user_id") REFERENCES "public"."company_members"("company_id","user_id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
268
+ ALTER TABLE "company_position_members" ADD CONSTRAINT "company_position_members_position_id_scope_type_company_id_positions_id_scope_type_company_id_fk" FOREIGN KEY ("position_id","scope_type","company_id") REFERENCES "public"."positions"("id","scope_type","company_id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
269
+ ALTER TABLE "company_position_members" ADD CONSTRAINT "company_position_members_company_id_user_id_company_members_company_id_user_id_fk" FOREIGN KEY ("company_id","user_id") REFERENCES "public"."company_members"("company_id","user_id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
270
+ ALTER TABLE "organization_template_positions" ADD CONSTRAINT "organization_template_positions_template_id_organization_templates_id_fk" FOREIGN KEY ("template_id") REFERENCES "public"."organization_templates"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
271
+ ALTER TABLE "organization_template_units" ADD CONSTRAINT "organization_template_units_template_id_organization_templates_id_fk" FOREIGN KEY ("template_id") REFERENCES "public"."organization_templates"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
272
+ ALTER TABLE "organization_template_units" ADD CONSTRAINT "organization_template_units_template_id_template_version_parent_id_organization_template_units_template_id_template_version_id_fk" FOREIGN KEY ("template_id","template_version","parent_id") REFERENCES "public"."organization_template_units"("template_id","template_version","id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
273
+ ALTER TABLE "organization_templates" ADD CONSTRAINT "organization_templates_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
274
+ ALTER TABLE "organization_trees" ADD CONSTRAINT "organization_trees_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
275
+ ALTER TABLE "organization_trees" ADD CONSTRAINT "organization_trees_company_id_project_id_projects_company_id_id_fk" FOREIGN KEY ("company_id","project_id") REFERENCES "public"."projects"("company_id","id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
276
+ ALTER TABLE "organization_units" ADD CONSTRAINT "organization_units_tree_id_organization_trees_id_fk" FOREIGN KEY ("tree_id") REFERENCES "public"."organization_trees"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
277
+ ALTER TABLE "organization_units" ADD CONSTRAINT "organization_units_tree_id_parent_id_organization_units_tree_id_id_fk" FOREIGN KEY ("tree_id","parent_id") REFERENCES "public"."organization_units"("tree_id","id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
278
+ ALTER TABLE "organization_units" ADD CONSTRAINT "organization_units_source_template_unit_id_organization_template_units_id_fk" FOREIGN KEY ("source_template_unit_id") REFERENCES "public"."organization_template_units"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
279
+ ALTER TABLE "positions" ADD CONSTRAINT "positions_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
280
+ ALTER TABLE "positions" ADD CONSTRAINT "positions_company_id_project_id_projects_company_id_id_fk" FOREIGN KEY ("company_id","project_id") REFERENCES "public"."projects"("company_id","id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
281
+ ALTER TABLE "positions" ADD CONSTRAINT "positions_source_template_position_id_organization_template_positions_id_fk" FOREIGN KEY ("source_template_position_id") REFERENCES "public"."organization_template_positions"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
282
+ ALTER TABLE "project_organization_unit_members" ADD CONSTRAINT "project_organization_unit_members_tree_id_scope_type_company_id_project_id_organization_trees_id_scope_type_company_id_project_id_fk" FOREIGN KEY ("tree_id","scope_type","company_id","project_id") REFERENCES "public"."organization_trees"("id","scope_type","company_id","project_id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
283
+ ALTER TABLE "project_organization_unit_members" ADD CONSTRAINT "project_organization_unit_members_tree_id_organization_unit_id_organization_units_tree_id_id_fk" FOREIGN KEY ("tree_id","organization_unit_id") REFERENCES "public"."organization_units"("tree_id","id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
284
+ ALTER TABLE "project_organization_unit_members" ADD CONSTRAINT "project_organization_unit_members_project_id_user_id_project_members_project_id_user_id_fk" FOREIGN KEY ("project_id","user_id") REFERENCES "public"."project_members"("project_id","user_id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
285
+ ALTER TABLE "project_position_members" ADD CONSTRAINT "project_position_members_position_id_scope_type_company_id_project_id_positions_id_scope_type_company_id_project_id_fk" FOREIGN KEY ("position_id","scope_type","company_id","project_id") REFERENCES "public"."positions"("id","scope_type","company_id","project_id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
286
+ ALTER TABLE "project_position_members" ADD CONSTRAINT "project_position_members_project_id_user_id_project_members_project_id_user_id_fk" FOREIGN KEY ("project_id","user_id") REFERENCES "public"."project_members"("project_id","user_id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
287
+ CREATE UNIQUE INDEX "company_organization_members_leader_uq" ON "company_organization_unit_members" USING btree ("organization_unit_id") WHERE "company_organization_unit_members"."duty" = 'leader';--> statement-breakpoint
288
+ CREATE INDEX "company_organization_members_user_idx" ON "company_organization_unit_members" USING btree ("company_id","user_id");--> statement-breakpoint
289
+ CREATE INDEX "company_position_members_position_idx" ON "company_position_members" USING btree ("position_id");--> statement-breakpoint
290
+ CREATE UNIQUE INDEX "organization_template_positions_version_name_uq" ON "organization_template_positions" USING btree ("template_id","template_version","name_key");--> statement-breakpoint
291
+ CREATE UNIQUE INDEX "organization_template_positions_version_code_uq" ON "organization_template_positions" USING btree ("template_id","template_version","code_key");--> statement-breakpoint
292
+ CREATE UNIQUE INDEX "organization_template_units_version_code_uq" ON "organization_template_units" USING btree ("template_id","template_version","code_key");--> statement-breakpoint
293
+ CREATE UNIQUE INDEX "organization_template_units_root_name_uq" ON "organization_template_units" USING btree ("template_id","template_version","name_key") WHERE "organization_template_units"."parent_id" IS NULL;--> statement-breakpoint
294
+ CREATE UNIQUE INDEX "organization_template_units_parent_name_uq" ON "organization_template_units" USING btree ("template_id","template_version","parent_id","name_key") WHERE "organization_template_units"."parent_id" IS NOT NULL;--> statement-breakpoint
295
+ CREATE UNIQUE INDEX "organization_templates_company_name_key_uq" ON "organization_templates" USING btree ("company_id","name_key");--> statement-breakpoint
296
+ CREATE UNIQUE INDEX "organization_templates_company_default_uq" ON "organization_templates" USING btree ("company_id") WHERE "organization_templates"."status" = 'active' AND "organization_templates"."is_default" = true;--> statement-breakpoint
297
+ CREATE UNIQUE INDEX "organization_trees_company_scope_uq" ON "organization_trees" USING btree ("company_id") WHERE "organization_trees"."scope_type" = 'company';--> statement-breakpoint
298
+ CREATE UNIQUE INDEX "organization_trees_project_scope_uq" ON "organization_trees" USING btree ("project_id") WHERE "organization_trees"."scope_type" = 'project';--> statement-breakpoint
299
+ CREATE UNIQUE INDEX "organization_units_tree_code_key_uq" ON "organization_units" USING btree ("tree_id","code_key");--> statement-breakpoint
300
+ CREATE UNIQUE INDEX "organization_units_root_name_key_uq" ON "organization_units" USING btree ("tree_id","name_key") WHERE "organization_units"."parent_id" IS NULL;--> statement-breakpoint
301
+ CREATE UNIQUE INDEX "organization_units_parent_name_key_uq" ON "organization_units" USING btree ("tree_id","parent_id","name_key") WHERE "organization_units"."parent_id" IS NOT NULL;--> statement-breakpoint
302
+ CREATE INDEX "organization_units_tree_parent_sort_idx" ON "organization_units" USING btree ("tree_id","parent_id","sort","id");--> statement-breakpoint
303
+ CREATE UNIQUE INDEX "positions_company_name_key_uq" ON "positions" USING btree ("company_id","name_key") WHERE "positions"."scope_type" = 'company';--> statement-breakpoint
304
+ CREATE UNIQUE INDEX "positions_company_code_key_uq" ON "positions" USING btree ("company_id","code_key") WHERE "positions"."scope_type" = 'company';--> statement-breakpoint
305
+ CREATE UNIQUE INDEX "positions_project_name_key_uq" ON "positions" USING btree ("project_id","name_key") WHERE "positions"."scope_type" = 'project';--> statement-breakpoint
306
+ CREATE UNIQUE INDEX "positions_project_code_key_uq" ON "positions" USING btree ("project_id","code_key") WHERE "positions"."scope_type" = 'project';--> statement-breakpoint
307
+ CREATE INDEX "positions_scope_created_idx" ON "positions" USING btree ("scope_type","company_id","project_id","created_at","id");--> statement-breakpoint
308
+ CREATE UNIQUE INDEX "project_organization_members_leader_uq" ON "project_organization_unit_members" USING btree ("organization_unit_id") WHERE "project_organization_unit_members"."duty" = 'leader';--> statement-breakpoint
309
+ CREATE INDEX "project_organization_members_user_idx" ON "project_organization_unit_members" USING btree ("project_id","user_id");--> statement-breakpoint
310
+ CREATE INDEX "project_position_members_position_idx" ON "project_position_members" USING btree ("position_id");--> statement-breakpoint
311
+ ALTER TABLE "companies" ADD CONSTRAINT "companies_parent_company_id_companies_id_fk" FOREIGN KEY ("parent_company_id") REFERENCES "public"."companies"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
312
+ CREATE UNIQUE INDEX "companies_root_name_key_uq" ON "companies" USING btree ("name_key") WHERE "companies"."parent_company_id" IS NULL;--> statement-breakpoint
313
+ CREATE UNIQUE INDEX "companies_parent_name_key_uq" ON "companies" USING btree ("parent_company_id","name_key") WHERE "companies"."parent_company_id" IS NOT NULL;--> statement-breakpoint
314
+ CREATE UNIQUE INDEX "companies_code_normalized_uq" ON "companies" USING btree (lower(normalize(btrim("code"), NFKC)));--> statement-breakpoint
315
+ CREATE UNIQUE INDEX "projects_company_code_normalized_uq" ON "projects" USING btree ("company_id",lower(normalize(btrim("code"), NFKC)));--> statement-breakpoint
316
+ ALTER TABLE "companies" DROP CONSTRAINT "companies_code_unique";--> statement-breakpoint
317
+ ALTER TABLE "projects" DROP CONSTRAINT "projects_company_code_uq";--> statement-breakpoint
318
+ ALTER TABLE "companies" ADD CONSTRAINT "companies_name_key_normalized" CHECK ("companies"."name_key" = lower(normalize(btrim("companies"."name"), NFKC)));--> statement-breakpoint
319
+ ALTER TABLE "companies" ADD CONSTRAINT "companies_sort_range" CHECK ("companies"."sort" BETWEEN 0 AND 999999999);--> statement-breakpoint
320
+ INSERT INTO "organization_trees" (
321
+ "scope_type",
322
+ "company_id",
323
+ "project_id",
324
+ "backfill_batch_key"
325
+ )
326
+ SELECT
327
+ 'company',
328
+ company."id",
329
+ NULL,
330
+ 'organization-v1-20260916'
331
+ FROM "companies" AS company
332
+ WHERE NOT EXISTS (
333
+ SELECT 1
334
+ FROM "organization_trees" AS tree
335
+ WHERE tree."scope_type" = 'company'
336
+ AND tree."company_id" = company."id"
337
+ )
338
+ ON CONFLICT DO NOTHING;--> statement-breakpoint
339
+ INSERT INTO "organization_trees" (
340
+ "scope_type",
341
+ "company_id",
342
+ "project_id",
343
+ "backfill_batch_key"
344
+ )
345
+ SELECT
346
+ 'project',
347
+ project."company_id",
348
+ project."id",
349
+ 'organization-v1-20260916'
350
+ FROM "projects" AS project
351
+ WHERE NOT EXISTS (
352
+ SELECT 1
353
+ FROM "organization_trees" AS tree
354
+ WHERE tree."scope_type" = 'project'
355
+ AND tree."project_id" = project."id"
356
+ )
357
+ ON CONFLICT DO NOTHING;
@@ -0,0 +1,25 @@
1
+ CREATE TYPE "public"."company_member_invitation_status" AS ENUM('pending', 'accepted', 'revoked');--> statement-breakpoint
2
+ CREATE TABLE "company_member_invitations" (
3
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
4
+ "company_id" uuid NOT NULL,
5
+ "token_digest" varchar(64) NOT NULL,
6
+ "status" "company_member_invitation_status" DEFAULT 'pending' NOT NULL,
7
+ "created_by_user_id" uuid NOT NULL,
8
+ "accepted_by_user_id" uuid,
9
+ "expires_at" timestamp with time zone NOT NULL,
10
+ "accepted_at" timestamp with time zone,
11
+ "revoked_at" timestamp with time zone,
12
+ "version" integer DEFAULT 1 NOT NULL,
13
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
14
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
15
+ CONSTRAINT "company_member_invitations_token_digest_length" CHECK (char_length("company_member_invitations"."token_digest") = 64),
16
+ CONSTRAINT "company_member_invitations_version_positive" CHECK ("company_member_invitations"."version" > 0),
17
+ CONSTRAINT "company_member_invitations_state_check" CHECK (("company_member_invitations"."status" = 'pending' AND "company_member_invitations"."accepted_by_user_id" IS NULL AND "company_member_invitations"."accepted_at" IS NULL AND "company_member_invitations"."revoked_at" IS NULL) OR ("company_member_invitations"."status" = 'accepted' AND "company_member_invitations"."accepted_by_user_id" IS NOT NULL AND "company_member_invitations"."accepted_at" IS NOT NULL AND "company_member_invitations"."revoked_at" IS NULL) OR ("company_member_invitations"."status" = 'revoked' AND "company_member_invitations"."accepted_by_user_id" IS NULL AND "company_member_invitations"."accepted_at" IS NULL AND "company_member_invitations"."revoked_at" IS NOT NULL))
18
+ );
19
+ --> statement-breakpoint
20
+ ALTER TABLE "company_member_invitations" ADD CONSTRAINT "company_member_invitations_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
21
+ ALTER TABLE "company_member_invitations" ADD CONSTRAINT "company_member_invitations_created_by_user_id_users_id_fk" FOREIGN KEY ("created_by_user_id") REFERENCES "public"."users"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
22
+ ALTER TABLE "company_member_invitations" ADD CONSTRAINT "company_member_invitations_accepted_by_user_id_users_id_fk" FOREIGN KEY ("accepted_by_user_id") REFERENCES "public"."users"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
23
+ CREATE UNIQUE INDEX "company_member_invitations_token_digest_uq" ON "company_member_invitations" USING btree ("token_digest");--> statement-breakpoint
24
+ CREATE INDEX "company_member_invitations_company_status_created_idx" ON "company_member_invitations" USING btree ("company_id","status","created_at","id");--> statement-breakpoint
25
+ CREATE INDEX "company_member_invitations_pending_expires_idx" ON "company_member_invitations" USING btree ("expires_at") WHERE "company_member_invitations"."status" = 'pending';