Skip to content

Commit 67b341d

Browse files
committed
segments for tags, tasks, widgets - filtering fixed
1 parent 28d2fd7 commit 67b341d

18 files changed

Lines changed: 206 additions & 29 deletions

backend/src/database/migrations/V1683110675__segments.sql

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ create type public."segmentsStatus_type" AS ENUM ('active', 'archived', 'formati
22

33
create table "segments" (
44
"id" uuid not null,
5+
url text null,
56
name text null,
67
"parentName" text null,
78
"grandparentName" text null,
@@ -26,4 +27,27 @@ ALTER TABLE "activities" ADD COLUMN "segmentId" uuid;
2627

2728
ALTER TABLE "integrations" ADD COLUMN "segmentId" uuid;
2829

29-
ALTER TABLE "conversations" ADD COLUMN "segmentId" uuid;
30+
ALTER TABLE "conversations" ADD COLUMN "segmentId" uuid;
31+
32+
ALTER TABLE "tags" ADD COLUMN "segmentId" uuid;
33+
34+
ALTER TABLE "tasks" ADD COLUMN "segmentId" uuid;
35+
36+
ALTER TABLE "reports" ADD COLUMN "segmentId" uuid;
37+
38+
ALTER TABLE "widgets" ADD COLUMN "segmentId" uuid;
39+
40+
41+
CREATE TABLE public."memberSegments" (
42+
"memberId" uuid NOT NULL,
43+
"segmentId" uuid NOT NULL,
44+
"tenantId" uuid NOT NULL,
45+
"createdAt" timestamp with time zone NOT NULL,
46+
foreign key ("tenantId") references tenants (id),
47+
foreign key ("segmentId") references segments (id),
48+
foreign key ("memberId") references members (id),
49+
unique("memberId", "segmentId", "tenantId")
50+
-- create index for memberId, segmentId and tenantId
51+
);
52+
53+

backend/src/database/models/member.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ export default (sequelize) => {
101101
foreignKey: 'memberId',
102102
})
103103

104+
models.member.belongsToMany(models.segment, {
105+
as: 'segments',
106+
through: 'memberSegments',
107+
})
108+
104109
models.member.hasOne(models.memberActivityAggregatesMV, {
105110
as: 'memberActivityAggregatesMVs',
106111
foreignKey: 'id',

backend/src/database/models/report.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ export default (sequelize) => {
6464
},
6565
})
6666

67+
models.report.belongsTo(models.segment, {
68+
as: 'segment',
69+
foreignKey: {
70+
allowNull: false,
71+
},
72+
})
73+
6774
models.report.belongsTo(models.user, {
6875
as: 'createdBy',
6976
})

backend/src/database/models/segment.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ export default (sequelize) => {
99
defaultValue: DataTypes.UUIDV4,
1010
primaryKey: true,
1111
},
12+
url: {
13+
type: DataTypes.TEXT,
14+
},
1215
name: {
1316
type: DataTypes.TEXT,
1417
},

backend/src/database/models/tag.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ export default (sequelize) => {
5757
},
5858
})
5959

60+
models.tag.belongsTo(models.segment, {
61+
as: 'segment',
62+
foreignKey: {
63+
allowNull: false,
64+
},
65+
})
66+
6067
models.tag.belongsTo(models.user, {
6168
as: 'createdBy',
6269
})

backend/src/database/models/task.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,13 @@ export default (sequelize) => {
8282
},
8383
})
8484

85+
models.task.belongsTo(models.segment, {
86+
as: 'segment',
87+
foreignKey: {
88+
allowNull: false,
89+
},
90+
})
91+
8592
models.task.belongsToMany(models.user, {
8693
as: 'assignees',
8794
through: 'taskAssignees',

backend/src/database/models/widget.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@ export default (sequelize) => {
6060
},
6161
})
6262

63+
models.widget.belongsTo(models.segment, {
64+
as: 'segment',
65+
foreignKey: {
66+
allowNull: false,
67+
},
68+
})
69+
6370
models.widget.belongsTo(models.user, {
6471
as: 'createdBy',
6572
})

backend/src/database/repositories/filters/queryParser.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@ class QueryParser {
404404
const dbQuery: any = {
405405
where: {
406406
tenantId: SequelizeRepository.getCurrentTenant(this.options).id,
407+
segmentId: this.options.currentSegments.map((s) => s.id),
407408
},
408409
limit: QueryParser.defaultPageSize,
409410
offset: 0,

backend/src/database/repositories/memberRepository.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
} from './types/memberTypes'
2727
import { ActivityDisplayVariant } from '../../types/activityTypes'
2828
import SegmentRepository from './segmentRepository'
29+
import { SegmentData } from '../../types/segmentTypes'
2930

3031
const { Op } = Sequelize
3132

@@ -99,6 +100,8 @@ class MemberRepository {
99100
}
100101
}
101102

103+
await MemberRepository.includeMemberToSegments(record.id, options)
104+
102105
await record.setActivities(data.activities || [], {
103106
transaction,
104107
})
@@ -129,6 +132,36 @@ class MemberRepository {
129132
return this.findById(record.id, options, true, doPopulateRelations)
130133
}
131134

