@oneuptime/common 7.0.4428 → 7.0.4453
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/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +473 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1749813704371-MigrationName.ts +67 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/ProjectAuthorization.ts +2 -4
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/StatusPageAnnouncementTemplateService.ts +10 -0
- package/Server/Utils/OpenAPI.ts +12 -10
- package/Tests/Server/Middleware/ProjectAuthorization.test.ts +3 -1
- package/Tests/UI/Components/Input.test.tsx +22 -0
- package/Tests/UI/Components/MarkdownEditor.test.tsx +61 -0
- package/Tests/UI/Components/TextArea.test.tsx +22 -0
- package/Types/Permission.ts +80 -8
- package/UI/Components/CodeEditor/CodeEditor.tsx +33 -0
- package/UI/Components/Forms/Fields/FormField.tsx +2 -0
- package/UI/Components/Forms/Types/Field.ts +3 -0
- package/UI/Components/Input/Input.tsx +2 -0
- package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +2 -0
- package/UI/Components/TextArea/TextArea.tsx +2 -0
- package/Utils/Schema/AnalyticsModelSchema.ts +0 -5
- package/Utils/Schema/ModelSchema.ts +0 -26
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +488 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1749813704371-MigrationName.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1749813704371-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +2 -2
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/StatusPageAnnouncementTemplateService.js +9 -0
- package/build/dist/Server/Services/StatusPageAnnouncementTemplateService.js.map +1 -0
- package/build/dist/Server/Utils/OpenAPI.js +12 -10
- package/build/dist/Server/Utils/OpenAPI.js.map +1 -1
- package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js +1 -1
- package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/Input.test.js +16 -0
- package/build/dist/Tests/UI/Components/Input.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/MarkdownEditor.test.js +25 -0
- package/build/dist/Tests/UI/Components/MarkdownEditor.test.js.map +1 -0
- package/build/dist/Tests/UI/Components/TextArea.test.js +16 -1
- package/build/dist/Tests/UI/Components/TextArea.test.js.map +1 -1
- package/build/dist/Types/Permission.js +69 -8
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +2 -2
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +1 -1
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
- package/build/dist/UI/Components/TextArea/TextArea.js +1 -1
- package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
- package/build/dist/Utils/Schema/AnalyticsModelSchema.js +0 -2
- package/build/dist/Utils/Schema/AnalyticsModelSchema.js.map +1 -1
- package/build/dist/Utils/Schema/ModelSchema.js +2 -10
- package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
- package/package.json +1 -1
|
@@ -103,6 +103,7 @@ import SmsLog from "./SmsLog";
|
|
|
103
103
|
// Status Page
|
|
104
104
|
import StatusPage from "./StatusPage";
|
|
105
105
|
import StatusPageAnnouncement from "./StatusPageAnnouncement";
|
|
106
|
+
import StatusPageAnnouncementTemplate from "./StatusPageAnnouncementTemplate";
|
|
106
107
|
import StatusPageCustomField from "./StatusPageCustomField";
|
|
107
108
|
import StatusPageDomain from "./StatusPageDomain";
|
|
108
109
|
import StatusPageFooterLink from "./StatusPageFooterLink";
|
|
@@ -247,6 +248,7 @@ const AllModelTypes: Array<{
|
|
|
247
248
|
StatusPageResource,
|
|
248
249
|
|
|
249
250
|
StatusPageAnnouncement,
|
|
251
|
+
StatusPageAnnouncementTemplate,
|
|
250
252
|
StatusPageSubscriber,
|
|
251
253
|
StatusPageFooterLink,
|
|
252
254
|
StatusPageHeaderLink,
|
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
import Project from "./Project";
|
|
2
|
+
import StatusPage from "./StatusPage";
|
|
3
|
+
import User from "./User";
|
|
4
|
+
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
|
5
|
+
import Route from "../../Types/API/Route";
|
|
6
|
+
import { PlanType } from "../../Types/Billing/SubscriptionPlan";
|
|
7
|
+
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
|
8
|
+
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
|
9
|
+
import TableBillingAccessControl from "../../Types/Database/AccessControl/TableBillingAccessControl";
|
|
10
|
+
import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn";
|
|
11
|
+
import ColumnLength from "../../Types/Database/ColumnLength";
|
|
12
|
+
import ColumnType from "../../Types/Database/ColumnType";
|
|
13
|
+
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
|
14
|
+
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
|
|
15
|
+
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
|
|
16
|
+
import SlugifyColumn from "../../Types/Database/SlugifyColumn";
|
|
17
|
+
import TableColumn from "../../Types/Database/TableColumn";
|
|
18
|
+
import TableColumnType from "../../Types/Database/TableColumnType";
|
|
19
|
+
import TableMetadata from "../../Types/Database/TableMetadata";
|
|
20
|
+
import TenantColumn from "../../Types/Database/TenantColumn";
|
|
21
|
+
import IconProp from "../../Types/Icon/IconProp";
|
|
22
|
+
import ObjectID from "../../Types/ObjectID";
|
|
23
|
+
import Permission from "../../Types/Permission";
|
|
24
|
+
import {
|
|
25
|
+
Column,
|
|
26
|
+
Entity,
|
|
27
|
+
Index,
|
|
28
|
+
JoinColumn,
|
|
29
|
+
JoinTable,
|
|
30
|
+
ManyToMany,
|
|
31
|
+
ManyToOne,
|
|
32
|
+
} from "typeorm";
|
|
33
|
+
|
|
34
|
+
@EnableDocumentation()
|
|
35
|
+
@TenantColumn("projectId")
|
|
36
|
+
@CanAccessIfCanReadOn("statusPages")
|
|
37
|
+
@TableBillingAccessControl({
|
|
38
|
+
create: PlanType.Growth,
|
|
39
|
+
read: PlanType.Growth,
|
|
40
|
+
update: PlanType.Growth,
|
|
41
|
+
delete: PlanType.Growth,
|
|
42
|
+
})
|
|
43
|
+
@TableAccessControl({
|
|
44
|
+
create: [
|
|
45
|
+
Permission.ProjectOwner,
|
|
46
|
+
Permission.ProjectAdmin,
|
|
47
|
+
Permission.ProjectMember,
|
|
48
|
+
Permission.CreateStatusPageAnnouncementTemplate,
|
|
49
|
+
],
|
|
50
|
+
read: [
|
|
51
|
+
Permission.ProjectOwner,
|
|
52
|
+
Permission.ProjectAdmin,
|
|
53
|
+
Permission.ProjectMember,
|
|
54
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
55
|
+
],
|
|
56
|
+
delete: [
|
|
57
|
+
Permission.ProjectOwner,
|
|
58
|
+
Permission.ProjectAdmin,
|
|
59
|
+
Permission.ProjectMember,
|
|
60
|
+
Permission.DeleteStatusPageAnnouncementTemplate,
|
|
61
|
+
],
|
|
62
|
+
update: [
|
|
63
|
+
Permission.ProjectOwner,
|
|
64
|
+
Permission.ProjectAdmin,
|
|
65
|
+
Permission.ProjectMember,
|
|
66
|
+
Permission.EditStatusPageAnnouncementTemplate,
|
|
67
|
+
],
|
|
68
|
+
})
|
|
69
|
+
@EnableWorkflow({
|
|
70
|
+
create: true,
|
|
71
|
+
delete: true,
|
|
72
|
+
update: true,
|
|
73
|
+
read: true,
|
|
74
|
+
})
|
|
75
|
+
@CrudApiEndpoint(new Route("/status-page-announcement-template"))
|
|
76
|
+
@SlugifyColumn("templateName", "slug")
|
|
77
|
+
@TableMetadata({
|
|
78
|
+
tableName: "StatusPageAnnouncementTemplate",
|
|
79
|
+
singularName: "Status Page Announcement Template",
|
|
80
|
+
pluralName: "Status Page Announcement Templates",
|
|
81
|
+
icon: IconProp.Announcement,
|
|
82
|
+
tableDescription: "Manage announcement templates for your status page",
|
|
83
|
+
})
|
|
84
|
+
@Entity({
|
|
85
|
+
name: "StatusPageAnnouncementTemplate",
|
|
86
|
+
})
|
|
87
|
+
export default class StatusPageAnnouncementTemplate extends BaseModel {
|
|
88
|
+
@ColumnAccessControl({
|
|
89
|
+
create: [
|
|
90
|
+
Permission.ProjectOwner,
|
|
91
|
+
Permission.ProjectAdmin,
|
|
92
|
+
Permission.ProjectMember,
|
|
93
|
+
Permission.CreateStatusPageAnnouncementTemplate,
|
|
94
|
+
],
|
|
95
|
+
read: [
|
|
96
|
+
Permission.ProjectOwner,
|
|
97
|
+
Permission.ProjectAdmin,
|
|
98
|
+
Permission.ProjectMember,
|
|
99
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
100
|
+
],
|
|
101
|
+
update: [],
|
|
102
|
+
})
|
|
103
|
+
@TableColumn({
|
|
104
|
+
manyToOneRelationColumn: "projectId",
|
|
105
|
+
type: TableColumnType.Entity,
|
|
106
|
+
modelType: Project,
|
|
107
|
+
title: "Project",
|
|
108
|
+
description: "Relation to Project Resource in which this object belongs",
|
|
109
|
+
})
|
|
110
|
+
@ManyToOne(
|
|
111
|
+
() => {
|
|
112
|
+
return Project;
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
eager: false,
|
|
116
|
+
nullable: true,
|
|
117
|
+
onDelete: "CASCADE",
|
|
118
|
+
orphanedRowAction: "nullify",
|
|
119
|
+
},
|
|
120
|
+
)
|
|
121
|
+
@JoinColumn({ name: "projectId" })
|
|
122
|
+
public project?: Project = undefined;
|
|
123
|
+
|
|
124
|
+
@ColumnAccessControl({
|
|
125
|
+
create: [
|
|
126
|
+
Permission.ProjectOwner,
|
|
127
|
+
Permission.ProjectAdmin,
|
|
128
|
+
Permission.ProjectMember,
|
|
129
|
+
Permission.CreateStatusPageAnnouncementTemplate,
|
|
130
|
+
],
|
|
131
|
+
read: [
|
|
132
|
+
Permission.ProjectOwner,
|
|
133
|
+
Permission.ProjectAdmin,
|
|
134
|
+
Permission.ProjectMember,
|
|
135
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
136
|
+
],
|
|
137
|
+
update: [],
|
|
138
|
+
})
|
|
139
|
+
@Index()
|
|
140
|
+
@TableColumn({
|
|
141
|
+
type: TableColumnType.ObjectID,
|
|
142
|
+
required: true,
|
|
143
|
+
canReadOnRelationQuery: true,
|
|
144
|
+
title: "Project ID",
|
|
145
|
+
description: "ID of your OneUptime Project in which this object belongs",
|
|
146
|
+
})
|
|
147
|
+
@Column({
|
|
148
|
+
type: ColumnType.ObjectID,
|
|
149
|
+
nullable: false,
|
|
150
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
151
|
+
})
|
|
152
|
+
public projectId?: ObjectID = undefined;
|
|
153
|
+
|
|
154
|
+
@ColumnAccessControl({
|
|
155
|
+
create: [
|
|
156
|
+
Permission.ProjectOwner,
|
|
157
|
+
Permission.ProjectAdmin,
|
|
158
|
+
Permission.ProjectMember,
|
|
159
|
+
Permission.CreateStatusPageAnnouncementTemplate,
|
|
160
|
+
],
|
|
161
|
+
read: [
|
|
162
|
+
Permission.ProjectOwner,
|
|
163
|
+
Permission.ProjectAdmin,
|
|
164
|
+
Permission.ProjectMember,
|
|
165
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
166
|
+
],
|
|
167
|
+
update: [
|
|
168
|
+
Permission.ProjectOwner,
|
|
169
|
+
Permission.ProjectAdmin,
|
|
170
|
+
Permission.ProjectMember,
|
|
171
|
+
Permission.EditStatusPageAnnouncementTemplate,
|
|
172
|
+
],
|
|
173
|
+
})
|
|
174
|
+
@TableColumn({
|
|
175
|
+
required: true,
|
|
176
|
+
type: TableColumnType.ShortText,
|
|
177
|
+
title: "Template Name",
|
|
178
|
+
description: "Name of the announcement template",
|
|
179
|
+
})
|
|
180
|
+
@Column({
|
|
181
|
+
nullable: false,
|
|
182
|
+
type: ColumnType.ShortText,
|
|
183
|
+
length: ColumnLength.ShortText,
|
|
184
|
+
})
|
|
185
|
+
public templateName?: string = undefined;
|
|
186
|
+
|
|
187
|
+
@ColumnAccessControl({
|
|
188
|
+
create: [
|
|
189
|
+
Permission.ProjectOwner,
|
|
190
|
+
Permission.ProjectAdmin,
|
|
191
|
+
Permission.ProjectMember,
|
|
192
|
+
Permission.CreateStatusPageAnnouncementTemplate,
|
|
193
|
+
],
|
|
194
|
+
read: [
|
|
195
|
+
Permission.ProjectOwner,
|
|
196
|
+
Permission.ProjectAdmin,
|
|
197
|
+
Permission.ProjectMember,
|
|
198
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
199
|
+
],
|
|
200
|
+
update: [
|
|
201
|
+
Permission.ProjectOwner,
|
|
202
|
+
Permission.ProjectAdmin,
|
|
203
|
+
Permission.ProjectMember,
|
|
204
|
+
Permission.EditStatusPageAnnouncementTemplate,
|
|
205
|
+
],
|
|
206
|
+
})
|
|
207
|
+
@TableColumn({
|
|
208
|
+
required: false,
|
|
209
|
+
type: TableColumnType.LongText,
|
|
210
|
+
title: "Template Description",
|
|
211
|
+
description: "Description of the announcement template",
|
|
212
|
+
})
|
|
213
|
+
@Column({
|
|
214
|
+
nullable: true,
|
|
215
|
+
type: ColumnType.LongText,
|
|
216
|
+
length: ColumnLength.LongText,
|
|
217
|
+
})
|
|
218
|
+
public templateDescription?: string = undefined;
|
|
219
|
+
|
|
220
|
+
@ColumnAccessControl({
|
|
221
|
+
create: [
|
|
222
|
+
Permission.ProjectOwner,
|
|
223
|
+
Permission.ProjectAdmin,
|
|
224
|
+
Permission.ProjectMember,
|
|
225
|
+
Permission.CreateStatusPageAnnouncementTemplate,
|
|
226
|
+
],
|
|
227
|
+
read: [
|
|
228
|
+
Permission.ProjectOwner,
|
|
229
|
+
Permission.ProjectAdmin,
|
|
230
|
+
Permission.ProjectMember,
|
|
231
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
232
|
+
],
|
|
233
|
+
update: [
|
|
234
|
+
Permission.ProjectOwner,
|
|
235
|
+
Permission.ProjectAdmin,
|
|
236
|
+
Permission.ProjectMember,
|
|
237
|
+
Permission.EditStatusPageAnnouncementTemplate,
|
|
238
|
+
],
|
|
239
|
+
})
|
|
240
|
+
@TableColumn({
|
|
241
|
+
required: true,
|
|
242
|
+
type: TableColumnType.ShortText,
|
|
243
|
+
title: "Announcement Title",
|
|
244
|
+
description: "Title of the announcement",
|
|
245
|
+
})
|
|
246
|
+
@Column({
|
|
247
|
+
nullable: false,
|
|
248
|
+
type: ColumnType.ShortText,
|
|
249
|
+
length: ColumnLength.ShortText,
|
|
250
|
+
})
|
|
251
|
+
public title?: string = undefined;
|
|
252
|
+
|
|
253
|
+
@ColumnAccessControl({
|
|
254
|
+
create: [
|
|
255
|
+
Permission.ProjectOwner,
|
|
256
|
+
Permission.ProjectAdmin,
|
|
257
|
+
Permission.ProjectMember,
|
|
258
|
+
Permission.CreateStatusPageAnnouncementTemplate,
|
|
259
|
+
],
|
|
260
|
+
read: [
|
|
261
|
+
Permission.ProjectOwner,
|
|
262
|
+
Permission.ProjectAdmin,
|
|
263
|
+
Permission.ProjectMember,
|
|
264
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
265
|
+
],
|
|
266
|
+
update: [
|
|
267
|
+
Permission.ProjectOwner,
|
|
268
|
+
Permission.ProjectAdmin,
|
|
269
|
+
Permission.ProjectMember,
|
|
270
|
+
Permission.EditStatusPageAnnouncementTemplate,
|
|
271
|
+
],
|
|
272
|
+
})
|
|
273
|
+
@TableColumn({
|
|
274
|
+
required: true,
|
|
275
|
+
type: TableColumnType.Markdown,
|
|
276
|
+
title: "Announcement Description",
|
|
277
|
+
description: "Text of the announcement. This is in Markdown.",
|
|
278
|
+
})
|
|
279
|
+
@Column({
|
|
280
|
+
nullable: false,
|
|
281
|
+
type: ColumnType.Markdown,
|
|
282
|
+
})
|
|
283
|
+
public description?: string = undefined;
|
|
284
|
+
|
|
285
|
+
@ColumnAccessControl({
|
|
286
|
+
create: [
|
|
287
|
+
Permission.ProjectOwner,
|
|
288
|
+
Permission.ProjectAdmin,
|
|
289
|
+
Permission.ProjectMember,
|
|
290
|
+
Permission.CreateStatusPageAnnouncementTemplate,
|
|
291
|
+
],
|
|
292
|
+
read: [
|
|
293
|
+
Permission.ProjectOwner,
|
|
294
|
+
Permission.ProjectAdmin,
|
|
295
|
+
Permission.ProjectMember,
|
|
296
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
297
|
+
],
|
|
298
|
+
update: [
|
|
299
|
+
Permission.ProjectOwner,
|
|
300
|
+
Permission.ProjectAdmin,
|
|
301
|
+
Permission.ProjectMember,
|
|
302
|
+
Permission.EditStatusPageAnnouncementTemplate,
|
|
303
|
+
],
|
|
304
|
+
})
|
|
305
|
+
@TableColumn({
|
|
306
|
+
required: false,
|
|
307
|
+
type: TableColumnType.EntityArray,
|
|
308
|
+
modelType: StatusPage,
|
|
309
|
+
title: "Status Pages",
|
|
310
|
+
description: "Status Pages to show this announcement on.",
|
|
311
|
+
})
|
|
312
|
+
@ManyToMany(
|
|
313
|
+
() => {
|
|
314
|
+
return StatusPage;
|
|
315
|
+
},
|
|
316
|
+
{ eager: false },
|
|
317
|
+
)
|
|
318
|
+
@JoinTable({
|
|
319
|
+
name: "AnnouncementTemplateStatusPage",
|
|
320
|
+
inverseJoinColumn: {
|
|
321
|
+
name: "statusPageId",
|
|
322
|
+
referencedColumnName: "_id",
|
|
323
|
+
},
|
|
324
|
+
joinColumn: {
|
|
325
|
+
name: "announcementTemplateId",
|
|
326
|
+
referencedColumnName: "_id",
|
|
327
|
+
},
|
|
328
|
+
})
|
|
329
|
+
public statusPages?: Array<StatusPage> = undefined;
|
|
330
|
+
|
|
331
|
+
@ColumnAccessControl({
|
|
332
|
+
create: [
|
|
333
|
+
Permission.ProjectOwner,
|
|
334
|
+
Permission.ProjectAdmin,
|
|
335
|
+
Permission.ProjectMember,
|
|
336
|
+
Permission.CreateStatusPageAnnouncementTemplate,
|
|
337
|
+
],
|
|
338
|
+
read: [
|
|
339
|
+
Permission.ProjectOwner,
|
|
340
|
+
Permission.ProjectAdmin,
|
|
341
|
+
Permission.ProjectMember,
|
|
342
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
343
|
+
],
|
|
344
|
+
update: [
|
|
345
|
+
Permission.ProjectOwner,
|
|
346
|
+
Permission.ProjectAdmin,
|
|
347
|
+
Permission.ProjectMember,
|
|
348
|
+
Permission.EditStatusPageAnnouncementTemplate,
|
|
349
|
+
],
|
|
350
|
+
})
|
|
351
|
+
@TableColumn({
|
|
352
|
+
isDefaultValueColumn: true,
|
|
353
|
+
type: TableColumnType.Boolean,
|
|
354
|
+
title: "Should subscribers be notified?",
|
|
355
|
+
description:
|
|
356
|
+
"Should subscribers be notified about announcements created from this template?",
|
|
357
|
+
})
|
|
358
|
+
@Column({
|
|
359
|
+
type: ColumnType.Boolean,
|
|
360
|
+
default: true,
|
|
361
|
+
})
|
|
362
|
+
public shouldStatusPageSubscribersBeNotified?: boolean = undefined;
|
|
363
|
+
|
|
364
|
+
@ColumnAccessControl({
|
|
365
|
+
create: [],
|
|
366
|
+
read: [
|
|
367
|
+
Permission.ProjectOwner,
|
|
368
|
+
Permission.ProjectAdmin,
|
|
369
|
+
Permission.ProjectMember,
|
|
370
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
371
|
+
],
|
|
372
|
+
update: [],
|
|
373
|
+
})
|
|
374
|
+
@TableColumn({
|
|
375
|
+
manyToOneRelationColumn: "createdByUserId",
|
|
376
|
+
type: TableColumnType.Entity,
|
|
377
|
+
modelType: User,
|
|
378
|
+
title: "Created by User",
|
|
379
|
+
description:
|
|
380
|
+
"Relation to User who created this object (if this object was created by a User)",
|
|
381
|
+
})
|
|
382
|
+
@ManyToOne(
|
|
383
|
+
() => {
|
|
384
|
+
return User;
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
eager: false,
|
|
388
|
+
nullable: true,
|
|
389
|
+
onDelete: "SET NULL",
|
|
390
|
+
orphanedRowAction: "nullify",
|
|
391
|
+
},
|
|
392
|
+
)
|
|
393
|
+
@JoinColumn({ name: "createdByUserId" })
|
|
394
|
+
public createdByUser?: User = undefined;
|
|
395
|
+
|
|
396
|
+
@ColumnAccessControl({
|
|
397
|
+
create: [
|
|
398
|
+
Permission.ProjectOwner,
|
|
399
|
+
Permission.ProjectAdmin,
|
|
400
|
+
Permission.ProjectMember,
|
|
401
|
+
Permission.CreateStatusPageAnnouncementTemplate,
|
|
402
|
+
],
|
|
403
|
+
read: [
|
|
404
|
+
Permission.ProjectOwner,
|
|
405
|
+
Permission.ProjectAdmin,
|
|
406
|
+
Permission.ProjectMember,
|
|
407
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
408
|
+
],
|
|
409
|
+
update: [],
|
|
410
|
+
})
|
|
411
|
+
@TableColumn({
|
|
412
|
+
type: TableColumnType.ObjectID,
|
|
413
|
+
title: "Created by User ID",
|
|
414
|
+
description:
|
|
415
|
+
"User ID who created this object (if this object was created by a User)",
|
|
416
|
+
})
|
|
417
|
+
@Column({
|
|
418
|
+
type: ColumnType.ObjectID,
|
|
419
|
+
nullable: true,
|
|
420
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
421
|
+
})
|
|
422
|
+
public createdByUserId?: ObjectID = undefined;
|
|
423
|
+
|
|
424
|
+
@ColumnAccessControl({
|
|
425
|
+
create: [],
|
|
426
|
+
read: [
|
|
427
|
+
Permission.ProjectOwner,
|
|
428
|
+
Permission.ProjectAdmin,
|
|
429
|
+
Permission.ProjectMember,
|
|
430
|
+
Permission.ReadStatusPageAnnouncementTemplate,
|
|
431
|
+
],
|
|
432
|
+
update: [],
|
|
433
|
+
})
|
|
434
|
+
@TableColumn({
|
|
435
|
+
manyToOneRelationColumn: "deletedByUserId",
|
|
436
|
+
type: TableColumnType.Entity,
|
|
437
|
+
title: "Deleted by User",
|
|
438
|
+
description:
|
|
439
|
+
"Relation to User who deleted this object (if this object was deleted by a User)",
|
|
440
|
+
})
|
|
441
|
+
@ManyToOne(
|
|
442
|
+
() => {
|
|
443
|
+
return User;
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
cascade: false,
|
|
447
|
+
eager: false,
|
|
448
|
+
nullable: true,
|
|
449
|
+
onDelete: "SET NULL",
|
|
450
|
+
orphanedRowAction: "nullify",
|
|
451
|
+
},
|
|
452
|
+
)
|
|
453
|
+
@JoinColumn({ name: "deletedByUserId" })
|
|
454
|
+
public deletedByUser?: User = undefined;
|
|
455
|
+
|
|
456
|
+
@ColumnAccessControl({
|
|
457
|
+
create: [],
|
|
458
|
+
read: [],
|
|
459
|
+
update: [],
|
|
460
|
+
})
|
|
461
|
+
@TableColumn({
|
|
462
|
+
type: TableColumnType.ObjectID,
|
|
463
|
+
title: "Deleted by User ID",
|
|
464
|
+
description:
|
|
465
|
+
"User ID who deleted this object (if this object was deleted by a User)",
|
|
466
|
+
})
|
|
467
|
+
@Column({
|
|
468
|
+
type: ColumnType.ObjectID,
|
|
469
|
+
nullable: true,
|
|
470
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
471
|
+
})
|
|
472
|
+
public deletedByUserId?: ObjectID = undefined;
|
|
473
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
export class MigrationName1749813704371 implements MigrationInterface {
|
|
4
|
+
public name = "MigrationName1749813704371";
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(
|
|
8
|
+
`CREATE TABLE "StatusPageAnnouncementTemplate" ("_id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "version" integer NOT NULL, "projectId" uuid NOT NULL, "templateName" character varying(100) NOT NULL, "templateDescription" character varying(500), "title" character varying(100) NOT NULL, "description" text NOT NULL, "shouldStatusPageSubscribersBeNotified" boolean NOT NULL DEFAULT true, "createdByUserId" uuid, "deletedByUserId" uuid, CONSTRAINT "PK_42d7cd04fe3d2c2e25288483072" PRIMARY KEY ("_id"))`,
|
|
9
|
+
);
|
|
10
|
+
await queryRunner.query(
|
|
11
|
+
`CREATE INDEX "IDX_19d05157cdb68a582d2489bc9e" ON "StatusPageAnnouncementTemplate" ("projectId") `,
|
|
12
|
+
);
|
|
13
|
+
await queryRunner.query(
|
|
14
|
+
`CREATE TABLE "AnnouncementTemplateStatusPage" ("announcementTemplateId" uuid NOT NULL, "statusPageId" uuid NOT NULL, CONSTRAINT "PK_8434706f7e047041ee73a3e8b76" PRIMARY KEY ("announcementTemplateId", "statusPageId"))`,
|
|
15
|
+
);
|
|
16
|
+
await queryRunner.query(
|
|
17
|
+
`CREATE INDEX "IDX_182e3a7c2c910755382971e473" ON "AnnouncementTemplateStatusPage" ("announcementTemplateId") `,
|
|
18
|
+
);
|
|
19
|
+
await queryRunner.query(
|
|
20
|
+
`CREATE INDEX "IDX_d64c5bcc98bd6a09fee1f5b247" ON "AnnouncementTemplateStatusPage" ("statusPageId") `,
|
|
21
|
+
);
|
|
22
|
+
await queryRunner.query(
|
|
23
|
+
`ALTER TABLE "StatusPageAnnouncementTemplate" ADD CONSTRAINT "FK_19d05157cdb68a582d2489bc9e1" FOREIGN KEY ("projectId") REFERENCES "Project"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`,
|
|
24
|
+
);
|
|
25
|
+
await queryRunner.query(
|
|
26
|
+
`ALTER TABLE "StatusPageAnnouncementTemplate" ADD CONSTRAINT "FK_9f1b244a75d53bd2d208934551a" FOREIGN KEY ("createdByUserId") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`,
|
|
27
|
+
);
|
|
28
|
+
await queryRunner.query(
|
|
29
|
+
`ALTER TABLE "StatusPageAnnouncementTemplate" ADD CONSTRAINT "FK_ced5ce354456a65d71e39cd8e7d" FOREIGN KEY ("deletedByUserId") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`,
|
|
30
|
+
);
|
|
31
|
+
await queryRunner.query(
|
|
32
|
+
`ALTER TABLE "AnnouncementTemplateStatusPage" ADD CONSTRAINT "FK_182e3a7c2c910755382971e4739" FOREIGN KEY ("announcementTemplateId") REFERENCES "StatusPageAnnouncementTemplate"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
|
|
33
|
+
);
|
|
34
|
+
await queryRunner.query(
|
|
35
|
+
`ALTER TABLE "AnnouncementTemplateStatusPage" ADD CONSTRAINT "FK_d64c5bcc98bd6a09fee1f5b2473" FOREIGN KEY ("statusPageId") REFERENCES "StatusPage"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
40
|
+
await queryRunner.query(
|
|
41
|
+
`ALTER TABLE "AnnouncementTemplateStatusPage" DROP CONSTRAINT "FK_d64c5bcc98bd6a09fee1f5b2473"`,
|
|
42
|
+
);
|
|
43
|
+
await queryRunner.query(
|
|
44
|
+
`ALTER TABLE "AnnouncementTemplateStatusPage" DROP CONSTRAINT "FK_182e3a7c2c910755382971e4739"`,
|
|
45
|
+
);
|
|
46
|
+
await queryRunner.query(
|
|
47
|
+
`ALTER TABLE "StatusPageAnnouncementTemplate" DROP CONSTRAINT "FK_ced5ce354456a65d71e39cd8e7d"`,
|
|
48
|
+
);
|
|
49
|
+
await queryRunner.query(
|
|
50
|
+
`ALTER TABLE "StatusPageAnnouncementTemplate" DROP CONSTRAINT "FK_9f1b244a75d53bd2d208934551a"`,
|
|
51
|
+
);
|
|
52
|
+
await queryRunner.query(
|
|
53
|
+
`ALTER TABLE "StatusPageAnnouncementTemplate" DROP CONSTRAINT "FK_19d05157cdb68a582d2489bc9e1"`,
|
|
54
|
+
);
|
|
55
|
+
await queryRunner.query(
|
|
56
|
+
`DROP INDEX "public"."IDX_d64c5bcc98bd6a09fee1f5b247"`,
|
|
57
|
+
);
|
|
58
|
+
await queryRunner.query(
|
|
59
|
+
`DROP INDEX "public"."IDX_182e3a7c2c910755382971e473"`,
|
|
60
|
+
);
|
|
61
|
+
await queryRunner.query(`DROP TABLE "AnnouncementTemplateStatusPage"`);
|
|
62
|
+
await queryRunner.query(
|
|
63
|
+
`DROP INDEX "public"."IDX_19d05157cdb68a582d2489bc9e"`,
|
|
64
|
+
);
|
|
65
|
+
await queryRunner.query(`DROP TABLE "StatusPageAnnouncementTemplate"`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -136,6 +136,7 @@ import { MigrationName1747674762672 } from "./1747674762672-MigrationName";
|
|
|
136
136
|
import { MigrationName1748456937826 } from "./1748456937826-MigrationName";
|
|
137
137
|
import { MigrationName1749065784320 } from "./1749065784320-MigrationName";
|
|
138
138
|
import { MigrationName1749133333893 } from "./1749133333893-MigrationName";
|
|
139
|
+
import { MigrationName1749813704371 } from "./1749813704371-MigrationName";
|
|
139
140
|
|
|
140
141
|
export default [
|
|
141
142
|
InitialMigration,
|
|
@@ -276,4 +277,5 @@ export default [
|
|
|
276
277
|
MigrationName1748456937826,
|
|
277
278
|
MigrationName1749065784320,
|
|
278
279
|
MigrationName1749133333893,
|
|
280
|
+
MigrationName1749813704371,
|
|
279
281
|
];
|
|
@@ -77,7 +77,7 @@ export default class ProjectMiddleware {
|
|
|
77
77
|
|
|
78
78
|
if (!apiKey) {
|
|
79
79
|
throw new BadDataException(
|
|
80
|
-
"
|
|
80
|
+
"API Key not found in the request header. Please provide a valid API Key in the request header.",
|
|
81
81
|
);
|
|
82
82
|
}
|
|
83
83
|
|
|
@@ -99,9 +99,7 @@ export default class ProjectMiddleware {
|
|
|
99
99
|
tenantId = apiKeyModel?.projectId || null;
|
|
100
100
|
|
|
101
101
|
if (!tenantId) {
|
|
102
|
-
throw new BadDataException(
|
|
103
|
-
"Project ID not found for the provided API Key.",
|
|
104
|
-
);
|
|
102
|
+
throw new BadDataException("Invalid API Key");
|
|
105
103
|
}
|
|
106
104
|
|
|
107
105
|
(req as OneUptimeRequest).tenantId = tenantId;
|
package/Server/Services/Index.ts
CHANGED
|
@@ -94,6 +94,7 @@ import SmsLogService from "./SmsLogService";
|
|
|
94
94
|
import SmsService from "./SmsService";
|
|
95
95
|
import SpanService from "./SpanService";
|
|
96
96
|
import StatusPageAnnouncementService from "./StatusPageAnnouncementService";
|
|
97
|
+
import StatusPageAnnouncementTemplateService from "./StatusPageAnnouncementTemplateService";
|
|
97
98
|
import StatusPageCustomFieldService from "./StatusPageCustomFieldService";
|
|
98
99
|
import StatusPageDomainService from "./StatusPageDomainService";
|
|
99
100
|
import StatusPageFooterLinkService from "./StatusPageFooterLinkService";
|
|
@@ -249,6 +250,7 @@ const services: Array<BaseService> = [
|
|
|
249
250
|
SmsService,
|
|
250
251
|
|
|
251
252
|
StatusPageAnnouncementService,
|
|
253
|
+
StatusPageAnnouncementTemplateService,
|
|
252
254
|
StatusPageCustomFieldService,
|
|
253
255
|
StatusPageDomainService,
|
|
254
256
|
StatusPageFooterLinkService,
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import Model from "../../Models/DatabaseModels/StatusPageAnnouncementTemplate";
|
|
3
|
+
|
|
4
|
+
export class Service extends DatabaseService<Model> {
|
|
5
|
+
public constructor() {
|
|
6
|
+
super(Model);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default new Service();
|