@social-mail/social-mail-web-server 1.7.521 → 1.7.523

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 (35) hide show
  1. package/dist/server/model/SocialMailContext.d.ts +2 -0
  2. package/dist/server/model/SocialMailContext.d.ts.map +1 -1
  3. package/dist/server/model/SocialMailContext.js +2 -0
  4. package/dist/server/model/SocialMailContext.js.map +1 -1
  5. package/dist/server/model/entities/User.d.ts +3 -3
  6. package/dist/server/model/entities/User.d.ts.map +1 -1
  7. package/dist/server/model/entities/UserGroupMember.d.ts +16 -0
  8. package/dist/server/model/entities/UserGroupMember.d.ts.map +1 -0
  9. package/dist/server/model/entities/{UserGroupMembership.js → UserGroupMember.js} +18 -5
  10. package/dist/server/model/entities/UserGroupMember.js.map +1 -0
  11. package/dist/server/model/events/AppFileEvents.d.ts +2 -0
  12. package/dist/server/model/events/AppFileEvents.d.ts.map +1 -1
  13. package/dist/server/model/events/AppFileEvents.js +8 -11
  14. package/dist/server/model/events/AppFileEvents.js.map +1 -1
  15. package/dist/server/seed/ui/seed-ui.js +1 -1
  16. package/dist/server/seed/ui/seed-ui.js.map +1 -1
  17. package/dist/server/services/UserInfoProvider.d.ts.map +1 -1
  18. package/dist/server/services/UserInfoProvider.js +84 -23
  19. package/dist/server/services/UserInfoProvider.js.map +1 -1
  20. package/dist/server/services/files/FilePathService.d.ts +7 -0
  21. package/dist/server/services/files/FilePathService.d.ts.map +1 -0
  22. package/dist/server/services/files/FilePathService.js +42 -0
  23. package/dist/server/services/files/FilePathService.js.map +1 -0
  24. package/dist/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +1 -1
  26. package/src/server/model/SocialMailContext.ts +3 -0
  27. package/src/server/model/entities/User.ts +3 -3
  28. package/src/server/model/entities/{UserGroupMembership.ts → UserGroupMember.ts} +14 -3
  29. package/src/server/model/events/AppFileEvents.ts +9 -17
  30. package/src/server/seed/ui/seed-ui.ts +1 -1
  31. package/src/server/services/UserInfoProvider.ts +6 -2
  32. package/src/server/services/files/FilePathService.ts +36 -0
  33. package/dist/server/model/entities/UserGroupMembership.d.ts +0 -8
  34. package/dist/server/model/entities/UserGroupMembership.d.ts.map +0 -1
  35. package/dist/server/model/entities/UserGroupMembership.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-web-server",
3
- "version": "1.7.521",
3
+ "version": "1.7.523",
4
4
  "description": "## Phase 1",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -78,6 +78,7 @@ import ThreadParticipant from "./entities/ThreadParticipant.js";
78
78
  import { WebSiteChannelDomain } from "./entities/WebSiteChannelDomain.js";
79
79
  import GeoIPBlock from "./entities/GeoIPBlock.js";
80
80
  import AppTempFile from "./entities/AppTempFile.js";
81
+ import UserGroupMember from "./entities/UserGroupMember.js";
81
82
 
82
83
  @RegisterScoped