135+
static async includeMemberToSegments(memberId: string, options: IRepositoryOptions) {
136+
const seq = SequelizeRepository.getSequelize(options)
137+
138+
const transaction = SequelizeRepository.getTransaction(options)
139+
140+
let bulkInsertMemberSegments = `INSERT INTO "memberSegments" ("memberId","segmentId", "tenantId", "createdAt") VALUES `
141+
const replacements = {
142+
memberId,
143+
tenantId: options.currentTenant.id,
144+
}
145+
146+
for (let idx = 0; idx < options.currentSegments.length; idx++) {
147+
bulkInsertMemberSegments += ` (:memberId, :segmentId${idx}, :tenantId, now()) `
148+
149+
replacements[`segmentId${idx}`] = options.currentSegments[idx].id
150+
151+
if (idx !== options.currentSegments.length - 1) {
152+
bulkInsertMemberSegments += `,`
153+
}
154+
}
155+
156+
bulkInsertMemberSegments += ` ON CONFLICT DO NOTHING`
157+
158+
await seq.query(bulkInsertMemberSegments, {
159+
replacements,
160+
type: QueryTypes.INSERT,
161+
transaction,
162+
})
163+
}
164+
132165
static async findSampleDataMemberIds(options: IRepositoryOptions) {
133166
const transaction = SequelizeRepository.getTransaction(options)
134167
const currentTenant = SequelizeRepository.getCurrentTenant(options)
@@ -482,6 +515,7 @@ class MemberRepository {
482515
where: {
483516
id,
484517
tenantId: currentTenant.id,
518+
segmentId: options.currentSegments.map((s) => s.id),
485519
},
486520
transaction,
487521
})
@@ -634,6 +668,7 @@ class MemberRepository {
634668
where: {
635669
id,
636670
tenantId: currentTenant.id,
671+
segmentId: options.currentSegments.map((s) => s.id),
637672
},
638673
transaction,
639674
})
@@ -659,12 +694,39 @@ class MemberRepository {
659694
where: {
660695
id: ids,
661696
tenantId: currentTenant.id,
697+
segmentId: options.currentSegments.map((s) => s.id),
662698
},
663699
force,
664700
transaction,
665701
})
666702
}
667703

704+
static async getSegments(
705+
memberIds: string[],
706+
options: IRepositoryOptions,
707+
): Promise<Map<string, SegmentData[]>> {
708+
const results = new Map<string, SegmentData[]>()
709+
710+
const transaction = SequelizeRepository.getTransaction(options)
711+
const seq = SequelizeRepository.getSequelize(options)
712+
713+
const query = `
714+
select "memberId", "segmentId", "tenantId", "createdAt" from "memberSegments" where "memberId" in (:memberIds) order by "createdAt" asc;
715+
`
716+
717+
await seq.query(query, {
718+
replacements: {
719+
memberIds,
720+
},
721+
type: QueryTypes.SELECT,
722+
transaction,
723+
})
724+
725+
// TODO: complete
726+
727+
return results
728+
}
729+
668730
static async getIdentities(
669731
memberIds: string[],
670732
options: IRepositoryOptions,
@@ -725,6 +787,7 @@ class MemberRepository {
725787
if (!ignoreTenant) {
726788
const currentTenant = SequelizeRepository.getCurrentTenant(options)
727789
where.tenantId = currentTenant.id
790+
where.segmentId = options.currentSegments.map((s) => s.id)
728791
}
729792

730793
const record = await options.database.member.findOne({

backend/src/database/repositories/reportRepository.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@ class ReportRepository {
1818

1919
const transaction = SequelizeRepository.getTransaction(options)
2020

21+
const segment = SequelizeRepository.getStrictlySingleActiveSegment(options)
22+
2123
const record = await options.database.report.create(
2224
{
2325
...lodash.pick(data, ['name', 'public', 'importHash', 'isTemplate', 'viewedBy']),
2426

2527
tenantId: tenant.id,
28+
segmentId: segment.id,
2629
createdById: currentUser.id,
2730
updatedById: currentUser.id,
2831
},
@@ -51,6 +54,7 @@ class ReportRepository {
5154
where: {
5255
id,
5356
tenantId: currentTenant.id,
57+
segmentId: options.currentSegments.map((s) => s.id),
5458
},
5559
transaction,
5660
})
@@ -90,6 +94,7 @@ class ReportRepository {
9094
where: {
9195
id,
9296
tenantId: currentTenant.id,
97+
segmentId: options.currentSegments.map((s) => s.id),
9398
},
9499
transaction,
95100
})
@@ -116,6 +121,7 @@ class ReportRepository {
116121
where: {
117122
id,
118123
tenantId: currentTenant.id,
124+
segmentId: options.currentSegments.map((s) => s.id),
119125
},
120126
include,
121127
transaction,
@@ -163,6 +169,7 @@ class ReportRepository {
163169
where: {
164170
...filter,
165171
tenantId: tenant.id,
172+
segmentId: options.currentSegments.map((s) => s.id),
166173
},
167174
transaction,
168175
})
@@ -259,6 +266,9 @@ class ReportRepository {
259266
{
260267
tenantId: tenant.id,
261268
},
269+
{
270+
segmentId: options.currentSegments.map((s) => s.id),
271+
},
262272
]
263273

264274
if (query) {

0 commit comments

Comments
 (0)