@talkpilot/core-db 1.1.19 → 1.2.0
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/.cursor/rules/development.mdc +65 -65
- package/DEVELOPMENT.md +98 -98
- package/README.md +160 -160
- package/dist/talkpilot/calls/calls.getters.d.ts +2 -1
- package/dist/talkpilot/calls/calls.getters.d.ts.map +1 -1
- package/dist/talkpilot/calls/calls.getters.js +176 -0
- package/dist/talkpilot/calls/calls.getters.js.map +1 -1
- package/dist/talkpilot/calls/calls.types.d.ts +48 -0
- package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +1 -0
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +13 -0
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
- package/jest.config.js +19 -19
- package/package.json +45 -45
- package/src/__tests__/setup.ts +20 -20
- package/src/connection.ts +42 -42
- package/src/index.ts +16 -16
- package/src/municipal/__tests__/validation.spec.ts +62 -62
- package/src/municipal/cities/cities.getters.ts +50 -50
- package/src/municipal/cities/cities.types.ts +11 -11
- package/src/municipal/cities/index.ts +2 -2
- package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +282 -282
- package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +72 -72
- package/src/municipal/departmentsSubjects/index.ts +9 -9
- package/src/municipal/index.ts +21 -21
- package/src/municipal/mongodb-client.ts +61 -61
- package/src/municipal/streets/index.ts +2 -2
- package/src/municipal/streets/streets.getters.ts +125 -125
- package/src/municipal/streets/streets.types.ts +18 -18
- package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
- package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
- package/src/municipal/systemInstructions/index.ts +7 -7
- package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
- package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
- package/src/municipal/systemInstructions/instructions.types.ts +30 -30
- package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +66 -66
- package/src/municipal/tickets/index.ts +2 -2
- package/src/municipal/tickets/tickets.getters.ts +261 -261
- package/src/municipal/tickets/tickets.types.ts +43 -43
- package/src/municipal/utils/types.ts +11 -11
- package/src/talkpilot/__tests__/db.spec.ts +38 -38
- package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
- package/src/talkpilot/__tests__/validation.spec.ts +68 -68
- package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
- package/src/talkpilot/agents/agents.getters.ts +34 -34
- package/src/talkpilot/agents/agents.types.ts +14 -14
- package/src/talkpilot/agents/index.ts +2 -2
- package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
- package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
- package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
- package/src/talkpilot/backgroundToolResults/index.ts +2 -2
- package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
- package/src/talkpilot/calls/__tests__/calls.spec.ts +252 -252
- package/src/talkpilot/calls/calls.getters.ts +446 -248
- package/src/talkpilot/calls/calls.types.ts +171 -115
- package/src/talkpilot/calls/index.ts +2 -2
- package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
- package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
- package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
- package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
- package/src/talkpilot/clients/clients.getters.ts +16 -16
- package/src/talkpilot/clients/clients.types.ts +14 -14
- package/src/talkpilot/clients/index.ts +2 -2
- package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +106 -106
- package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +44 -22
- package/src/talkpilot/clientsConfig/clientsConfig.types.ts +94 -94
- package/src/talkpilot/clientsConfig/index.ts +2 -2
- package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +67 -67
- package/src/talkpilot/flows/flows.getter.ts +14 -14
- package/src/talkpilot/flows/flows.schema.ts +153 -153
- package/src/talkpilot/flows/flows.types.ts +184 -184
- package/src/talkpilot/flows/index.ts +2 -2
- package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
- package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
- package/src/talkpilot/groups/groups.getters.ts +30 -30
- package/src/talkpilot/groups/groups.types.ts +29 -29
- package/src/talkpilot/groups/index.ts +3 -3
- package/src/talkpilot/groups/phone.utils.ts +46 -46
- package/src/talkpilot/index.ts +29 -29
- package/src/talkpilot/leads/index.ts +2 -2
- package/src/talkpilot/leads/leads.getter.ts +6 -6
- package/src/talkpilot/leads/leads.schema.ts +33 -33
- package/src/talkpilot/leads/leads.types.ts +20 -20
- package/src/talkpilot/mongodb-client.ts +78 -78
- package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +247 -247
- package/src/talkpilot/phone_numbers/index.ts +2 -2
- package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +154 -154
- package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
- package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
- package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
- package/src/talkpilot/plans/index.ts +2 -2
- package/src/talkpilot/plans/plans.getters.ts +132 -132
- package/src/talkpilot/plans/plans.types.ts +89 -89
- package/src/talkpilot/results/index.ts +7 -7
- package/src/talkpilot/results/results.getter.ts +35 -35
- package/src/talkpilot/results/results.schema.ts +25 -25
- package/src/talkpilot/results/results.types.ts +34 -34
- package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
- package/src/talkpilot/retry_analyze/index.ts +2 -2
- package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +75 -75
- package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
- package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
- package/src/talkpilot/sessions/index.ts +2 -2
- package/src/talkpilot/sessions/sessions.getter.ts +92 -92
- package/src/talkpilot/sessions/sessions.schema.ts +34 -34
- package/src/talkpilot/sessions/sessions.types.ts +30 -30
- package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
- package/src/talkpilot/subscriptions/index.ts +3 -3
- package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
- package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
- package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
- package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
- package/src/talkpilot/utils/query.utils.ts +21 -21
- package/src/test-utils/db-utils.ts +24 -24
- package/src/test-utils/factories/index.ts +12 -12
- package/src/test-utils/factories/municipal/cities.ts +16 -16
- package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
- package/src/test-utils/factories/municipal/streets.ts +22 -22
- package/src/test-utils/factories/municipal/tickets.ts +39 -39
- package/src/test-utils/factories/talkpilot/agents.ts +19 -19
- package/src/test-utils/factories/talkpilot/calls.ts +37 -37
- package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
- package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
- package/src/test-utils/factories/talkpilot/flows.ts +33 -33
- package/src/test-utils/factories/talkpilot/groups.ts +33 -33
- package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
- package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
- package/src/utils/validation.ts +23 -23
- package/tsconfig.json +23 -23
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import { CityName, getDb, ObjectId } from "../index";
|
|
2
|
-
import { Collection, Filter } from "mongodb";
|
|
3
|
-
import { MIS_SystemInstruction, MIS_Tool } from "./instructions.types";
|
|
4
|
-
|
|
5
|
-
export const getSystemInstructionsCollection =
|
|
6
|
-
(): Collection<MIS_SystemInstruction> => {
|
|
7
|
-
return getDb().collection<MIS_SystemInstruction>("system_instructions");
|
|
8
|
-
};
|
|
9
|
-
/**
|
|
10
|
-
* Find system instructions by filter
|
|
11
|
-
* @param filter filter to apply
|
|
12
|
-
* @returns array of system instructions
|
|
13
|
-
*/
|
|
14
|
-
export const findSystemInstructions = async (
|
|
15
|
-
filter: Filter<MIS_SystemInstruction> = {},
|
|
16
|
-
): Promise<MIS_SystemInstruction[]> => {
|
|
17
|
-
return await getSystemInstructionsCollection().find(filter).toArray();
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Get system instruction by id
|
|
22
|
-
* @param id system instruction id
|
|
23
|
-
* @returns system instruction or null if not found
|
|
24
|
-
*/
|
|
25
|
-
export const getSystemInstructionById = async (
|
|
26
|
-
id: string,
|
|
27
|
-
): Promise<MIS_SystemInstruction | null> => {
|
|
28
|
-
return await getSystemInstructionsCollection().findOne({
|
|
29
|
-
_id: new ObjectId(id),
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* Get all active system instructions for a city
|
|
34
|
-
* @param cityName city name
|
|
35
|
-
* @returns array of active system instructions
|
|
36
|
-
*/
|
|
37
|
-
export const getActiveSystemInstructionsByCity = async (
|
|
38
|
-
cityName: CityName,
|
|
39
|
-
): Promise<MIS_SystemInstruction[]> => {
|
|
40
|
-
return await getSystemInstructionsCollection()
|
|
41
|
-
.find({ cityName, isActive: true })
|
|
42
|
-
.toArray();
|
|
43
|
-
};
|
|
44
|
-
/**
|
|
45
|
-
* Get system instructions by tool and city
|
|
46
|
-
* @param cityName city name
|
|
47
|
-
* @param toolName tool name
|
|
48
|
-
* @returns array of system instructions
|
|
49
|
-
*/
|
|
50
|
-
export const getSystemInstructionsByToolAndCity = async (
|
|
51
|
-
cityName: CityName,
|
|
52
|
-
toolName: MIS_Tool,
|
|
53
|
-
): Promise<MIS_SystemInstruction[]> => {
|
|
54
|
-
return await getSystemInstructionsCollection()
|
|
55
|
-
.find({ cityName: cityName, tool: toolName })
|
|
56
|
-
.toArray();
|
|
57
|
-
};
|
|
1
|
+
import { CityName, getDb, ObjectId } from "../index";
|
|
2
|
+
import { Collection, Filter } from "mongodb";
|
|
3
|
+
import { MIS_SystemInstruction, MIS_Tool } from "./instructions.types";
|
|
4
|
+
|
|
5
|
+
export const getSystemInstructionsCollection =
|
|
6
|
+
(): Collection<MIS_SystemInstruction> => {
|
|
7
|
+
return getDb().collection<MIS_SystemInstruction>("system_instructions");
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Find system instructions by filter
|
|
11
|
+
* @param filter filter to apply
|
|
12
|
+
* @returns array of system instructions
|
|
13
|
+
*/
|
|
14
|
+
export const findSystemInstructions = async (
|
|
15
|
+
filter: Filter<MIS_SystemInstruction> = {},
|
|
16
|
+
): Promise<MIS_SystemInstruction[]> => {
|
|
17
|
+
return await getSystemInstructionsCollection().find(filter).toArray();
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Get system instruction by id
|
|
22
|
+
* @param id system instruction id
|
|
23
|
+
* @returns system instruction or null if not found
|
|
24
|
+
*/
|
|
25
|
+
export const getSystemInstructionById = async (
|
|
26
|
+
id: string,
|
|
27
|
+
): Promise<MIS_SystemInstruction | null> => {
|
|
28
|
+
return await getSystemInstructionsCollection().findOne({
|
|
29
|
+
_id: new ObjectId(id),
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Get all active system instructions for a city
|
|
34
|
+
* @param cityName city name
|
|
35
|
+
* @returns array of active system instructions
|
|
36
|
+
*/
|
|
37
|
+
export const getActiveSystemInstructionsByCity = async (
|
|
38
|
+
cityName: CityName,
|
|
39
|
+
): Promise<MIS_SystemInstruction[]> => {
|
|
40
|
+
return await getSystemInstructionsCollection()
|
|
41
|
+
.find({ cityName, isActive: true })
|
|
42
|
+
.toArray();
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Get system instructions by tool and city
|
|
46
|
+
* @param cityName city name
|
|
47
|
+
* @param toolName tool name
|
|
48
|
+
* @returns array of system instructions
|
|
49
|
+
*/
|
|
50
|
+
export const getSystemInstructionsByToolAndCity = async (
|
|
51
|
+
cityName: CityName,
|
|
52
|
+
toolName: MIS_Tool,
|
|
53
|
+
): Promise<MIS_SystemInstruction[]> => {
|
|
54
|
+
return await getSystemInstructionsCollection()
|
|
55
|
+
.find({ cityName: cityName, tool: toolName })
|
|
56
|
+
.toArray();
|
|
57
|
+
};
|
|
@@ -1,119 +1,119 @@
|
|
|
1
|
-
import { ObjectId } from "../index";
|
|
2
|
-
import { ObjectId as MongoObjectId } from "mongodb";
|
|
3
|
-
import {
|
|
4
|
-
MIS_SystemInstruction,
|
|
5
|
-
MIS_TOOLS,
|
|
6
|
-
QUERY_TYPES,
|
|
7
|
-
} from "./instructions.types";
|
|
8
|
-
import { getSystemInstructionsCollection } from "./instructions.getters";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Validate system instruction data
|
|
12
|
-
* @param data partial system instruction data
|
|
13
|
-
* @throws Error if tool or queryType is invalid
|
|
14
|
-
*/
|
|
15
|
-
const validateInstructionData = (data: Partial<MIS_SystemInstruction>) => {
|
|
16
|
-
if (
|
|
17
|
-
data.tool &&
|
|
18
|
-
!(Object.values(MIS_TOOLS) as string[]).includes(data.tool)
|
|
19
|
-
) {
|
|
20
|
-
throw new Error(
|
|
21
|
-
`Invalid tool value: ${data.tool}. Allowed values are: ${Object.values(MIS_TOOLS).join(", ")}`,
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
if (
|
|
25
|
-
data.queryType &&
|
|
26
|
-
!(Object.values(QUERY_TYPES) as string[]).includes(data.queryType)
|
|
27
|
-
) {
|
|
28
|
-
throw new Error(
|
|
29
|
-
`Invalid queryType value: ${data.queryType}. Allowed values are: ${Object.values(QUERY_TYPES).join(", ")}`,
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Create a new system instruction
|
|
36
|
-
* @param instructionData system instruction data
|
|
37
|
-
* @returns inserted system instruction id
|
|
38
|
-
*/
|
|
39
|
-
export const createSystemInstruction = async (
|
|
40
|
-
instructionData: Omit<
|
|
41
|
-
MIS_SystemInstruction,
|
|
42
|
-
"_id" | "createdAt" | "updatedAt"
|
|
43
|
-
>,
|
|
44
|
-
): Promise<MongoObjectId> => {
|
|
45
|
-
validateInstructionData(instructionData as Partial<MIS_SystemInstruction>);
|
|
46
|
-
const instruction: Omit<MIS_SystemInstruction, "_id"> = {
|
|
47
|
-
//append doc metadata to user provided data
|
|
48
|
-
...instructionData,
|
|
49
|
-
createdAt: new Date(),
|
|
50
|
-
updatedAt: new Date(),
|
|
51
|
-
};
|
|
52
|
-
const { insertedId } = await getSystemInstructionsCollection().insertOne(
|
|
53
|
-
instruction as MIS_SystemInstruction,
|
|
54
|
-
);
|
|
55
|
-
return insertedId;
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Update a system instruction by id
|
|
60
|
-
* @param id system instruction id
|
|
61
|
-
* @param data partial system instruction data
|
|
62
|
-
* @returns updated system instruction or null if not found
|
|
63
|
-
*/
|
|
64
|
-
export const updateSystemInstruction = async (
|
|
65
|
-
id: string,
|
|
66
|
-
data: Partial<Omit<MIS_SystemInstruction, "_id" | "createdAt" | "updatedAt">>,
|
|
67
|
-
): Promise<MIS_SystemInstruction | null> => {
|
|
68
|
-
validateInstructionData(data as Partial<MIS_SystemInstruction>);
|
|
69
|
-
const result = await getSystemInstructionsCollection().findOneAndUpdate(
|
|
70
|
-
{ _id: new ObjectId(id) },
|
|
71
|
-
{ $set: { ...data, updatedAt: new Date() } },
|
|
72
|
-
{ returnDocument: "after" },
|
|
73
|
-
);
|
|
74
|
-
return result || null;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Delete a system instruction by id
|
|
79
|
-
* @param id system instruction id
|
|
80
|
-
* @returns true if deleted, false otherwise
|
|
81
|
-
*/
|
|
82
|
-
export const deleteSystemInstruction = async (id: string): Promise<boolean> => {
|
|
83
|
-
const result = await getSystemInstructionsCollection().deleteOne({
|
|
84
|
-
_id: new ObjectId(id),
|
|
85
|
-
});
|
|
86
|
-
return result.deletedCount > 0;
|
|
87
|
-
};
|
|
88
|
-
/**
|
|
89
|
-
* Activate a system instruction by id, sets isActive to true.
|
|
90
|
-
* Does not check the current instruction state, calling this on an active instruction will do nothing.
|
|
91
|
-
* @param id system instruction id
|
|
92
|
-
* @returns true on success, false otherwise
|
|
93
|
-
*/
|
|
94
|
-
export const activateSystemInstruction = async (
|
|
95
|
-
id: string,
|
|
96
|
-
): Promise<boolean> => {
|
|
97
|
-
const result = await getSystemInstructionsCollection().findOneAndUpdate(
|
|
98
|
-
{ _id: new ObjectId(id) },
|
|
99
|
-
{ $set: { isActive: true } },
|
|
100
|
-
{ returnDocument: "after" },
|
|
101
|
-
);
|
|
102
|
-
return Boolean(result);
|
|
103
|
-
};
|
|
104
|
-
/**
|
|
105
|
-
* Deactivate a system instruction by id, sets isActive to false.
|
|
106
|
-
* Does not check the current instruction state, calling this on a deactivated instruction will do nothing.
|
|
107
|
-
* @param id system instruction id
|
|
108
|
-
* @returns true on success, false otherwise
|
|
109
|
-
*/
|
|
110
|
-
export const deactivateSystemInstruction = async (
|
|
111
|
-
id: string,
|
|
112
|
-
): Promise<boolean> => {
|
|
113
|
-
const result = await getSystemInstructionsCollection().findOneAndUpdate(
|
|
114
|
-
{ _id: new ObjectId(id) },
|
|
115
|
-
{ $set: { isActive: false } },
|
|
116
|
-
{ returnDocument: "after" },
|
|
117
|
-
);
|
|
118
|
-
return Boolean(result);
|
|
119
|
-
};
|
|
1
|
+
import { ObjectId } from "../index";
|
|
2
|
+
import { ObjectId as MongoObjectId } from "mongodb";
|
|
3
|
+
import {
|
|
4
|
+
MIS_SystemInstruction,
|
|
5
|
+
MIS_TOOLS,
|
|
6
|
+
QUERY_TYPES,
|
|
7
|
+
} from "./instructions.types";
|
|
8
|
+
import { getSystemInstructionsCollection } from "./instructions.getters";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Validate system instruction data
|
|
12
|
+
* @param data partial system instruction data
|
|
13
|
+
* @throws Error if tool or queryType is invalid
|
|
14
|
+
*/
|
|
15
|
+
const validateInstructionData = (data: Partial<MIS_SystemInstruction>) => {
|
|
16
|
+
if (
|
|
17
|
+
data.tool &&
|
|
18
|
+
!(Object.values(MIS_TOOLS) as string[]).includes(data.tool)
|
|
19
|
+
) {
|
|
20
|
+
throw new Error(
|
|
21
|
+
`Invalid tool value: ${data.tool}. Allowed values are: ${Object.values(MIS_TOOLS).join(", ")}`,
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
if (
|
|
25
|
+
data.queryType &&
|
|
26
|
+
!(Object.values(QUERY_TYPES) as string[]).includes(data.queryType)
|
|
27
|
+
) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`Invalid queryType value: ${data.queryType}. Allowed values are: ${Object.values(QUERY_TYPES).join(", ")}`,
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Create a new system instruction
|
|
36
|
+
* @param instructionData system instruction data
|
|
37
|
+
* @returns inserted system instruction id
|
|
38
|
+
*/
|
|
39
|
+
export const createSystemInstruction = async (
|
|
40
|
+
instructionData: Omit<
|
|
41
|
+
MIS_SystemInstruction,
|
|
42
|
+
"_id" | "createdAt" | "updatedAt"
|
|
43
|
+
>,
|
|
44
|
+
): Promise<MongoObjectId> => {
|
|
45
|
+
validateInstructionData(instructionData as Partial<MIS_SystemInstruction>);
|
|
46
|
+
const instruction: Omit<MIS_SystemInstruction, "_id"> = {
|
|
47
|
+
//append doc metadata to user provided data
|
|
48
|
+
...instructionData,
|
|
49
|
+
createdAt: new Date(),
|
|
50
|
+
updatedAt: new Date(),
|
|
51
|
+
};
|
|
52
|
+
const { insertedId } = await getSystemInstructionsCollection().insertOne(
|
|
53
|
+
instruction as MIS_SystemInstruction,
|
|
54
|
+
);
|
|
55
|
+
return insertedId;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Update a system instruction by id
|
|
60
|
+
* @param id system instruction id
|
|
61
|
+
* @param data partial system instruction data
|
|
62
|
+
* @returns updated system instruction or null if not found
|
|
63
|
+
*/
|
|
64
|
+
export const updateSystemInstruction = async (
|
|
65
|
+
id: string,
|
|
66
|
+
data: Partial<Omit<MIS_SystemInstruction, "_id" | "createdAt" | "updatedAt">>,
|
|
67
|
+
): Promise<MIS_SystemInstruction | null> => {
|
|
68
|
+
validateInstructionData(data as Partial<MIS_SystemInstruction>);
|
|
69
|
+
const result = await getSystemInstructionsCollection().findOneAndUpdate(
|
|
70
|
+
{ _id: new ObjectId(id) },
|
|
71
|
+
{ $set: { ...data, updatedAt: new Date() } },
|
|
72
|
+
{ returnDocument: "after" },
|
|
73
|
+
);
|
|
74
|
+
return result || null;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Delete a system instruction by id
|
|
79
|
+
* @param id system instruction id
|
|
80
|
+
* @returns true if deleted, false otherwise
|
|
81
|
+
*/
|
|
82
|
+
export const deleteSystemInstruction = async (id: string): Promise<boolean> => {
|
|
83
|
+
const result = await getSystemInstructionsCollection().deleteOne({
|
|
84
|
+
_id: new ObjectId(id),
|
|
85
|
+
});
|
|
86
|
+
return result.deletedCount > 0;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Activate a system instruction by id, sets isActive to true.
|
|
90
|
+
* Does not check the current instruction state, calling this on an active instruction will do nothing.
|
|
91
|
+
* @param id system instruction id
|
|
92
|
+
* @returns true on success, false otherwise
|
|
93
|
+
*/
|
|
94
|
+
export const activateSystemInstruction = async (
|
|
95
|
+
id: string,
|
|
96
|
+
): Promise<boolean> => {
|
|
97
|
+
const result = await getSystemInstructionsCollection().findOneAndUpdate(
|
|
98
|
+
{ _id: new ObjectId(id) },
|
|
99
|
+
{ $set: { isActive: true } },
|
|
100
|
+
{ returnDocument: "after" },
|
|
101
|
+
);
|
|
102
|
+
return Boolean(result);
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Deactivate a system instruction by id, sets isActive to false.
|
|
106
|
+
* Does not check the current instruction state, calling this on a deactivated instruction will do nothing.
|
|
107
|
+
* @param id system instruction id
|
|
108
|
+
* @returns true on success, false otherwise
|
|
109
|
+
*/
|
|
110
|
+
export const deactivateSystemInstruction = async (
|
|
111
|
+
id: string,
|
|
112
|
+
): Promise<boolean> => {
|
|
113
|
+
const result = await getSystemInstructionsCollection().findOneAndUpdate(
|
|
114
|
+
{ _id: new ObjectId(id) },
|
|
115
|
+
{ $set: { isActive: false } },
|
|
116
|
+
{ returnDocument: "after" },
|
|
117
|
+
);
|
|
118
|
+
return Boolean(result);
|
|
119
|
+
};
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { ObjectId } from "mongodb";
|
|
2
|
-
|
|
3
|
-
import { CityName } from "../utils/types";
|
|
4
|
-
|
|
5
|
-
export const MIS_TOOLS = {
|
|
6
|
-
findStreet: "findStreet",
|
|
7
|
-
findSubject: "findSubject",
|
|
8
|
-
} as const;
|
|
9
|
-
|
|
10
|
-
export const QUERY_TYPES = {
|
|
11
|
-
exactlyOne: "exactlyOne",
|
|
12
|
-
any: "any",
|
|
13
|
-
all: "all",
|
|
14
|
-
none: "none",
|
|
15
|
-
} as const;
|
|
16
|
-
|
|
17
|
-
export type MIS_Tool = (typeof MIS_TOOLS)[keyof typeof MIS_TOOLS];
|
|
18
|
-
export type QueryType = (typeof QUERY_TYPES)[keyof typeof QUERY_TYPES];
|
|
19
|
-
|
|
20
|
-
export type MIS_SystemInstruction = {
|
|
21
|
-
_id: ObjectId;
|
|
22
|
-
createdAt: Date;
|
|
23
|
-
updatedAt: Date;
|
|
24
|
-
cityName: CityName;
|
|
25
|
-
instruction: string;
|
|
26
|
-
isActive: boolean;
|
|
27
|
-
tool: MIS_Tool;
|
|
28
|
-
queryType: QueryType;
|
|
29
|
-
tags?: string[]; //no tags implies all wildcard (?)
|
|
30
|
-
};
|
|
1
|
+
import { ObjectId } from "mongodb";
|
|
2
|
+
|
|
3
|
+
import { CityName } from "../utils/types";
|
|
4
|
+
|
|
5
|
+
export const MIS_TOOLS = {
|
|
6
|
+
findStreet: "findStreet",
|
|
7
|
+
findSubject: "findSubject",
|
|
8
|
+
} as const;
|
|
9
|
+
|
|
10
|
+
export const QUERY_TYPES = {
|
|
11
|
+
exactlyOne: "exactlyOne",
|
|
12
|
+
any: "any",
|
|
13
|
+
all: "all",
|
|
14
|
+
none: "none",
|
|
15
|
+
} as const;
|
|
16
|
+
|
|
17
|
+
export type MIS_Tool = (typeof MIS_TOOLS)[keyof typeof MIS_TOOLS];
|
|
18
|
+
export type QueryType = (typeof QUERY_TYPES)[keyof typeof QUERY_TYPES];
|
|
19
|
+
|
|
20
|
+
export type MIS_SystemInstruction = {
|
|
21
|
+
_id: ObjectId;
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
updatedAt: Date;
|
|
24
|
+
cityName: CityName;
|
|
25
|
+
instruction: string;
|
|
26
|
+
isActive: boolean;
|
|
27
|
+
tool: MIS_Tool;
|
|
28
|
+
queryType: QueryType;
|
|
29
|
+
tags?: string[]; //no tags implies all wildcard (?)
|
|
30
|
+
};
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
import {
|
|
2
|
-
findTicketsByCallSid,
|
|
3
|
-
getTicketsCountByCityAndDateRange,
|
|
4
|
-
} from "../tickets.getters";
|
|
5
|
-
import { setDb } from "../../index";
|
|
6
|
-
import { Db, Collection } from "mongodb";
|
|
7
|
-
import { createTicket } from "../../../test-utils/factories";
|
|
8
|
-
|
|
9
|
-
describe("tickets getters", () => {
|
|
10
|
-
let mockDb: Partial<Db>;
|
|
11
|
-
let mockCollection: Partial<Collection>;
|
|
12
|
-
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
const mockTicket = createTicket({ callSid: "123" });
|
|
15
|
-
mockCollection = {
|
|
16
|
-
find: jest.fn().mockReturnValue({
|
|
17
|
-
toArray: jest.fn().mockResolvedValue([mockTicket]),
|
|
18
|
-
}),
|
|
19
|
-
};
|
|
20
|
-
mockDb = {
|
|
21
|
-
collection: jest.fn().mockReturnValue(mockCollection),
|
|
22
|
-
};
|
|
23
|
-
setDb(mockDb as Db);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("findTicketsByCallSid should return tickets for the given callSid", async () => {
|
|
27
|
-
const result = await findTicketsByCallSid("123");
|
|
28
|
-
|
|
29
|
-
expect(mockDb.collection).toHaveBeenCalledWith("tickets");
|
|
30
|
-
expect(mockCollection.find).toHaveBeenCalledWith({ callSid: "123" });
|
|
31
|
-
expect(result[0].callSid).toBe("123");
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it("getTicketsCountByCityAndDateRange should not count tickets without callSid", async () => {
|
|
35
|
-
const aggregateNext = jest.fn().mockResolvedValue({ n: 1 });
|
|
36
|
-
mockCollection = {
|
|
37
|
-
...mockCollection,
|
|
38
|
-
aggregate: jest.fn().mockReturnValue({
|
|
39
|
-
next: aggregateNext,
|
|
40
|
-
}),
|
|
41
|
-
};
|
|
42
|
-
mockDb = {
|
|
43
|
-
collection: jest.fn().mockReturnValue(mockCollection),
|
|
44
|
-
};
|
|
45
|
-
setDb(mockDb as Db);
|
|
46
|
-
|
|
47
|
-
const result = await getTicketsCountByCityAndDateRange(
|
|
48
|
-
"ashdod",
|
|
49
|
-
"2026-01-01",
|
|
50
|
-
"2026-01-31",
|
|
51
|
-
"Asia/Jerusalem",
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
expect(mockCollection.aggregate).toHaveBeenCalledWith(
|
|
55
|
-
expect.arrayContaining([
|
|
56
|
-
{
|
|
57
|
-
$match: {
|
|
58
|
-
cityName: "ashdod",
|
|
59
|
-
callSid: { $exists: true, $nin: [null, ""] },
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
]),
|
|
63
|
-
);
|
|
64
|
-
expect(result).toBe(1);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
1
|
+
import {
|
|
2
|
+
findTicketsByCallSid,
|
|
3
|
+
getTicketsCountByCityAndDateRange,
|
|
4
|
+
} from "../tickets.getters";
|
|
5
|
+
import { setDb } from "../../index";
|
|
6
|
+
import { Db, Collection } from "mongodb";
|
|
7
|
+
import { createTicket } from "../../../test-utils/factories";
|
|
8
|
+
|
|
9
|
+
describe("tickets getters", () => {
|
|
10
|
+
let mockDb: Partial<Db>;
|
|
11
|
+
let mockCollection: Partial<Collection>;
|
|
12
|
+
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
const mockTicket = createTicket({ callSid: "123" });
|
|
15
|
+
mockCollection = {
|
|
16
|
+
find: jest.fn().mockReturnValue({
|
|
17
|
+
toArray: jest.fn().mockResolvedValue([mockTicket]),
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
mockDb = {
|
|
21
|
+
collection: jest.fn().mockReturnValue(mockCollection),
|
|
22
|
+
};
|
|
23
|
+
setDb(mockDb as Db);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("findTicketsByCallSid should return tickets for the given callSid", async () => {
|
|
27
|
+
const result = await findTicketsByCallSid("123");
|
|
28
|
+
|
|
29
|
+
expect(mockDb.collection).toHaveBeenCalledWith("tickets");
|
|
30
|
+
expect(mockCollection.find).toHaveBeenCalledWith({ callSid: "123" });
|
|
31
|
+
expect(result[0].callSid).toBe("123");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("getTicketsCountByCityAndDateRange should not count tickets without callSid", async () => {
|
|
35
|
+
const aggregateNext = jest.fn().mockResolvedValue({ n: 1 });
|
|
36
|
+
mockCollection = {
|
|
37
|
+
...mockCollection,
|
|
38
|
+
aggregate: jest.fn().mockReturnValue({
|
|
39
|
+
next: aggregateNext,
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
mockDb = {
|
|
43
|
+
collection: jest.fn().mockReturnValue(mockCollection),
|
|
44
|
+
};
|
|
45
|
+
setDb(mockDb as Db);
|
|
46
|
+
|
|
47
|
+
const result = await getTicketsCountByCityAndDateRange(
|
|
48
|
+
"ashdod",
|
|
49
|
+
"2026-01-01",
|
|
50
|
+
"2026-01-31",
|
|
51
|
+
"Asia/Jerusalem",
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
expect(mockCollection.aggregate).toHaveBeenCalledWith(
|
|
55
|
+
expect.arrayContaining([
|
|
56
|
+
{
|
|
57
|
+
$match: {
|
|
58
|
+
cityName: "ashdod",
|
|
59
|
+
callSid: { $exists: true, $nin: [null, ""] },
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
]),
|
|
63
|
+
);
|
|
64
|
+
expect(result).toBe(1);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./tickets.getters";
|
|
2
|
-
export type { Ticket, TicketDoc, SubjectStatsItem } from "./tickets.types";
|
|
1
|
+
export * from "./tickets.getters";
|
|
2
|
+
export type { Ticket, TicketDoc, SubjectStatsItem } from "./tickets.types";
|