83
84
  export default class SocialMailContext extends EntityContext {
@@ -224,6 +225,8 @@ export default class SocialMailContext extends EntityContext {
224
225
 
225
226
  public users = this.model.register(User);
226
227
 
228
+ public userGroupMembers = this.model.register(UserGroupMember);
229
+
227
230
  public userPins = this.model.register(UserPin);
228
231
 
229
232
  public userPushSubscriptions = this.model.register(UserPushSubscription);
@@ -19,7 +19,7 @@ import type AccessToken from "./AccessToken.js";
19
19
  import { RelateTo } from "@entity-access/entity-access/dist/decorators/Relate.js";
20
20
  import type { HostedZoneUser } from "./HostedZone.js";
21
21
  import type { StoreAccount } from "./StoreAccount.js";
22
- import type UserGroupMembership from "./UserGroupMembership.js";
22
+ import type UserGroupMember from "./UserGroupMember.js";
23
23
 
24
24
  export class ChangePassword {
25
25
 
@@ -190,8 +190,8 @@ export class User {
190
190
  closedEmails: Email[];
191
191
  hostedZones: HostedZoneUser[];
192
192
  storeAccount: StoreAccount;
193
- groups: UserGroupMembership[];
194
- groupMembers: UserGroupMembership[];
193
+ groups: UserGroupMember[];
194
+ groupMembers: UserGroupMember[];
195
195
 
196
196
  // [GraphService.toGraph]() {
197
197
  // return {
@@ -1,8 +1,19 @@
1
1
  import Column from "@entity-access/entity-access/dist/decorators/Column.js";
2
- import { RelateTo, RelateToOne } from "@entity-access/entity-access/dist/decorators/Relate.js";
2
+ import { RelateTo } from "@entity-access/entity-access/dist/decorators/Relate.js";
3
3
  import { User } from "./User.js";
4
+ import Table from "@entity-access/entity-access/dist/decorators/Table.js";
4
5
 
5
- export default class UserGroupMembership {
6
+
7
+ /**
8
+ * Every user should be member of it's own user Group. This will reduce
9
+ * query union. Queries will be smaller on runtime.
10
+ *
11
+ * So every query must only check group ownership and no longer need to check
12
+ * user ownership. Being both a key, one to one membership will also be
13
+ * restricted for single entry.
14
+ */
15
+ @Table("UserGroupMembers")
16
+ export default class UserGroupMember {
6
17
  @Column({ dataType: "BigInt", key: true })
7
18
  @RelateTo(User, {
8
19
  property: (x) => x.owner,
@@ -28,4 +39,4 @@ export default class UserGroupMembership {
28
39
  owner: User;
29
40
 
30
41
  group: User;
31
- }
42
+ }
@@ -1,5 +1,5 @@
1
- import EntityEvents, { ForeignKeyFilter } from "@entity-access/entity-access/dist/model/events/EntityEvents.js";
2
- import AppFile, { AppFileAccess } from "../entities/AppFile.js";
1
+ import { ForeignKeyFilter } from "@entity-access/entity-access/dist/model/events/EntityEvents.js";
2
+ import AppFile from "../entities/AppFile.js";
3
3
  import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWithParameter.js";
4
4
  import AuthenticatedEvents from "./AuthenticatedEvents.js";
5
5
  import ChangeEntry from "@entity-access/entity-access/dist/model/changes/ChangeEntry.js";
@@ -17,7 +17,6 @@ import UpdateFolderSize from "../../workflows/storage/files/UpdateFolderSize.js"
17
17
  import FileAccessService from "../../services/files/FileAccessService.js";
18
18
  import WorkflowContext from "@entity-access/entity-access/dist/workflows/WorkflowContext.js";
19
19
  import ExternalQuery from "@entity-access/server-pages/dist/decorators/ExternalQuery.js";
20
- import CacheService from "../../services/cache/CacheService.js";
21
20
  import EmailLogService from "../../services/email-logs/EmailLogService.js";
22
21
  import Page from "@entity-access/server-pages/dist/Page.js";
23
22
  import StoreConfigService from "../../services/store/StoreConfigService.js";
@@ -27,11 +26,8 @@ import { Email } from "../entities/Email.js";
27
26
  import WebSite from "../entities/WebSite.js";
28
27
  import EncryptionService from "../../services/encryption/EncryptionService.js";
29
28
  import SessionSecurity from "@entity-access/server-pages/dist/services/SessionSecurity.js";
30
- import ExternalInvoke from "@entity-access/server-pages/dist/decorators/ExternalInvoke.js";
31
- import FileConversionService from "../../services/convert/FileConversionService.js";
32
- import { TempFileResult } from "@entity-access/server-pages/dist/Content.js";
33
29
  import ChannelEmail from "../entities/ChannelEmail.js";
34
- import Mailbox from "../entities/Mailbox.js";
30
+ import FilePathService from "../../services/files/FilePathService.js";
35
31
 
36
32
  export default class AppFileEvents extends AuthenticatedEvents<AppFile> {
37
33
 
@@ -65,6 +61,9 @@ export default class AppFileEvents extends AuthenticatedEvents<AppFile> {
65
61
  @Inject
66
62
  sessionSecurity: SessionSecurity;
67
63
 
64
+ @Inject
65
+ fps: FilePathService;
66
+
68
67
  @ExternalQuery
69
68
  async storeItemFiles(folderID) {
70
69
  const page = ServiceProvider.resolve(this, Page as any) as Page;
@@ -419,7 +418,7 @@ export default class AppFileEvents extends AuthenticatedEvents<AppFile> {
419
418
  await this.versionService.saveVersion(this.sessionUser, entity);
420
419
  }
421
420
  }
422
- if (entry.isUpdated("parentID") || entry.isUpdated("fileSize")) {
421
+ if (entry.isUpdated("parentID")) {
423
422
  await this.updateFolderSize(entity);
424
423
  }
425
424
  }
@@ -537,14 +536,7 @@ export default class AppFileEvents extends AuthenticatedEvents<AppFile> {
537
536
  }
538
537
  }
539
538
 
540
- private async updateFilePath(entity: AppFile) {
541
- const { parentID, isFolder } = entity;
542
- if (parentID) {
543
- await this.db.appFiles.where(entity, (p) => (x) => x.appFileID === p.appFileID)
544
- .update(void 0, (p) => (x) => ({ path: `${x.parent.path}${Sql.cast.asText(x.appFileID)}/` }));
545
- } else if (isFolder) {
546
- await this.db.appFiles.where(entity, (p) => (x) => x.appFileID === p.appFileID)
547
- .update(void 0, (p) => (x) => ({ path: `${Sql.cast.asText(x.appFileID)}/` }));
548
- }
539
+ private updateFilePath(entity: AppFile) {
540
+ return this.fps.update(entity);
549
541
  }
550
542
  }
@@ -5,7 +5,7 @@ export default async function seedUI(config: DBConfig) {
5
5
  await config.saveVersion(UIPackageConfig, {
6
6
  package: "@social-mail/social-mail-client",
7
7
  view: "dist/web/AppIndex",
8
- version: "1.8.92"
8
+ version: "1.8.103"
9
9
  });
10
10
 
11
11
  await config.saveVersion(WebComponentsPackageConfig, {
@@ -12,12 +12,16 @@ export default class UserSessionProvider extends USP {
12
12
 
13
13
  /** The new scope will not interfere with existing DbContext for current request */
14
14
 
15
- const scope = ServiceProvider.createScope(this);
15
+ using scope = ServiceProvider.createScope(this);
16
16
  const db = scope.resolve(SocialMailContext);
17
17
 
18
18
  const session = await db.loginSessions.where({ userID, sessionID }, (p) => (x) => x.userID === p.userID
19
19
  && x.sessionID === p.sessionID && x.invalid === false)
20
- .include((x) => [x.user.roles, x.user.fileAccessList.forEach((f) => f.file)])
20
+ .include((x) => [
21
+ x.user.roles,
22
+ x.user.fileAccessList.forEach((f) => f.file),
23
+ // x.user.groups.forEach((g) => g.group.fileAccessList.forEach((gf) => gf.file))
24
+ ])
21
25
  .first();
22
26
  if (!session?.user) {
23
27
  return null;
@@ -0,0 +1,36 @@
1
+ import Inject, { RegisterScoped } from "@entity-access/entity-access/dist/di/di.js";
2
+ import AppFile from "../../model/entities/AppFile.js";
3
+ import SocialMailContext from "../../model/SocialMailContext.js";
4
+ import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
5
+
6
+ @RegisterScoped
7
+ export default class FilePathService {
8
+
9
+ @Inject
10
+ db: SocialMailContext;
11
+
12
+ async update(entity: AppFile) {
13
+ const { parentID, isFolder } = entity;
14
+ if (parentID) {
15
+ await this.db.appFiles.where(entity, (p) => (x) => x.appFileID === p.appFileID)
16
+ .update(void 0, (p) => (x) => ({ path: `${x.parent.path}${Sql.cast.asText(x.appFileID)}/` }));
17
+
18
+ } else if (isFolder) {
19
+ await this.db.appFiles.where(entity, (p) => (x) => x.appFileID === p.appFileID)
20
+ .update(void 0, (p) => (x) => ({ path: `${Sql.cast.asText(x.appFileID)}/` }));
21
+ }
22
+
23
+ await this.db.appFiles.where(entity, (p) => (x) => x.parentID === p.appFileID)
24
+ .update(void 0, (p) => (x) => ({ path: `${x.parent.path}${Sql.cast.asText(x.appFileID)}/` }));
25
+
26
+ // do this for every folder
27
+ const childFolders = await this.db.appFiles.where(entity, (p) => (x) => x.parentID === p.appFileID && x.isFolder === true)
28
+ .toArray();
29
+
30
+ for (const folder of childFolders) {
31
+ await this.update(folder);
32
+ }
33
+
34
+ }
35
+
36
+ }
@@ -1,8 +0,0 @@
1
- import { User } from "./User.js";
2
- export default class UserGroupMembership {
3
- ownerID: number;
4
- groupID: number;
5
- owner: User;
6
- group: User;
7
- }
8
- //# sourceMappingURL=UserGroupMembership.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UserGroupMembership.d.ts","sourceRoot":"","sources":["../../../../src/server/model/entities/UserGroupMembership.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAUpC,OAAO,EAAE,MAAM,CAAC;IAWhB,OAAO,EAAE,MAAM,CAAC;IAEhB,KAAK,EAAE,IAAI,CAAC;IAEZ,KAAK,EAAE,IAAI,CAAC;CACf"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"UserGroupMembership.js","sourceRoot":"","sources":["../../../../src/server/model/entities/UserGroupMembership.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,wDAAwD,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAe,MAAM,wDAAwD,CAAC;AAC/F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,mBAAmB;CA0BvC;AAhBG;IATC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE;QACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK;QACxB,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;QAChC,oBAAoB,EAAE;YAClB,IAAI,EAAE,oCAAoC;YAC1C,OAAO,EAAE,QAAQ;SACpB;KACJ,CAAC;;oDACc;AAWhB;IATC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAC,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE;QACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK;QACxB,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY;QACtC,oBAAoB,EAAE;YAClB,IAAI,EAAE,oCAAoC;YAC1C,OAAO,EAAE,QAAQ;SACpB;KACJ,CAAC;;oDACc"}