@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.
- package/dist/server/model/SocialMailContext.d.ts +2 -0
- package/dist/server/model/SocialMailContext.d.ts.map +1 -1
- package/dist/server/model/SocialMailContext.js +2 -0
- package/dist/server/model/SocialMailContext.js.map +1 -1
- package/dist/server/model/entities/User.d.ts +3 -3
- package/dist/server/model/entities/User.d.ts.map +1 -1
- package/dist/server/model/entities/UserGroupMember.d.ts +16 -0
- package/dist/server/model/entities/UserGroupMember.d.ts.map +1 -0
- package/dist/server/model/entities/{UserGroupMembership.js → UserGroupMember.js} +18 -5
- package/dist/server/model/entities/UserGroupMember.js.map +1 -0
- package/dist/server/model/events/AppFileEvents.d.ts +2 -0
- package/dist/server/model/events/AppFileEvents.d.ts.map +1 -1
- package/dist/server/model/events/AppFileEvents.js +8 -11
- package/dist/server/model/events/AppFileEvents.js.map +1 -1
- package/dist/server/seed/ui/seed-ui.js +1 -1
- package/dist/server/seed/ui/seed-ui.js.map +1 -1
- package/dist/server/services/UserInfoProvider.d.ts.map +1 -1
- package/dist/server/services/UserInfoProvider.js +84 -23
- package/dist/server/services/UserInfoProvider.js.map +1 -1
- package/dist/server/services/files/FilePathService.d.ts +7 -0
- package/dist/server/services/files/FilePathService.d.ts.map +1 -0
- package/dist/server/services/files/FilePathService.js +42 -0
- package/dist/server/services/files/FilePathService.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/server/model/SocialMailContext.ts +3 -0
- package/src/server/model/entities/User.ts +3 -3
- package/src/server/model/entities/{UserGroupMembership.ts → UserGroupMember.ts} +14 -3
- package/src/server/model/events/AppFileEvents.ts +9 -17
- package/src/server/seed/ui/seed-ui.ts +1 -1
- package/src/server/services/UserInfoProvider.ts +6 -2
- package/src/server/services/files/FilePathService.ts +36 -0
- package/dist/server/model/entities/UserGroupMembership.d.ts +0 -8
- package/dist/server/model/entities/UserGroupMembership.d.ts.map +0 -1
- package/dist/server/model/entities/UserGroupMembership.js.map +0 -1
package/package.json
CHANGED
|
@@ -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
|
|
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:
|
|
194
|
-
groupMembers:
|
|
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
|
|
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
|
-
|
|
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
|
|
2
|
-
import AppFile
|
|
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
|
|
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")
|
|
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
|
|
541
|
-
|
|
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.
|
|
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
|
-
|
|
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) => [
|
|
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 +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"}
|