cabloy 5.1.102 → 5.1.103

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 (127) hide show
  1. package/.cabloy-version +1 -1
  2. package/CHANGELOG.md +29 -0
  3. package/CLAUDE.local.md +4 -0
  4. package/cabloy-docs/.vitepress/config.mjs +3 -0
  5. package/cabloy-docs/backend/file-guide.md +148 -0
  6. package/cabloy-docs/backend/image-guide.md +40 -40
  7. package/cabloy-docs/backend/jwt-guide.md +21 -0
  8. package/cabloy-docs/frontend/file-guide.md +147 -0
  9. package/cabloy-docs/frontend/image-guide.md +18 -9
  10. package/cabloy-docs/frontend/model-state-guide.md +12 -0
  11. package/cabloy-docs/frontend/use-state-data-best-practices.md +54 -0
  12. package/cabloy-docs/fullstack/file-workflow.md +135 -0
  13. package/cabloy-docs/fullstack/image-workflow.md +12 -3
  14. package/package.json +1 -1
  15. package/vona/packages-vona/vona/package.json +1 -1
  16. package/vona/src/suite/a-training/modules/training-record/src/.metadata/index.ts +30 -4
  17. package/vona/src/suite/a-training/modules/training-record/src/bean/fileScene.dossierFile.ts +1 -1
  18. package/vona/src/suite/a-training/modules/training-record/src/bean/imageScene.sceneImage.ts +1 -0
  19. package/vona/src/suite/a-training/modules/training-record/src/dto/recordSelectResItem.tsx +8 -6
  20. package/vona/src/suite/a-training/modules/training-record/src/dto/recordView.tsx +8 -6
  21. package/vona/src/suite/a-training/modules/training-record/src/index.ts +0 -1
  22. package/vona/src/suite/a-training/modules/training-record/src/lib/index.ts +0 -1
  23. package/vona/src/suite/a-training/modules/training-record/test/record.test.ts +10 -12
  24. package/vona/src/suite/a-training/modules/training-student/src/bean/imageScene.studentImage.ts +1 -0
  25. package/vona/src/suite/a-training/modules/training-student/src/dto/detailRecordBase.tsx +9 -10
  26. package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +2 -2
  27. package/vona/src/suite-vendor/a-file/modules/a-file/package.json +3 -2
  28. package/vona/src/suite-vendor/a-file/modules/a-file/src/.metadata/index.ts +155 -35
  29. package/vona/src/suite-vendor/a-file/modules/a-file/src/bean/bean.file.ts +283 -54
  30. package/vona/src/suite-vendor/a-file/modules/a-file/src/bean/bean.fileUploadPolicy.ts +46 -63
  31. package/vona/src/suite-vendor/a-file/modules/a-file/src/bean/meta.index.ts +12 -0
  32. package/vona/src/suite-vendor/a-file/modules/a-file/src/bean/meta.redlock.ts +1 -1
  33. package/vona/src/suite-vendor/a-file/modules/a-file/src/bean/meta.version.ts +3 -0
  34. package/vona/src/suite-vendor/a-file/modules/a-file/src/bean/schedule.fileDraftPrune.ts +29 -0
  35. package/vona/src/suite-vendor/a-file/modules/a-file/src/bean/serializerTransform.resolveView.ts +45 -0
  36. package/vona/src/suite-vendor/a-file/modules/a-file/src/bean/serializerTransform.resolveViews.ts +45 -0
  37. package/vona/src/suite-vendor/a-file/modules/a-file/src/config/config.ts +6 -0
  38. package/vona/src/suite-vendor/a-file/modules/a-file/src/controller/file.ts +64 -56
  39. package/vona/src/suite-vendor/a-file/modules/a-file/src/dto/fileDirectUploadFinalizeRequest.ts +13 -0
  40. package/vona/src/suite-vendor/a-file/modules/a-file/src/dto/fileDirectUploadFinalizeResponse.ts +10 -0
  41. package/vona/src/suite-vendor/a-file/modules/a-file/src/dto/fileDirectUploadRequest.ts +0 -3
  42. package/vona/src/suite-vendor/a-file/modules/a-file/src/dto/fileDirectUploadResponse.ts +2 -14
  43. package/vona/src/suite-vendor/a-file/modules/a-file/src/dto/fileDownloadRequest.ts +3 -0
  44. package/vona/src/suite-vendor/a-file/modules/a-file/src/dto/fileUploadPolicyResponse.ts +3 -0
  45. package/vona/src/suite-vendor/a-file/modules/a-file/src/dto/fileUploadResponse.ts +0 -25
  46. package/vona/src/{suite/a-training/modules/training-record/src/dto/recordDossierFileView.ts → suite-vendor/a-file/modules/a-file/src/dto/fileView.ts} +3 -15
  47. package/vona/src/suite-vendor/a-file/modules/a-file/src/entity/file.ts +10 -0
  48. package/vona/src/suite-vendor/a-file/modules/a-file/src/lib/fileUploadUrl.ts +329 -0
  49. package/vona/src/suite-vendor/a-file/modules/a-file/src/lib/index.ts +1 -0
  50. package/vona/src/suite-vendor/a-file/modules/a-file/src/types/file.ts +51 -10
  51. package/vona/src/suite-vendor/a-file/modules/a-file/src/types/fileProvider.ts +8 -3
  52. package/vona/src/suite-vendor/a-file/modules/a-file/src/types/fileScene.ts +1 -1
  53. package/vona/src/suite-vendor/a-file/modules/file-cloudflare/package.json +1 -1
  54. package/vona/src/suite-vendor/a-file/modules/file-cloudflare/src/bean/fileProvider.cloudflare.ts +12 -4
  55. package/vona/src/suite-vendor/a-file/modules/file-cloudflare/src/service/fileCloudflare.ts +52 -18
  56. package/vona/src/suite-vendor/a-file/modules/file-native/package.json +1 -1
  57. package/vona/src/suite-vendor/a-file/modules/file-native/src/bean/fileProvider.native.ts +5 -5
  58. package/vona/src/suite-vendor/a-file/modules/file-native/src/service/fileNative.ts +7 -8
  59. package/vona/src/suite-vendor/a-file/package.json +4 -4
  60. package/vona/src/suite-vendor/a-image/modules/a-image/package.json +1 -1
  61. package/vona/src/suite-vendor/a-image/modules/a-image/src/.metadata/index.ts +16 -19
  62. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/bean.image.ts +99 -74
  63. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/bean.imageUploadPolicy.ts +28 -68
  64. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/meta.version.ts +1 -1
  65. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/serializerTransform.resolveView.ts +3 -0
  66. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/serializerTransform.resolveViews.ts +3 -0
  67. package/vona/src/suite-vendor/a-image/modules/a-image/src/config/config.ts +4 -0
  68. package/vona/src/suite-vendor/a-image/modules/a-image/src/controller/image.ts +78 -34
  69. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageDeliveryRequest.ts +3 -0
  70. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageDirectUploadRequest.ts +0 -3
  71. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageDirectUploadResponse.ts +1 -27
  72. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageUploadPolicyResponse.ts +6 -0
  73. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageUploadResponse.ts +2 -36
  74. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageUploadUrlRequest.ts +0 -3
  75. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageView.ts +4 -27
  76. package/vona/src/suite-vendor/a-image/modules/a-image/src/entity/image.ts +1 -1
  77. package/vona/src/suite-vendor/a-image/modules/a-image/src/types/image.ts +36 -29
  78. package/vona/src/suite-vendor/a-image/modules/a-image/src/types/imageProvider.ts +4 -4
  79. package/vona/src/suite-vendor/a-image/modules/a-image/src/types/imageScene.ts +1 -0
  80. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/package.json +1 -1
  81. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/bean/imageProvider.cloudflare.ts +8 -11
  82. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/lib/cloudflareImageUrl.ts +4 -16
  83. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/service/imageCloudflare.ts +17 -16
  84. package/vona/src/suite-vendor/a-image/modules/image-native/package.json +2 -6
  85. package/vona/src/suite-vendor/a-image/modules/image-native/src/.metadata/index.ts +0 -37
  86. package/vona/src/suite-vendor/a-image/modules/image-native/src/bean/imageProvider.native.ts +13 -36
  87. package/vona/src/suite-vendor/a-image/modules/image-native/src/service/imageNative.ts +100 -113
  88. package/vona/src/suite-vendor/a-image/package.json +1 -1
  89. package/vona/src/suite-vendor/a-vona/modules/a-jwt/package.json +1 -1
  90. package/vona/src/suite-vendor/a-vona/modules/a-jwt/src/config/config.ts +3 -1
  91. package/vona/src/suite-vendor/a-vona/modules/a-jwt/src/service/jwtClient.ts +9 -4
  92. package/vona/src/suite-vendor/a-vona/modules/a-upload/package.json +1 -1
  93. package/vona/src/suite-vendor/a-vona/modules/a-upload/src/bean/interceptor.upload.ts +113 -64
  94. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  95. package/zova/packages-zova/zova/package.json +2 -2
  96. package/zova/src/suite/a-home/modules/home-api/src/api/openapi/schemas.ts +50 -12
  97. package/zova/src/suite/a-home/modules/home-api/src/api/openapi/types.ts +610 -114
  98. package/zova/src/suite/a-home/modules/home-passport/src/model/passport.ts +44 -1
  99. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +50 -12
  100. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +610 -114
  101. package/zova/src/suite/cabloy-basic/modules/basic-file/src/.metadata/index.ts +16 -12
  102. package/zova/src/suite/cabloy-basic/modules/basic-file/src/api/file.ts +25 -25
  103. package/zova/src/suite/cabloy-basic/modules/basic-file/src/api/openapi/schemas.ts +18 -24
  104. package/zova/src/suite/cabloy-basic/modules/basic-file/src/api/openapi/types.ts +228 -291
  105. package/zova/src/suite/cabloy-basic/modules/basic-file/src/apiSchema/file.ts +5 -5
  106. package/zova/src/suite/cabloy-basic/modules/basic-file/src/bean/tableCell.file.tsx +23 -5
  107. package/zova/src/suite/cabloy-basic/modules/basic-file/src/component/formFieldFile/controller.tsx +72 -43
  108. package/zova/src/suite/cabloy-basic/modules/basic-file/src/lib/file.ts +22 -4
  109. package/zova/src/suite/cabloy-basic/modules/basic-image/src/.metadata/index.ts +16 -42
  110. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/image.ts +5 -25
  111. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/schemas.ts +10 -24
  112. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/types.ts +216 -333
  113. package/zova/src/suite/cabloy-basic/modules/basic-image/src/apiSchema/image.ts +0 -5
  114. package/zova/src/suite/cabloy-basic/modules/basic-image/src/bean/tableCell.image.tsx +38 -12
  115. package/zova/src/suite/cabloy-basic/modules/basic-image/src/component/formFieldImage/controller.tsx +79 -32
  116. package/zova/src/suite/cabloy-basic/modules/basic-image/src/lib/preview.ts +22 -4
  117. package/zova/src/suite/cabloy-basic/modules/basic-image/src/types/image.ts +3 -4
  118. package/zova/src/suite-vendor/a-zova/modules/a-model/package.json +1 -1
  119. package/zova/src/suite-vendor/a-zova/modules/a-model/src/lib/utils.ts +29 -1
  120. package/zova/src/suite-vendor/a-zova/modules/a-model/src/types/query.ts +2 -2
  121. package/zova/src/suite-vendor/a-zova/package.json +2 -2
  122. package/vona/src/suite/a-training/modules/training-record/src/lib/resolveDossierFiles.ts +0 -34
  123. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageUploadTokenRequest.ts +0 -24
  124. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageUploadTokenResponse.ts +0 -16
  125. package/vona/src/suite-vendor/a-image/modules/image-native/src/controller/image.ts +0 -57
  126. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/imageNativeImage.ts +0 -31
  127. package/zova/src/suite/cabloy-basic/modules/basic-image/src/apiSchema/imageNativeImage.ts +0 -13
