@terreno/announcements 57.4.0 → 57.6.1

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.
@@ -2,12 +2,11 @@
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
- var _a;
6
5
  Object.defineProperty(exports, "__esModule", { value: true });
7
6
  exports.isValidClickAction = exports.AnnouncementClickEvent = void 0;
8
- var api_1 = require("@terreno/api");
9
- var mongoose_1 = __importDefault(require("mongoose"));
10
- var announcementClickEventSchema = new mongoose_1.default.Schema({
7
+ const api_1 = require("@terreno/api");
8
+ const mongoose_1 = __importDefault(require("mongoose"));
9
+ const announcementClickEventSchema = new mongoose_1.default.Schema({
11
10
  action: {
12
11
  description: "Which announcement action the user clicked",
13
12
  enum: ["primaryAction"],
@@ -17,7 +16,7 @@ var announcementClickEventSchema = new mongoose_1.default.Schema({
17
16
  announcementId: {
18
17
  description: "Announcement whose primary action was clicked",
19
18
  index: true,
20
- ref: "Announcement",
19
+ ref: "TerrenoAnnouncement",
21
20
  required: true,
22
21
  type: mongoose_1.default.Schema.Types.ObjectId,
23
22
  },
@@ -49,8 +48,7 @@ announcementClickEventSchema.plugin(api_1.isDeletedPlugin);
49
48
  announcementClickEventSchema.plugin(api_1.findExactlyOne);
50
49
  announcementClickEventSchema.plugin(api_1.findOneOrNone);
51
50
  announcementClickEventSchema.index({ announcementId: 1, clickedAt: -1 });
52
- exports.AnnouncementClickEvent = (_a = mongoose_1.default.models.AnnouncementClickEvent) !== null && _a !== void 0 ? _a : mongoose_1.default.model("AnnouncementClickEvent", announcementClickEventSchema);
53
- var isValidClickAction = function (value) {
54
- return value === "primaryAction";
55
- };
51
+ exports.AnnouncementClickEvent = mongoose_1.default.models.TerrenoAnnouncementClickEvent ??
52
+ mongoose_1.default.model("TerrenoAnnouncementClickEvent", announcementClickEventSchema, "announcementclickevents");
53
+ const isValidClickAction = (value) => value === "primaryAction";
56
54
  exports.isValidClickAction = isValidClickAction;
@@ -2,16 +2,15 @@
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
- var _a;
6
5
  Object.defineProperty(exports, "__esModule", { value: true });
7
6
  exports.isValidPlatform = exports.AnnouncementImpression = void 0;
8
- var api_1 = require("@terreno/api");
9
- var mongoose_1 = __importDefault(require("mongoose"));
10
- var announcementImpressionSchema = new mongoose_1.default.Schema({
7
+ const api_1 = require("@terreno/api");
8
+ const mongoose_1 = __importDefault(require("mongoose"));
9
+ const announcementImpressionSchema = new mongoose_1.default.Schema({
11
10
  announcementId: {
12
11
  description: "Announcement that was viewed",
13
12
  index: true,
14
- ref: "Announcement",
13
+ ref: "TerrenoAnnouncement",
15
14
  required: true,
16
15
  type: mongoose_1.default.Schema.Types.ObjectId,
17
16
  },
@@ -43,8 +42,7 @@ announcementImpressionSchema.plugin(api_1.isDeletedPlugin);
43
42
  announcementImpressionSchema.plugin(api_1.findExactlyOne);
44
43
  announcementImpressionSchema.plugin(api_1.findOneOrNone);
45
44
  announcementImpressionSchema.index({ announcementId: 1, viewedAt: -1 });
46
- exports.AnnouncementImpression = (_a = mongoose_1.default.models.AnnouncementImpression) !== null && _a !== void 0 ? _a : mongoose_1.default.model("AnnouncementImpression", announcementImpressionSchema);
47
- var isValidPlatform = function (value) {
48
- return value === "ios" || value === "android" || value === "web";
49
- };
45
+ exports.AnnouncementImpression = mongoose_1.default.models.TerrenoAnnouncementImpression ??
46
+ mongoose_1.default.model("TerrenoAnnouncementImpression", announcementImpressionSchema, "announcementimpressions");
47
+ const isValidPlatform = (value) => value === "ios" || value === "android" || value === "web";
50
48
  exports.isValidPlatform = isValidPlatform;
package/dist/overview.js CHANGED
@@ -1,310 +1,161 @@
1
1
  "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchAnnouncementOverview = exports.parseOverviewPagination = void 0;
4
+ const announcement_1 = require("./models/announcement");
5
+ const announcementAcknowledgement_1 = require("./models/announcementAcknowledgement");
6
+ const announcementClickEvent_1 = require("./models/announcementClickEvent");
7
+ const announcementImpression_1 = require("./models/announcementImpression");
8
+ const pending_1 = require("./pending");
9
+ const NOT_DELETED = { deleted: { $ne: true } };
10
+ const parseOverviewPagination = (query) => {
11
+ const parsedLimit = Number(query.limit ?? 20);
12
+ const parsedPage = Number(query.page ?? 1);
13
+ const limit = Number.isFinite(parsedLimit)
14
+ ? Math.min(Math.max(Math.trunc(parsedLimit), 1), 100)
15
+ : 20;
16
+ const page = Number.isFinite(parsedPage) ? Math.max(Math.trunc(parsedPage), 1) : 1;
17
+ return { limit, page };
12
18
  };
13
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
- return new (P || (P = Promise))(function (resolve, reject) {
16
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
- step((generator = generator.apply(thisArg, _arguments || [])).next());
20
- });
19
+ exports.parseOverviewPagination = parseOverviewPagination;
20
+ const countEventTotals = async () => {
21
+ const [impressionRows, acknowledgementRows, clickRows] = await Promise.all([
22
+ announcementImpression_1.AnnouncementImpression.aggregate([{ $match: NOT_DELETED }, { $count: "count" }]),
23
+ announcementAcknowledgement_1.AnnouncementAcknowledgement.aggregate([
24
+ { $match: NOT_DELETED },
25
+ { $count: "count" },
26
+ ]),
27
+ announcementClickEvent_1.AnnouncementClickEvent.aggregate([{ $match: NOT_DELETED }, { $count: "count" }]),
28
+ ]);
29
+ return {
30
+ acknowledgements: acknowledgementRows[0]?.count ?? 0,
31
+ clicks: clickRows[0]?.count ?? 0,
32
+ impressions: impressionRows[0]?.count ?? 0,
33
+ };
21
34
  };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
24
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ const countMetricsByAnnouncement = async (announcementIds) => {
36
+ const metrics = new Map();
37
+ for (const id of announcementIds) {
38
+ metrics.set(id.toString(), { acknowledgements: 0, clicks: 0, impressions: 0 });
47
39
  }
48
- };
49
- var __read = (this && this.__read) || function (o, n) {
50
- var m = typeof Symbol === "function" && o[Symbol.iterator];
51
- if (!m) return o;
52
- var i = m.call(o), r, ar = [], e;
53
- try {
54
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
40
+ if (announcementIds.length === 0) {
41
+ return metrics;
42
+ }
43
+ const matchByAnnouncement = {
44
+ $match: {
45
+ ...NOT_DELETED,
46
+ announcementId: { $in: announcementIds },
47
+ },
48
+ };
49
+ const [impressionCounts, acknowledgementCounts, clickCounts] = await Promise.all([
50
+ announcementImpression_1.AnnouncementImpression.aggregate([
51
+ matchByAnnouncement,
52
+ { $group: { _id: "$announcementId", count: { $sum: 1 } } },
53
+ ]),
54
+ announcementAcknowledgement_1.AnnouncementAcknowledgement.aggregate([
55
+ matchByAnnouncement,
56
+ { $group: { _id: "$announcementId", count: { $sum: 1 } } },
57
+ ]),
58
+ announcementClickEvent_1.AnnouncementClickEvent.aggregate([
59
+ matchByAnnouncement,
60
+ { $group: { _id: "$announcementId", count: { $sum: 1 } } },
61
+ ]),
62
+ ]);
63
+ for (const row of impressionCounts) {
64
+ const existing = metrics.get(row._id.toString()) ?? {
65
+ acknowledgements: 0,
66
+ clicks: 0,
67
+ impressions: 0,
68
+ };
69
+ existing.impressions = row.count;
70
+ metrics.set(row._id.toString(), existing);
55
71
  }
56
- catch (error) { e = { error: error }; }
57
- finally {
58
- try {
59
- if (r && !r.done && (m = i["return"])) m.call(i);
60
- }
61
- finally { if (e) throw e.error; }
72
+ for (const row of acknowledgementCounts) {
73
+ const existing = metrics.get(row._id.toString()) ?? {
74
+ acknowledgements: 0,
75
+ clicks: 0,
76
+ impressions: 0,
77
+ };
78
+ existing.acknowledgements = row.count;
79
+ metrics.set(row._id.toString(), existing);
62
80
  }
63
- return ar;
81
+ for (const row of clickCounts) {
82
+ const existing = metrics.get(row._id.toString()) ?? {
83
+ acknowledgements: 0,
84
+ clicks: 0,
85
+ impressions: 0,
86
+ };
87
+ existing.clicks = row.count;
88
+ metrics.set(row._id.toString(), existing);
89
+ }
90
+ return metrics;
64
91
  };
65
- var __values = (this && this.__values) || function(o) {
66
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
67
- if (m) return m.call(o);
68
- if (o && typeof o.length === "number") return {
69
- next: function () {
70
- if (o && i >= o.length) o = void 0;
71
- return { value: o && o[i++], done: !o };
72
- }
92
+ const toOverviewRow = ({ announcement, defaultAcknowledgementPolicy, metrics, }) => ({
93
+ _id: announcement._id.toString(),
94
+ acknowledgementPolicy: (0, pending_1.resolveAcknowledgementPolicy)({
95
+ announcement,
96
+ defaultAcknowledgementPolicy,
97
+ }),
98
+ audienceType: (0, pending_1.resolveAudienceType)(announcement),
99
+ displayMode: (0, pending_1.resolveDisplayMode)(announcement),
100
+ expiresAt: announcement.expiresAt?.toISOString(),
101
+ metrics,
102
+ priority: announcement.priority,
103
+ publishedAt: announcement.publishedAt?.toISOString(),
104
+ status: announcement.status,
105
+ title: announcement.title,
106
+ version: announcement.version,
107
+ });
108
+ const fetchAnnouncementOverview = async ({ defaultAcknowledgementPolicy, limit, page, }) => {
109
+ const skip = (page - 1) * limit;
110
+ const [facetResult, eventTotals] = await Promise.all([
111
+ announcement_1.Announcement.aggregate([
112
+ { $match: NOT_DELETED },
113
+ {
114
+ $facet: {
115
+ paginated: [
116
+ // biome-ignore assist/source/useSortedKeys: MongoDB applies sort keys in insertion order
117
+ { $sort: { priority: -1, publishedAt: -1, _id: -1 } },
118
+ { $skip: skip },
119
+ { $limit: limit },
120
+ ],
121
+ statusCounts: [{ $group: { _id: "$status", count: { $sum: 1 } } }],
122
+ totalCount: [{ $count: "count" }],
123
+ },
124
+ },
125
+ ]),
126
+ countEventTotals(),
127
+ ]);
128
+ const facet = facetResult[0];
129
+ const paginated = facet?.paginated ?? [];
130
+ const total = facet?.totalCount[0]?.count ?? 0;
131
+ const statusCounts = facet?.statusCounts ?? [];
132
+ const statusCountMap = new Map(statusCounts.map((row) => [row._id, row.count]));
133
+ const totals = {
134
+ acknowledgements: eventTotals.acknowledgements,
135
+ announcements: total,
136
+ archived: statusCountMap.get("archived") ?? 0,
137
+ clicks: eventTotals.clicks,
138
+ draft: statusCountMap.get("draft") ?? 0,
139
+ impressions: eventTotals.impressions,
140
+ published: statusCountMap.get("published") ?? 0,
141
+ };
142
+ const metricsByAnnouncement = await countMetricsByAnnouncement(paginated.map((announcement) => announcement._id));
143
+ const data = paginated.map((announcement) => toOverviewRow({
144
+ announcement,
145
+ defaultAcknowledgementPolicy,
146
+ metrics: metricsByAnnouncement.get(announcement._id.toString()) ?? {
147
+ acknowledgements: 0,
148
+ clicks: 0,
149
+ impressions: 0,
150
+ },
151
+ }));
152
+ return {
153
+ data,
154
+ limit,
155
+ more: skip + data.length < total,
156
+ page,
157
+ total,
158
+ totals,
73
159
  };
74
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
75
- };
76
- Object.defineProperty(exports, "__esModule", { value: true });
77
- exports.fetchAnnouncementOverview = exports.parseOverviewPagination = void 0;
78
- var announcement_1 = require("./models/announcement");
79
- var announcementAcknowledgement_1 = require("./models/announcementAcknowledgement");
80
- var announcementClickEvent_1 = require("./models/announcementClickEvent");
81
- var announcementImpression_1 = require("./models/announcementImpression");
82
- var pending_1 = require("./pending");
83
- var NOT_DELETED = { deleted: { $ne: true } };
84
- var parseOverviewPagination = function (query) {
85
- var _a, _b;
86
- var parsedLimit = Number((_a = query.limit) !== null && _a !== void 0 ? _a : 20);
87
- var parsedPage = Number((_b = query.page) !== null && _b !== void 0 ? _b : 1);
88
- var limit = Number.isFinite(parsedLimit)
89
- ? Math.min(Math.max(Math.trunc(parsedLimit), 1), 100)
90
- : 20;
91
- var page = Number.isFinite(parsedPage) ? Math.max(Math.trunc(parsedPage), 1) : 1;
92
- return { limit: limit, page: page };
93
- };
94
- exports.parseOverviewPagination = parseOverviewPagination;
95
- var countEventTotals = function () { return __awaiter(void 0, void 0, void 0, function () {
96
- var _a, impressionRows, acknowledgementRows, clickRows;
97
- var _b, _c, _d, _e, _f, _g;
98
- return __generator(this, function (_h) {
99
- switch (_h.label) {
100
- case 0: return [4 /*yield*/, Promise.all([
101
- announcementImpression_1.AnnouncementImpression.aggregate([{ $match: NOT_DELETED }, { $count: "count" }]),
102
- announcementAcknowledgement_1.AnnouncementAcknowledgement.aggregate([
103
- { $match: NOT_DELETED },
104
- { $count: "count" },
105
- ]),
106
- announcementClickEvent_1.AnnouncementClickEvent.aggregate([{ $match: NOT_DELETED }, { $count: "count" }]),
107
- ])];
108
- case 1:
109
- _a = __read.apply(void 0, [_h.sent(), 3]), impressionRows = _a[0], acknowledgementRows = _a[1], clickRows = _a[2];
110
- return [2 /*return*/, {
111
- acknowledgements: (_c = (_b = acknowledgementRows[0]) === null || _b === void 0 ? void 0 : _b.count) !== null && _c !== void 0 ? _c : 0,
112
- clicks: (_e = (_d = clickRows[0]) === null || _d === void 0 ? void 0 : _d.count) !== null && _e !== void 0 ? _e : 0,
113
- impressions: (_g = (_f = impressionRows[0]) === null || _f === void 0 ? void 0 : _f.count) !== null && _g !== void 0 ? _g : 0,
114
- }];
115
- }
116
- });
117
- }); };
118
- var countMetricsByAnnouncement = function (announcementIds) { return __awaiter(void 0, void 0, void 0, function () {
119
- var metrics, announcementIds_1, announcementIds_1_1, id, matchByAnnouncement, _a, impressionCounts, acknowledgementCounts, clickCounts, impressionCounts_1, impressionCounts_1_1, row, existing, acknowledgementCounts_1, acknowledgementCounts_1_1, row, existing, clickCounts_1, clickCounts_1_1, row, existing;
120
- var e_1, _b, e_2, _c, e_3, _d, e_4, _e;
121
- var _f, _g, _h;
122
- return __generator(this, function (_j) {
123
- switch (_j.label) {
124
- case 0:
125
- metrics = new Map();
126
- try {
127
- for (announcementIds_1 = __values(announcementIds), announcementIds_1_1 = announcementIds_1.next(); !announcementIds_1_1.done; announcementIds_1_1 = announcementIds_1.next()) {
128
- id = announcementIds_1_1.value;
129
- metrics.set(id.toString(), { acknowledgements: 0, clicks: 0, impressions: 0 });
130
- }
131
- }
132
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
133
- finally {
134
- try {
135
- if (announcementIds_1_1 && !announcementIds_1_1.done && (_b = announcementIds_1.return)) _b.call(announcementIds_1);
136
- }
137
- finally { if (e_1) throw e_1.error; }
138
- }
139
- if (announcementIds.length === 0) {
140
- return [2 /*return*/, metrics];
141
- }
142
- matchByAnnouncement = {
143
- $match: __assign(__assign({}, NOT_DELETED), { announcementId: { $in: announcementIds } }),
144
- };
145
- return [4 /*yield*/, Promise.all([
146
- announcementImpression_1.AnnouncementImpression.aggregate([
147
- matchByAnnouncement,
148
- { $group: { _id: "$announcementId", count: { $sum: 1 } } },
149
- ]),
150
- announcementAcknowledgement_1.AnnouncementAcknowledgement.aggregate([
151
- matchByAnnouncement,
152
- { $group: { _id: "$announcementId", count: { $sum: 1 } } },
153
- ]),
154
- announcementClickEvent_1.AnnouncementClickEvent.aggregate([
155
- matchByAnnouncement,
156
- { $group: { _id: "$announcementId", count: { $sum: 1 } } },
157
- ]),
158
- ])];
159
- case 1:
160
- _a = __read.apply(void 0, [_j.sent(), 3]), impressionCounts = _a[0], acknowledgementCounts = _a[1], clickCounts = _a[2];
161
- try {
162
- for (impressionCounts_1 = __values(impressionCounts), impressionCounts_1_1 = impressionCounts_1.next(); !impressionCounts_1_1.done; impressionCounts_1_1 = impressionCounts_1.next()) {
163
- row = impressionCounts_1_1.value;
164
- existing = (_f = metrics.get(row._id.toString())) !== null && _f !== void 0 ? _f : {
165
- acknowledgements: 0,
166
- clicks: 0,
167
- impressions: 0,
168
- };
169
- existing.impressions = row.count;
170
- metrics.set(row._id.toString(), existing);
171
- }
172
- }
173
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
174
- finally {
175
- try {
176
- if (impressionCounts_1_1 && !impressionCounts_1_1.done && (_c = impressionCounts_1.return)) _c.call(impressionCounts_1);
177
- }
178
- finally { if (e_2) throw e_2.error; }
179
- }
180
- try {
181
- for (acknowledgementCounts_1 = __values(acknowledgementCounts), acknowledgementCounts_1_1 = acknowledgementCounts_1.next(); !acknowledgementCounts_1_1.done; acknowledgementCounts_1_1 = acknowledgementCounts_1.next()) {
182
- row = acknowledgementCounts_1_1.value;
183
- existing = (_g = metrics.get(row._id.toString())) !== null && _g !== void 0 ? _g : {
184
- acknowledgements: 0,
185
- clicks: 0,
186
- impressions: 0,
187
- };
188
- existing.acknowledgements = row.count;
189
- metrics.set(row._id.toString(), existing);
190
- }
191
- }
192
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
193
- finally {
194
- try {
195
- if (acknowledgementCounts_1_1 && !acknowledgementCounts_1_1.done && (_d = acknowledgementCounts_1.return)) _d.call(acknowledgementCounts_1);
196
- }
197
- finally { if (e_3) throw e_3.error; }
198
- }
199
- try {
200
- for (clickCounts_1 = __values(clickCounts), clickCounts_1_1 = clickCounts_1.next(); !clickCounts_1_1.done; clickCounts_1_1 = clickCounts_1.next()) {
201
- row = clickCounts_1_1.value;
202
- existing = (_h = metrics.get(row._id.toString())) !== null && _h !== void 0 ? _h : {
203
- acknowledgements: 0,
204
- clicks: 0,
205
- impressions: 0,
206
- };
207
- existing.clicks = row.count;
208
- metrics.set(row._id.toString(), existing);
209
- }
210
- }
211
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
212
- finally {
213
- try {
214
- if (clickCounts_1_1 && !clickCounts_1_1.done && (_e = clickCounts_1.return)) _e.call(clickCounts_1);
215
- }
216
- finally { if (e_4) throw e_4.error; }
217
- }
218
- return [2 /*return*/, metrics];
219
- }
220
- });
221
- }); };
222
- var toOverviewRow = function (_a) {
223
- var _b, _c;
224
- var announcement = _a.announcement, defaultAcknowledgementPolicy = _a.defaultAcknowledgementPolicy, metrics = _a.metrics;
225
- return ({
226
- _id: announcement._id.toString(),
227
- acknowledgementPolicy: (0, pending_1.resolveAcknowledgementPolicy)({
228
- announcement: announcement,
229
- defaultAcknowledgementPolicy: defaultAcknowledgementPolicy,
230
- }),
231
- audienceType: (0, pending_1.resolveAudienceType)(announcement),
232
- displayMode: (0, pending_1.resolveDisplayMode)(announcement),
233
- expiresAt: (_b = announcement.expiresAt) === null || _b === void 0 ? void 0 : _b.toISOString(),
234
- metrics: metrics,
235
- priority: announcement.priority,
236
- publishedAt: (_c = announcement.publishedAt) === null || _c === void 0 ? void 0 : _c.toISOString(),
237
- status: announcement.status,
238
- title: announcement.title,
239
- version: announcement.version,
240
- });
241
160
  };
242
- var fetchAnnouncementOverview = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
243
- var skip, _c, facetResult, eventTotals, facet, paginated, total, statusCounts, statusCountMap, totals, metricsByAnnouncement, data;
244
- var _d, _e, _f, _g, _h, _j, _k;
245
- var defaultAcknowledgementPolicy = _b.defaultAcknowledgementPolicy, limit = _b.limit, page = _b.page;
246
- return __generator(this, function (_l) {
247
- switch (_l.label) {
248
- case 0:
249
- skip = (page - 1) * limit;
250
- return [4 /*yield*/, Promise.all([
251
- announcement_1.Announcement.aggregate([
252
- { $match: NOT_DELETED },
253
- {
254
- $facet: {
255
- paginated: [
256
- // biome-ignore assist/source/useSortedKeys: MongoDB applies sort keys in insertion order
257
- { $sort: { priority: -1, publishedAt: -1, _id: -1 } },
258
- { $skip: skip },
259
- { $limit: limit },
260
- ],
261
- statusCounts: [{ $group: { _id: "$status", count: { $sum: 1 } } }],
262
- totalCount: [{ $count: "count" }],
263
- },
264
- },
265
- ]),
266
- countEventTotals(),
267
- ])];
268
- case 1:
269
- _c = __read.apply(void 0, [_l.sent(), 2]), facetResult = _c[0], eventTotals = _c[1];
270
- facet = facetResult[0];
271
- paginated = (_d = facet === null || facet === void 0 ? void 0 : facet.paginated) !== null && _d !== void 0 ? _d : [];
272
- total = (_f = (_e = facet === null || facet === void 0 ? void 0 : facet.totalCount[0]) === null || _e === void 0 ? void 0 : _e.count) !== null && _f !== void 0 ? _f : 0;
273
- statusCounts = (_g = facet === null || facet === void 0 ? void 0 : facet.statusCounts) !== null && _g !== void 0 ? _g : [];
274
- statusCountMap = new Map(statusCounts.map(function (row) { return [row._id, row.count]; }));
275
- totals = {
276
- acknowledgements: eventTotals.acknowledgements,
277
- announcements: total,
278
- archived: (_h = statusCountMap.get("archived")) !== null && _h !== void 0 ? _h : 0,
279
- clicks: eventTotals.clicks,
280
- draft: (_j = statusCountMap.get("draft")) !== null && _j !== void 0 ? _j : 0,
281
- impressions: eventTotals.impressions,
282
- published: (_k = statusCountMap.get("published")) !== null && _k !== void 0 ? _k : 0,
283
- };
284
- return [4 /*yield*/, countMetricsByAnnouncement(paginated.map(function (announcement) { return announcement._id; }))];
285
- case 2:
286
- metricsByAnnouncement = _l.sent();
287
- data = paginated.map(function (announcement) {
288
- var _a;
289
- return toOverviewRow({
290
- announcement: announcement,
291
- defaultAcknowledgementPolicy: defaultAcknowledgementPolicy,
292
- metrics: (_a = metricsByAnnouncement.get(announcement._id.toString())) !== null && _a !== void 0 ? _a : {
293
- acknowledgements: 0,
294
- clicks: 0,
295
- impressions: 0,
296
- },
297
- });
298
- });
299
- return [2 /*return*/, {
300
- data: data,
301
- limit: limit,
302
- more: skip + data.length < total,
303
- page: page,
304
- total: total,
305
- totals: totals,
306
- }];
307
- }
308
- });
309
- }); };
310
161
  exports.fetchAnnouncementOverview = fetchAnnouncementOverview;