@social-mail/social-mail-web-server 1.8.12 → 1.8.13

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 (42) hide show
  1. package/dist/reports/model/entities/ReportSite.d.ts +3 -0
  2. package/dist/reports/model/entities/ReportSite.d.ts.map +1 -1
  3. package/dist/reports/model/entities/ReportSite.js +13 -1
  4. package/dist/reports/model/entities/ReportSite.js.map +1 -1
  5. package/dist/reports/model/entities/VisitSegment.d.ts +2 -0
  6. package/dist/reports/model/entities/VisitSegment.d.ts.map +1 -1
  7. package/dist/reports/model/entities/VisitSegment.js +6 -0
  8. package/dist/reports/model/entities/VisitSegment.js.map +1 -1
  9. package/dist/reports/model/events/ReportSiteEvents.d.ts +2 -0
  10. package/dist/reports/model/events/ReportSiteEvents.d.ts.map +1 -1
  11. package/dist/reports/model/events/ReportSiteEvents.js +4 -0
  12. package/dist/reports/model/events/ReportSiteEvents.js.map +1 -1
  13. package/dist/reports/model/events/VisitActivityEvents.d.ts +3 -0
  14. package/dist/reports/model/events/VisitActivityEvents.d.ts.map +1 -1
  15. package/dist/reports/model/events/VisitActivityEvents.js +7 -0
  16. package/dist/reports/model/events/VisitActivityEvents.js.map +1 -1
  17. package/dist/reports/model/events/VisitEvents.d.ts +3 -0
  18. package/dist/reports/model/events/VisitEvents.d.ts.map +1 -1
  19. package/dist/reports/model/events/VisitEvents.js +7 -0
  20. package/dist/reports/model/events/VisitEvents.js.map +1 -1
  21. package/dist/reports/model/events/VisitSegmentEvents.d.ts +7 -0
  22. package/dist/reports/model/events/VisitSegmentEvents.d.ts.map +1 -0
  23. package/dist/reports/model/events/VisitSegmentEvents.js +8 -0
  24. package/dist/reports/model/events/VisitSegmentEvents.js.map +1 -0
  25. package/dist/reports/model/events/VisitorEvents.d.ts +3 -0
  26. package/dist/reports/model/events/VisitorEvents.d.ts.map +1 -1
  27. package/dist/reports/model/events/VisitorEvents.js +7 -0
  28. package/dist/reports/model/events/VisitorEvents.js.map +1 -1
  29. package/dist/reports/services/ReportingCache.d.ts +1 -0
  30. package/dist/reports/services/ReportingCache.d.ts.map +1 -1
  31. package/dist/reports/services/ReportingCache.js +10 -1
  32. package/dist/reports/services/ReportingCache.js.map +1 -1
  33. package/dist/tsconfig.tsbuildinfo +1 -1
  34. package/package.json +1 -1
  35. package/src/reports/model/entities/ReportSite.ts +13 -0
  36. package/src/reports/model/entities/VisitSegment.ts +8 -0
  37. package/src/reports/model/events/ReportSiteEvents.ts +6 -0
  38. package/src/reports/model/events/VisitActivityEvents.ts +10 -1
  39. package/src/reports/model/events/VisitEvents.ts +10 -1
  40. package/src/reports/model/events/VisitSegmentEvents.ts +12 -0
  41. package/src/reports/model/events/VisitorEvents.ts +9 -0
  42. package/src/reports/services/ReportingCache.ts +11 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-web-server",
3
- "version": "1.8.12",
3
+ "version": "1.8.13",
4
4
  "description": "## Phase 1",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -3,13 +3,25 @@ import Table from "@entity-access/entity-access/dist/decorators/Table.js";
3
3
  import type Visitor from "./Visitor.js";
4
4
  import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
5
5
  import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
6
+ import Index from "@entity-access/entity-access/dist/decorators/Index.js";
7
+ import type VisitSegment from "./VisitSegment.js";
6
8
 