@@ -9,7 +9,7 @@ import type {
9
9
 
10
10
  import { combineQueries, isNil } from '@cabloy/utils';
11
11
  import { SchemaObject } from 'openapi3-ts/oas31';
12
- import { BeanModelBase, Model } from 'zova-module-a-model';
12
+ import { $QueryEnsureFresh, $QueryGetFresh, BeanModelBase, Model } from 'zova-module-a-model';
13
13
  import {
14
14
  IPermissionHintGeneral,
15
15
  IResourceFormActionRowNameRecord,
@@ -81,6 +81,41 @@ export class ModelPassport extends BeanModelBase {
81
81
  });
82
82
  }
83
83
 
84
+ getTempAuthToken(options: { path?: string; staleTime: number }) {
85
+ if (!process.env.CLIENT || !this.isAuthenticated) return;
86
+ return this.$useStateData({
87
+ queryKey: ['tempAuthToken', options.path],
88
+ queryFn: async () => {
89
+ return await this.$api.homeUserPassport.createTempAuthToken(undefined, {
90
+ query: { path: options.path },
91
+ });
92
+ },
93
+ staleTime: options.staleTime,
94
+ meta: {
95
+ disableSuspenseOnInit: true,
96
+ persister: false,
97
+ ssr: { dehydrate: false },
98
+ },
99
+ });
100
+ }
101
+
102
+ getFreshTempAuthToken(options: { path?: string; staleTime: number }): string | undefined {
103
+ return $QueryGetFresh(
104
+ () => this.getTempAuthToken(options),
105
+ query => this._isTempAuthTokenExpired(query.data, query.dataUpdatedAt, options.staleTime),
106
+ );
107
+ }
108
+
109
+ async ensureFreshTempAuthToken(options: {
110
+ path?: string;
111
+ staleTime: number;
112
+ }): Promise<string | undefined> {
113
+ return await $QueryEnsureFresh(
114
+ () => this.getTempAuthToken(options),
115
+ query => this._isTempAuthTokenExpired(query.data, query.dataUpdatedAt, options.staleTime),
116
+ );
117
+ }
118
+
84
119
  getOauthLoginUrl(module: string, providerName: string, clientName?: string): string {
85
120
  const apiPath = this.sys.util.apiActionPathTranslate(ApiApiHomeUserPassportloginOauthPath, {
86
121
  module,
@@ -160,6 +195,14 @@ export class ModelPassport extends BeanModelBase {
160
195
  return this.passport;
161
196
  }
162
197
 
198
+ private _isTempAuthTokenExpired(
199
+ token: string | undefined,
200
+ dataUpdatedAt: number,
201
+ staleTime: number,
202
+ ) {
203
+ return token === undefined || dataUpdatedAt + staleTime <= Date.now();
204
+ }
205
+
163
206
  private _setLocaleTz() {
164
207
  const user = this.passport?.user;
165
208
  if (!user) return;
@@ -67,10 +67,8 @@ export type ApiSchemaTrainingRecordDtoRecordSelectResItemPartial =
67
67
  Partial<ApiSchemaTrainingRecordDtoRecordSelectResItem>;
68
68
  export type ApiSchemaAImageDtoImageView = components['schemas']['a-image.dto.imageView'];
69
69
  export type ApiSchemaAImageDtoImageViewPartial = Partial<ApiSchemaAImageDtoImageView>;
70
- export type ApiSchemaAImageDtoImageTransformOptions =
71
- components['schemas']['a-image.dto.imageTransformOptions'];
72
- export type ApiSchemaAImageDtoImageTransformOptionsPartial =
73
- Partial<ApiSchemaAImageDtoImageTransformOptions>;
70
+ export type ApiSchemaAFileDtoFileView = components['schemas']['a-file.dto.fileView'];
71
+ export type ApiSchemaAFileDtoFileViewPartial = Partial<ApiSchemaAFileDtoFileView>;
74
72
  export type ApiSchemaTrainingRecordDtoRecordView_2d063d28bc7243bed02ebd8bddf1212a93c6305b_425dbecccd52e19e24888f99e1b1670233afa875 =
75
73
  components['schemas']['training-record.dto.recordView_2d063d28bc7243bed02ebd8bddf1212a93c6305b_425dbecccd52e19e24888f99e1b1670233afa875'];
76
74
  export type ApiSchemaTrainingRecordDtoRecordView_2d063d28bc7243bed02ebd8bddf1212a93c6305b_425dbecccd52e19e24888f99e1b1670233afa875Partial =
@@ -111,14 +109,46 @@ export type ApiSchemaTrainingStudentDtoStudentSummary_2d063d28bc7243bed02ebd8bdd
111
109
  components['schemas']['training-student.dto.studentSummary_2d063d28bc7243bed02ebd8bddf1212a93c6305b'];
112
110
  export type ApiSchemaTrainingStudentDtoStudentSummary_2d063d28bc7243bed02ebd8bddf1212a93c6305bPartial =
113
111
  Partial<ApiSchemaTrainingStudentDtoStudentSummary_2d063d28bc7243bed02ebd8bddf1212a93c6305b>;
114
- export type ApiSchemaAImageDtoImageUploadTokenResponse =
115
- components['schemas']['a-image.dto.imageUploadTokenResponse'];
116
- export type ApiSchemaAImageDtoImageUploadTokenResponsePartial =
117
- Partial<ApiSchemaAImageDtoImageUploadTokenResponse>;
118
- export type ApiSchemaAImageDtoImageUploadTokenRequest =
119
- components['schemas']['a-image.dto.imageUploadTokenRequest'];
120
- export type ApiSchemaAImageDtoImageUploadTokenRequestPartial =
121
- Partial<ApiSchemaAImageDtoImageUploadTokenRequest>;
112
+ export type ApiSchemaAFileDtoFileUploadPolicyResponse =
113
+ components['schemas']['a-file.dto.fileUploadPolicyResponse'];
114
+ export type ApiSchemaAFileDtoFileUploadPolicyResponsePartial =
115
+ Partial<ApiSchemaAFileDtoFileUploadPolicyResponse>;
116
+ export type ApiSchemaAFileDtoFileUploadPolicyRequest =
117
+ components['schemas']['a-file.dto.fileUploadPolicyRequest'];
118
+ export type ApiSchemaAFileDtoFileUploadPolicyRequestPartial =
119
+ Partial<ApiSchemaAFileDtoFileUploadPolicyRequest>;
120
+ export type ApiSchemaAFileDtoFileUploadResponse =
121
+ components['schemas']['a-file.dto.fileUploadResponse'];
122
+ export type ApiSchemaAFileDtoFileUploadResponsePartial =
123
+ Partial<ApiSchemaAFileDtoFileUploadResponse>;
124
+ export type ApiSchemaAFileDtoFileDirectUploadResponse =
125
+ components['schemas']['a-file.dto.fileDirectUploadResponse'];
126
+ export type ApiSchemaAFileDtoFileDirectUploadResponsePartial =
127
+ Partial<ApiSchemaAFileDtoFileDirectUploadResponse>;
128
+ export type ApiSchemaAFileDtoFileDirectUploadRequest =
129
+ components['schemas']['a-file.dto.fileDirectUploadRequest'];
130
+ export type ApiSchemaAFileDtoFileDirectUploadRequestPartial =
131
+ Partial<ApiSchemaAFileDtoFileDirectUploadRequest>;
132
+ export type ApiSchemaAFileDtoFileDirectUploadFinalizeResponse =
133
+ components['schemas']['a-file.dto.fileDirectUploadFinalizeResponse'];
134
+ export type ApiSchemaAFileDtoFileDirectUploadFinalizeResponsePartial =
135
+ Partial<ApiSchemaAFileDtoFileDirectUploadFinalizeResponse>;
136
+ export type ApiSchemaAFileDtoFileDirectUploadFinalizeRequest =
137
+ components['schemas']['a-file.dto.fileDirectUploadFinalizeRequest'];
138
+ export type ApiSchemaAFileDtoFileDirectUploadFinalizeRequestPartial =
139
+ Partial<ApiSchemaAFileDtoFileDirectUploadFinalizeRequest>;
140
+ export type ApiSchemaAFileDtoFileUploadUrlRequest =
141
+ components['schemas']['a-file.dto.fileUploadUrlRequest'];
142
+ export type ApiSchemaAFileDtoFileUploadUrlRequestPartial =
143
+ Partial<ApiSchemaAFileDtoFileUploadUrlRequest>;
144
+ export type ApiSchemaAImageDtoImageUploadPolicyResponse =
145
+ components['schemas']['a-image.dto.imageUploadPolicyResponse'];
146
+ export type ApiSchemaAImageDtoImageUploadPolicyResponsePartial =
147
+ Partial<ApiSchemaAImageDtoImageUploadPolicyResponse>;
148
+ export type ApiSchemaAImageDtoImageUploadPolicyRequest =
149
+ components['schemas']['a-image.dto.imageUploadPolicyRequest'];
150
+ export type ApiSchemaAImageDtoImageUploadPolicyRequestPartial =
151
+ Partial<ApiSchemaAImageDtoImageUploadPolicyRequest>;
122
152
  export type ApiSchemaAImageDtoImageUploadResponse =
123
153
  components['schemas']['a-image.dto.imageUploadResponse'];
124
154
  export type ApiSchemaAImageDtoImageUploadResponsePartial =
@@ -131,6 +161,14 @@ export type ApiSchemaAImageDtoImageDirectUploadRequest =
131
161
  components['schemas']['a-image.dto.imageDirectUploadRequest'];
132
162
  export type ApiSchemaAImageDtoImageDirectUploadRequestPartial =
133
163
  Partial<ApiSchemaAImageDtoImageDirectUploadRequest>;
164
+ export type ApiSchemaAImageDtoImageDirectUploadFinalizeResponse =
165
+ components['schemas']['a-image.dto.imageDirectUploadFinalizeResponse'];
166
+ export type ApiSchemaAImageDtoImageDirectUploadFinalizeResponsePartial =
167
+ Partial<ApiSchemaAImageDtoImageDirectUploadFinalizeResponse>;
168
+ export type ApiSchemaAImageDtoImageDirectUploadFinalizeRequest =
169
+ components['schemas']['a-image.dto.imageDirectUploadFinalizeRequest'];
170
+ export type ApiSchemaAImageDtoImageDirectUploadFinalizeRequestPartial =
171
+ Partial<ApiSchemaAImageDtoImageDirectUploadFinalizeRequest>;
134
172
  export type ApiSchemaAImageDtoImageUploadUrlRequest =
135
173
  components['schemas']['a-image.dto.imageUploadUrlRequest'];
136
174
  export type ApiSchemaAImageDtoImageUploadUrlRequestPartial =