codebase-models 2.1.16 → 2.1.19
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/index.d.ts +2 -1
- package/dist/index.js +3 -1
- package/dist/src/models/Role.d.ts +11 -0
- package/dist/src/models/Role.js +33 -1
- package/dist/src/models/Test.js +1 -1
- package/dist/src/models/UserPermission.d.ts +44 -0
- package/dist/src/models/UserPermission.js +55 -0
- package/index.ts +2 -0
- package/package.json +1 -1
- package/src/models/Role.ts +49 -2
- package/src/models/Test.ts +1 -1
- package/src/models/UserPermission.ts +53 -0
package/dist/index.d.ts
CHANGED
|
@@ -65,6 +65,7 @@ import Tag from "./src/models/Tag";
|
|
|
65
65
|
import Temp from "./src/models/Temp";
|
|
66
66
|
import Tier from "./src/models/Tier";
|
|
67
67
|
import Trigger from "./src/models/Trigger";
|
|
68
|
+
import UserPermission from "./src/models/UserPermission";
|
|
68
69
|
import ClientScript from "./src/models/ClientScript";
|
|
69
70
|
import Audience from "./src/models/Audience";
|
|
70
71
|
import Environment from "./src/models/Environment";
|
|
@@ -75,4 +76,4 @@ import { generateRandomIID } from "./src/constant";
|
|
|
75
76
|
import TestTimeline from "./src/models/TestTimeline";
|
|
76
77
|
import CronData from "./src/models/CronData";
|
|
77
78
|
export declare function connect(uri: string, options?: mongoose.ConnectOptions | undefined): Promise<typeof mongoose>;
|
|
78
|
-
export { generateRandomIID, Client, ClientReportsTemp, QueryLog, Report, Test, TestSequentialValue, User, AppEvent, Announcement, ClientAdditionalRevenue, ClientLearning, ClientLinks, ClientNextStep, ClientNote, ClientRetention, ClientStrategy, ClientSurvey, CVRReport, Faq, Feedback, Goal, Hypothesis, HypothesisSheet, LandingPages, NewIdeas, Notification, Page, PageElement, PageTestType, Portfolio, ReadNotification, Role, CustomQuery, SavedSegment, TestTimeline, Segment, SegmentCombination, Snippet, StageInCustomerJourney, Tag, Temp, Tier, Trigger, ClientScript, Audience, Environment, Organization, PrecalculationFilters, BqPreCompiledData, CronData, };
|
|
79
|
+
export { generateRandomIID, Client, ClientReportsTemp, QueryLog, Report, Test, TestSequentialValue, User, AppEvent, Announcement, ClientAdditionalRevenue, ClientLearning, ClientLinks, ClientNextStep, ClientNote, ClientRetention, ClientStrategy, ClientSurvey, CVRReport, Faq, Feedback, Goal, Hypothesis, HypothesisSheet, LandingPages, NewIdeas, Notification, Page, PageElement, PageTestType, Portfolio, ReadNotification, Role, CustomQuery, SavedSegment, TestTimeline, Segment, SegmentCombination, Snippet, StageInCustomerJourney, Tag, Temp, Tier, Trigger, ClientScript, Audience, Environment, Organization, PrecalculationFilters, BqPreCompiledData, CronData, UserPermission, };
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.PrecalculationFilters = exports.Organization = exports.Environment = exports.Audience = exports.ClientScript = exports.Trigger = exports.Tier = exports.Temp = exports.Tag = exports.StageInCustomerJourney = exports.Snippet = exports.SegmentCombination = exports.Segment = exports.TestTimeline = exports.SavedSegment = exports.CustomQuery = exports.Role = exports.ReadNotification = exports.Portfolio = exports.PageTestType = exports.PageElement = exports.Page = exports.Notification = exports.NewIdeas = exports.LandingPages = exports.HypothesisSheet = exports.Hypothesis = exports.Goal = exports.Feedback = exports.Faq = exports.CVRReport = exports.ClientSurvey = exports.ClientStrategy = exports.ClientRetention = exports.ClientNote = exports.ClientNextStep = exports.ClientLinks = exports.ClientLearning = exports.ClientAdditionalRevenue = exports.Announcement = exports.AppEvent = exports.User = exports.TestSequentialValue = exports.Test = exports.Report = exports.QueryLog = exports.ClientReportsTemp = exports.Client = exports.generateRandomIID = exports.connect = void 0;
|
|
16
|
-
exports.CronData = exports.BqPreCompiledData = void 0;
|
|
16
|
+
exports.UserPermission = exports.CronData = exports.BqPreCompiledData = void 0;
|
|
17
17
|
const mongoose_1 = __importDefault(require("mongoose"));
|
|
18
18
|
const Client_1 = __importDefault(require("./src/models/Client"));
|
|
19
19
|
exports.Client = Client_1.default;
|
|
@@ -99,6 +99,8 @@ const Tier_1 = __importDefault(require("./src/models/Tier"));
|
|
|
99
99
|
exports.Tier = Tier_1.default;
|
|
100
100
|
const Trigger_1 = __importDefault(require("./src/models/Trigger"));
|
|
101
101
|
exports.Trigger = Trigger_1.default;
|
|
102
|
+
const UserPermission_1 = __importDefault(require("./src/models/UserPermission"));
|
|
103
|
+
exports.UserPermission = UserPermission_1.default;
|
|
102
104
|
const ClientScript_1 = __importDefault(require("./src/models/ClientScript"));
|
|
103
105
|
exports.ClientScript = ClientScript_1.default;
|
|
104
106
|
const Audience_1 = __importDefault(require("./src/models/Audience"));
|
|
@@ -30,6 +30,17 @@ export interface IRole extends Document {
|
|
|
30
30
|
isActive?: boolean;
|
|
31
31
|
createdAt?: Date;
|
|
32
32
|
updatedAt?: Date;
|
|
33
|
+
defaultPermissions?: {
|
|
34
|
+
dashboard: boolean;
|
|
35
|
+
reporting: boolean;
|
|
36
|
+
insights: boolean;
|
|
37
|
+
documentsAndLinks: boolean;
|
|
38
|
+
cvrReports: boolean;
|
|
39
|
+
abTesting: boolean;
|
|
40
|
+
abTestingDefault: boolean;
|
|
41
|
+
manageExperiments: boolean;
|
|
42
|
+
preCalculations: boolean;
|
|
43
|
+
};
|
|
33
44
|
}
|
|
34
45
|
declare const Role: mongoose.Model<any, {}, {}, {}, any, any>;
|
|
35
46
|
export default Role;
|
package/dist/src/models/Role.js
CHANGED
|
@@ -29,7 +29,7 @@ const RoleSchema = new mongoose_1.Schema({
|
|
|
29
29
|
type: String,
|
|
30
30
|
unique: true,
|
|
31
31
|
required: true,
|
|
32
|
-
enum: ["USER", "ADMIN", "EDITOR", "COLLABORATOR", "CLIENT"],
|
|
32
|
+
enum: ["USER", "ADMIN", "EDITOR", "COLLABORATOR", "CLIENT", "EXTERNAL"],
|
|
33
33
|
trim: true,
|
|
34
34
|
uppercase: true,
|
|
35
35
|
},
|
|
@@ -45,10 +45,42 @@ const RoleSchema = new mongoose_1.Schema({
|
|
|
45
45
|
isActive: {
|
|
46
46
|
type: Boolean,
|
|
47
47
|
default: true,
|
|
48
|
+
},
|
|
49
|
+
defaultPermissions: {
|
|
50
|
+
abTestingDefault: { type: Boolean, default: true },
|
|
51
|
+
abTesting: { type: Boolean, default: false },
|
|
52
|
+
preCalculations: { type: Boolean, default: true },
|
|
53
|
+
reporting: { type: Boolean, default: true },
|
|
54
|
+
insights: { type: Boolean, default: true },
|
|
55
|
+
documentsAndLinks: { type: Boolean, default: true },
|
|
56
|
+
cvrReports: { type: Boolean, default: true },
|
|
57
|
+
manageExperiments: { type: Boolean, default: true },
|
|
58
|
+
dashboard: { type: Boolean, default: true },
|
|
48
59
|
}
|
|
49
60
|
}, {
|
|
50
61
|
timestamps: true
|
|
51
62
|
});
|
|
63
|
+
// IF role is CLIENT then defaultPermissions should be false for all modules except reporting, insights, documentsAndLinks, cvrReports, dashboard
|
|
64
|
+
RoleSchema.pre('save', function (next) {
|
|
65
|
+
const allTrue = {
|
|
66
|
+
abTestingDefault: true,
|
|
67
|
+
abTesting: true,
|
|
68
|
+
manageExperiments: true,
|
|
69
|
+
preCalculations: true,
|
|
70
|
+
reporting: true,
|
|
71
|
+
insights: true,
|
|
72
|
+
documentsAndLinks: true,
|
|
73
|
+
cvrReports: true,
|
|
74
|
+
dashboard: true,
|
|
75
|
+
};
|
|
76
|
+
if (this.name === 'CLIENT') {
|
|
77
|
+
this.defaultPermissions = Object.assign(Object.assign({}, allTrue), { abTesting: false });
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this.defaultPermissions = Object.assign(Object.assign({}, allTrue), { abTestingDefault: false });
|
|
81
|
+
}
|
|
82
|
+
next();
|
|
83
|
+
});
|
|
52
84
|
// Compound indexes for common query patterns
|
|
53
85
|
RoleSchema.index({ name: 1, isActive: 1 });
|
|
54
86
|
RoleSchema.index({ organizationId: 1, name: 1 });
|
package/dist/src/models/Test.js
CHANGED
|
@@ -59,7 +59,7 @@ const TestSchema = new mongoose_1.Schema({
|
|
|
59
59
|
status: {
|
|
60
60
|
type: String,
|
|
61
61
|
default: "draft",
|
|
62
|
-
enum: ["live", "draft", "ended", "paused", "preview", "running", "
|
|
62
|
+
enum: ["live", "draft", "ended", "paused", "preview", "running", "archive"]
|
|
63
63
|
},
|
|
64
64
|
name: { type: String, required: true },
|
|
65
65
|
traffic_allocation: { type: Number, default: 100 },
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/// <reference types="mongoose/types/aggregate" />
|
|
2
|
+
/// <reference types="mongoose/types/callback" />
|
|
3
|
+
/// <reference types="mongoose/types/collection" />
|
|
4
|
+
/// <reference types="mongoose/types/connection" />
|
|
5
|
+
/// <reference types="mongoose/types/cursor" />
|
|
6
|
+
/// <reference types="mongoose/types/document" />
|
|
7
|
+
/// <reference types="mongoose/types/error" />
|
|
8
|
+
/// <reference types="mongoose/types/expressions" />
|
|
9
|
+
/// <reference types="mongoose/types/helpers" />
|
|
10
|
+
/// <reference types="mongoose/types/middlewares" />
|
|
11
|
+
/// <reference types="mongoose/types/indexes" />
|
|
12
|
+
/// <reference types="mongoose/types/models" />
|
|
13
|
+
/// <reference types="mongoose/types/mongooseoptions" />
|
|
14
|
+
/// <reference types="mongoose/types/pipelinestage" />
|
|
15
|
+
/// <reference types="mongoose/types/populate" />
|
|
16
|
+
/// <reference types="mongoose/types/query" />
|
|
17
|
+
/// <reference types="mongoose/types/schemaoptions" />
|
|
18
|
+
/// <reference types="mongoose/types/schematypes" />
|
|
19
|
+
/// <reference types="mongoose/types/session" />
|
|
20
|
+
/// <reference types="mongoose/types/types" />
|
|
21
|
+
/// <reference types="mongoose/types/utility" />
|
|
22
|
+
/// <reference types="mongoose/types/validation" />
|
|
23
|
+
/// <reference types="mongoose/types/virtuals" />
|
|
24
|
+
/// <reference types="mongoose/types/inferschematype" />
|
|
25
|
+
import mongoose, { Document } from "mongoose";
|
|
26
|
+
export interface IUserPermission extends Document {
|
|
27
|
+
userId: mongoose.Schema.Types.ObjectId;
|
|
28
|
+
clientId: mongoose.Schema.Types.ObjectId;
|
|
29
|
+
permissions: {
|
|
30
|
+
dashboard: boolean;
|
|
31
|
+
reporting: boolean;
|
|
32
|
+
insights: boolean;
|
|
33
|
+
documentsAndLinks: boolean;
|
|
34
|
+
cvrReports: boolean;
|
|
35
|
+
abTesting: boolean;
|
|
36
|
+
abTestingDefault: boolean;
|
|
37
|
+
manageExperiments: boolean;
|
|
38
|
+
preCalculations: boolean;
|
|
39
|
+
};
|
|
40
|
+
createdAt: Date;
|
|
41
|
+
updatedAt: Date;
|
|
42
|
+
}
|
|
43
|
+
declare const UserPermission: mongoose.Model<any, {}, {}, {}, any, any>;
|
|
44
|
+
export default UserPermission;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const mongoose_1 = __importStar(require("mongoose"));
|
|
27
|
+
const UserPermissionSchema = new mongoose_1.Schema({
|
|
28
|
+
userId: {
|
|
29
|
+
type: mongoose_1.default.Schema.Types.ObjectId,
|
|
30
|
+
ref: "user",
|
|
31
|
+
required: true,
|
|
32
|
+
},
|
|
33
|
+
clientId: {
|
|
34
|
+
type: mongoose_1.default.Schema.Types.ObjectId,
|
|
35
|
+
ref: "client",
|
|
36
|
+
required: true,
|
|
37
|
+
},
|
|
38
|
+
permissions: {
|
|
39
|
+
abTestingDefault: { type: Boolean, default: true },
|
|
40
|
+
abTesting: { type: Boolean, default: false },
|
|
41
|
+
preCalculations: { type: Boolean, default: false },
|
|
42
|
+
reporting: { type: Boolean, default: true },
|
|
43
|
+
insights: { type: Boolean, default: true },
|
|
44
|
+
documentsAndLinks: { type: Boolean, default: true },
|
|
45
|
+
cvrReports: { type: Boolean, default: true },
|
|
46
|
+
manageExperiments: { type: Boolean, default: false },
|
|
47
|
+
dashboard: { type: Boolean, default: true },
|
|
48
|
+
},
|
|
49
|
+
}, {
|
|
50
|
+
timestamps: true,
|
|
51
|
+
});
|
|
52
|
+
// Add compound indexes for common query patterns
|
|
53
|
+
UserPermissionSchema.index({ userId: 1, clientId: 1 }, { unique: true });
|
|
54
|
+
const UserPermission = mongoose_1.default.models.userpermission || (0, mongoose_1.model)("userpermission", UserPermissionSchema);
|
|
55
|
+
exports.default = UserPermission;
|
package/index.ts
CHANGED
|
@@ -42,6 +42,7 @@ import Tag from "./src/models/Tag";
|
|
|
42
42
|
import Temp from "./src/models/Temp";
|
|
43
43
|
import Tier from "./src/models/Tier";
|
|
44
44
|
import Trigger from "./src/models/Trigger";
|
|
45
|
+
import UserPermission from "./src/models/UserPermission";
|
|
45
46
|
import ClientScript from "./src/models/ClientScript";
|
|
46
47
|
import Audience from "./src/models/Audience";
|
|
47
48
|
import Environment from "./src/models/Environment";
|
|
@@ -150,4 +151,5 @@ export {
|
|
|
150
151
|
PrecalculationFilters,
|
|
151
152
|
BqPreCompiledData,
|
|
152
153
|
CronData,
|
|
154
|
+
UserPermission,
|
|
153
155
|
};
|
package/package.json
CHANGED
package/src/models/Role.ts
CHANGED
|
@@ -7,6 +7,17 @@ export interface IRole extends Document {
|
|
|
7
7
|
isActive?: boolean;
|
|
8
8
|
createdAt?: Date;
|
|
9
9
|
updatedAt?: Date;
|
|
10
|
+
defaultPermissions?: {
|
|
11
|
+
dashboard: boolean;
|
|
12
|
+
reporting: boolean;
|
|
13
|
+
insights: boolean;
|
|
14
|
+
documentsAndLinks: boolean;
|
|
15
|
+
cvrReports: boolean;
|
|
16
|
+
abTesting: boolean;
|
|
17
|
+
abTestingDefault: boolean;
|
|
18
|
+
manageExperiments: boolean;
|
|
19
|
+
preCalculations: boolean;
|
|
20
|
+
};
|
|
10
21
|
}
|
|
11
22
|
|
|
12
23
|
const RoleSchema = new Schema<IRole>({
|
|
@@ -14,7 +25,7 @@ const RoleSchema = new Schema<IRole>({
|
|
|
14
25
|
type: String,
|
|
15
26
|
unique: true,
|
|
16
27
|
required: true,
|
|
17
|
-
enum: ["USER", "ADMIN", "EDITOR", "COLLABORATOR", "CLIENT"],
|
|
28
|
+
enum: ["USER", "ADMIN", "EDITOR", "COLLABORATOR", "CLIENT", "EXTERNAL"],
|
|
18
29
|
trim: true,
|
|
19
30
|
uppercase: true,
|
|
20
31
|
},
|
|
@@ -30,11 +41,47 @@ const RoleSchema = new Schema<IRole>({
|
|
|
30
41
|
isActive: {
|
|
31
42
|
type: Boolean,
|
|
32
43
|
default: true,
|
|
33
|
-
|
|
44
|
+
},
|
|
45
|
+
defaultPermissions: {
|
|
46
|
+
abTestingDefault: { type: Boolean, default: true },
|
|
47
|
+
abTesting: { type: Boolean, default: false },
|
|
48
|
+
preCalculations: { type: Boolean, default: true },
|
|
49
|
+
reporting: { type: Boolean, default: true },
|
|
50
|
+
insights: { type: Boolean, default: true },
|
|
51
|
+
documentsAndLinks: { type: Boolean, default: true },
|
|
52
|
+
cvrReports: { type: Boolean, default: true },
|
|
53
|
+
manageExperiments: { type: Boolean, default: true },
|
|
54
|
+
dashboard: { type: Boolean, default: true },
|
|
34
55
|
}
|
|
35
56
|
}, {
|
|
36
57
|
timestamps: true
|
|
37
58
|
});
|
|
59
|
+
// IF role is CLIENT then defaultPermissions should be false for all modules except reporting, insights, documentsAndLinks, cvrReports, dashboard
|
|
60
|
+
RoleSchema.pre('save', function(next) {
|
|
61
|
+
const allTrue = {
|
|
62
|
+
abTestingDefault: true,
|
|
63
|
+
abTesting: true,
|
|
64
|
+
manageExperiments: true,
|
|
65
|
+
preCalculations: true,
|
|
66
|
+
reporting: true,
|
|
67
|
+
insights: true,
|
|
68
|
+
documentsAndLinks: true,
|
|
69
|
+
cvrReports: true,
|
|
70
|
+
dashboard: true,
|
|
71
|
+
};
|
|
72
|
+
if (this.name === 'CLIENT') {
|
|
73
|
+
this.defaultPermissions = {
|
|
74
|
+
...allTrue,
|
|
75
|
+
abTesting: false, // only this one is false
|
|
76
|
+
};
|
|
77
|
+
} else {
|
|
78
|
+
this.defaultPermissions = {
|
|
79
|
+
...allTrue,
|
|
80
|
+
abTestingDefault: false,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
next();
|
|
84
|
+
});
|
|
38
85
|
|
|
39
86
|
// Compound indexes for common query patterns
|
|
40
87
|
RoleSchema.index({ name: 1, isActive: 1 });
|
package/src/models/Test.ts
CHANGED
|
@@ -107,7 +107,7 @@ const TestSchema = new Schema<ITest>(
|
|
|
107
107
|
status: {
|
|
108
108
|
type: String,
|
|
109
109
|
default: "draft",
|
|
110
|
-
enum: ["live", "draft", "ended", "paused", "preview", "running", "
|
|
110
|
+
enum: ["live", "draft", "ended", "paused", "preview", "running", "archive"]
|
|
111
111
|
},
|
|
112
112
|
name: { type: String, required: true },
|
|
113
113
|
traffic_allocation: { type: Number, default: 100 },
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import mongoose, { Document, Schema, model } from "mongoose";
|
|
2
|
+
|
|
3
|
+
export interface IUserPermission extends Document {
|
|
4
|
+
userId: mongoose.Schema.Types.ObjectId;
|
|
5
|
+
clientId: mongoose.Schema.Types.ObjectId;
|
|
6
|
+
permissions: {
|
|
7
|
+
dashboard: boolean;
|
|
8
|
+
reporting: boolean;
|
|
9
|
+
insights: boolean;
|
|
10
|
+
documentsAndLinks: boolean;
|
|
11
|
+
cvrReports: boolean;
|
|
12
|
+
abTesting: boolean;
|
|
13
|
+
abTestingDefault: boolean;
|
|
14
|
+
manageExperiments: boolean;
|
|
15
|
+
preCalculations: boolean;
|
|
16
|
+
}
|
|
17
|
+
createdAt: Date;
|
|
18
|
+
updatedAt: Date;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const UserPermissionSchema = new Schema<IUserPermission>({
|
|
22
|
+
userId: {
|
|
23
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
24
|
+
ref: "user",
|
|
25
|
+
required: true,
|
|
26
|
+
},
|
|
27
|
+
clientId: {
|
|
28
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
29
|
+
ref: "client",
|
|
30
|
+
required: true,
|
|
31
|
+
},
|
|
32
|
+
permissions: {
|
|
33
|
+
abTestingDefault: { type: Boolean, default: true },
|
|
34
|
+
abTesting: { type: Boolean, default: false },
|
|
35
|
+
preCalculations: { type: Boolean, default: false },
|
|
36
|
+
reporting: { type: Boolean, default: true },
|
|
37
|
+
insights: { type: Boolean, default: true },
|
|
38
|
+
documentsAndLinks: { type: Boolean, default: true },
|
|
39
|
+
cvrReports: { type: Boolean, default: true },
|
|
40
|
+
manageExperiments: { type: Boolean, default: false },
|
|
41
|
+
dashboard: { type: Boolean, default: true },
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
timestamps: true,
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
// Add compound indexes for common query patterns
|
|
50
|
+
UserPermissionSchema.index({ userId: 1, clientId: 1 },{ unique: true });
|
|
51
|
+
|
|
52
|
+
const UserPermission = mongoose.models.userpermission || model<IUserPermission>("userpermission", UserPermissionSchema);
|
|
53
|
+
export default UserPermission;
|