7
9
  @Table("ReportSites")
10
+ @Index({
11
+ name: "IX_ReportSites_Path",
12
+ columns: [
13
+ { name: (x) => x.path, descending: false }
14
+ ],
15
+ filter: (x) => x.path !== null
16
+ })
8
17
  export default class ReportSite {
9
18
 
10
19
  @Column({ dataType: "BigInt", key: true })
11
20
  siteID: number;
12
21
 
22
+ @Column({ dataType: "Char", length: 400, nullable: true})
23
+ path: string;
24
+
13
25
  @Column({ dataType: "DateTime", default: () => Sql.date.now()})
14
26
  dateCreated: DateTime;
15
27
 
@@ -17,5 +29,6 @@ export default class ReportSite {
17
29
  timeZoneSeconds: number;
18
30
 
19
31
  visitors: Visitor[];
32
+ visitSegments: VisitSegment[];
20
33
 
21
34
  }
@@ -1,8 +1,10 @@
1
1
  import CheckConstraint from "@entity-access/entity-access/dist/decorators/CheckConstraint.js";
2
2
  import Column from "@entity-access/entity-access/dist/decorators/Column.js";
3
+ import { RelateTo } from "@entity-access/entity-access/dist/decorators/Relate.js";
3
4
  import Table from "@entity-access/entity-access/dist/decorators/Table.js";
4
5
  import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
5
6
  import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
7
+ import ReportSite from "./ReportSite.js";
6
8
 
7
9
  const durations = [ "hourly", "daily", "monthly", "yearly", "real-time"] as const;
8
10
  export type durationType = typeof durations[number];
@@ -17,6 +19,10 @@ export type durationType = typeof durations[number];
17
19
  export default class VisitSegment {
18
20
 
19
21
  @Column({ dataType: "BigInt", key: true })
22
+ @RelateTo(ReportSite, {
23
+ property: (x) => x.site,
24
+ inverseProperty: (x) => x.visitSegments
25
+ })
20
26
  siteID: number;
21
27
 
22
28
  @Column({ dataType: "Char", length: 20, key: true, enum: durations })
@@ -44,4 +50,6 @@ export default class VisitSegment {
44
50
  @Column({ dataType: "Int", default: () => 0})
45
51
  newVisitors: number;
46
52
 
53
+ site: ReportSite;
54
+
47
55
  }
@@ -1,6 +1,12 @@
1
+ import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWithParameter.js";
1
2
  import AuthenticatedEvents from "../../../server/model/events/AuthenticatedEvents.js";
2
3
  import ReportSite from "../entities/ReportSite.js";
4
+ import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
3
5
 
4
6
  export default class ReportSiteEvents extends AuthenticatedEvents<ReportSite> {
5
7
 
8
+ filter(query: IEntityQuery<ReportSite>): IEntityQuery<ReportSite> {
9
+ return query.where(this.sessionUser, (p) => (x) => Sql.text.likeAny(x.path, p.readFileAccess));
10
+ }
11
+
6
12
  }
@@ -1,7 +1,16 @@
1
+ import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWithParameter.js";
1
2
  import AuthenticatedEvents from "../../../server/model/events/AuthenticatedEvents.js";
2
3
  import Visit from "../entities/Visit.js";
3
4
  import VisitActivity from "../entities/VisitActivity.js";
5
+ import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
4
6
 
5
7
  export default class VisitActivityEvents extends AuthenticatedEvents<VisitActivity> {
6
-
8
+
9
+ filter(query: IEntityQuery<VisitActivity>): IEntityQuery<VisitActivity> {
10
+ return query.where(this.sessionUser, (p) => (x) => Sql.text.likeAny(x.visit.visitor.site.path, p.readFileAccess));
11
+ }
12
+
13
+ includeFilter(query: IEntityQuery<VisitActivity>, type?: any, key?: string): IEntityQuery<VisitActivity> {
14
+ return query;
15
+ }
7
16
  }
@@ -1,6 +1,15 @@
1
+ import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWithParameter.js";
1
2
  import AuthenticatedEvents from "../../../server/model/events/AuthenticatedEvents.js";
2
3
  import Visit from "../entities/Visit.js";
4
+ import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
3
5
 
4
6
  export default class VisitEvents extends AuthenticatedEvents<Visit> {
5
-
7
+
8
+ filter(query: IEntityQuery<Visit>): IEntityQuery<Visit> {
9
+ return query.where(this.sessionUser, (p) => (x) => Sql.text.likeAny(x.visitor.site.path, p.readFileAccess));
10
+ }
11
+
12
+ includeFilter(query: IEntityQuery<Visit>, type?: any, key?: string): IEntityQuery<Visit> {
13
+ return query;
14
+ }
6
15
  }
@@ -0,0 +1,12 @@
1
+ import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWithParameter.js";
2
+ import AuthenticatedEvents from "../../../server/model/events/AuthenticatedEvents.js";
3
+ import VisitSegment from "../entities/VisitSegment.js";
4
+ import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
5
+
6
+ export default class VisitSegmentEvents extends AuthenticatedEvents<VisitSegment> {
7
+
8
+ filter(query: IEntityQuery<VisitSegment>): IEntityQuery<VisitSegment> {
9
+ return query.where(this.sessionUser, (p) => (x) => Sql.text.likeAny(x.site.path, p.readFileAccess));
10
+ }
11
+
12
+ }
@@ -1,6 +1,15 @@
1
+ import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWithParameter.js";
1
2
  import AuthenticatedEvents from "../../../server/model/events/AuthenticatedEvents.js";
2
3
  import Visitor from "../entities/Visitor.js";
4
+ import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
3
5
 
4
6
  export default class VisitorEvents extends AuthenticatedEvents<Visitor> {
5
7
 
8
+ filter(query: IEntityQuery<Visitor>): IEntityQuery<Visitor> {
9
+ return query.where(this.sessionUser, (p) => (x) => Sql.text.likeAny(x.site.path, p.readFileAccess));
10
+ }
11
+
12
+ includeFilter(query: IEntityQuery<Visitor>, type?: any, key?: string): IEntityQuery<Visitor> {
13
+ return query;
14
+ }
6
15
  }
@@ -5,6 +5,7 @@ import WebSiteContentService from "../../server/services/files/WebSiteContentSer
5
5
  import BaseDiskCache from "../../common/BaseDiskCache.js";
6
6
  import { join } from "path";
7
7
  import { globalEnv } from "../../common/globalEnv.js";
8
+ import SocialMailContext from "../../server/model/SocialMailContext.js";
8
9
 
9
10
  @RegisterSingleton
10
11
  class ReportingCacheStore {
@@ -31,6 +32,9 @@ export default class ReportingCache {
31
32
  @Inject
32
33
  private wcs: WebSiteContentService;
33
34
 
35
+ @Inject
36
+ private appDb: SocialMailContext;
37
+
34
38
 
35
39
  async generateSiteDb(host: string) {
36
40
  return this.cacheStore.diskCache.getOrCreateJsonAsync(`generateSiteDb-${host}`, async() => {
@@ -38,10 +42,16 @@ export default class ReportingCache {
38
42
 
39
43
  const { folderID } = ss;
40
44
 
41
- const { siteID, timeZoneSeconds } = await this.db.reportSites.statements.selectOrInsert({
45
+ const folder = await this.appDb.appFiles.statements.select({ }, { appFileID: folderID });
46
+
47
+ const { siteID, timeZoneSeconds, path } = await this.db.reportSites.statements.selectOrInsert({
42
48
  siteID: folderID
43
49
  });
44
50
 
51
+ if (folder.path !== path) {
52
+ await this.db.reportSites.statements.update({ path: folder.path}, { siteID });
53
+ }
54
+
45
55
  return { siteID, timeZoneSeconds };
46
56
  });
47
57
  }