Skip to content

Commit e2b012f

Browse files
committed
auth service
1 parent e5ef142 commit e2b012f

File tree

5 files changed

+77
-9
lines changed

5 files changed

+77
-9
lines changed

server/src/init/services.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ export const initServices = async () => {
7272
);
7373
const jobQueue = await JobQueue.create(jobGenerator, monitorRepository);
7474
const entitlementsProvider = EntitlementsFactory.create();
75-
const authService = new AuthService(jobQueue, entitlementsProvider);
75+
const authService = new AuthService(
76+
jobQueue,
77+
entitlementsProvider,
78+
monitorRepository
79+
);
7680
const meService = new MeService(entitlementsProvider);
7781
const monitorService = new MonitorService(jobQueue, monitorRepository);
7882
const queueService = new QueueService(jobQueue);

server/src/repositories/monitors/IMonitorRepoistory.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export interface IMonitorRepository {
5757
findByOrgId(orgId: string): Promise<Monitor[]>;
5858

5959
// Deletions
60+
deleteAll(): Promise<boolean>;
6061
deleteById(monitorId: string, teamId: string): Promise<boolean>;
6162
deleteByOrgId(orgId: string): Promise<boolean>;
6263

server/src/repositories/monitors/MongoMonitorRepository.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ class MongoMonitorRepository implements IMonitorRepository {
143143
};
144144

145145
// Deletions
146+
deleteAll = async () => {
147+
const deleted = await Monitor.deleteMany({});
148+
return deleted.acknowledged;
149+
};
146150
deleteById = async (monitorId: string, teamId: string) => {
147151
await Monitor.deleteOne({ _id: monitorId, teamId });
148152
return true;

server/src/services/business/AuthService.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
IRole,
1212
IUser,
1313
ITokenizedUser,
14-
Monitor,
1514
Check,
1615
NotificationChannel,
1716
IInvite,
@@ -24,6 +23,7 @@ import { Plans } from "@/types/entitlements.js";
2423
import { PERMISSIONS } from "@/types/permissions.js";
2524
import type { Entitlements } from "@/types/entitlements.js";
2625
import type { IEntitlementsProvider } from "@/services/system/EntitlementsService.js";
26+
import type { IMonitorRepository } from "@/repositories/index.js";
2727

2828
const SERVICE_NAME = "AuthService";
2929

@@ -68,13 +68,16 @@ class AuthService implements IAuthService {
6868
public SERVICE_NAME: string;
6969
private jobQueue: IJobQueue;
7070
private entitlementsProvider: IEntitlementsProvider;
71+
private monitorRepository: IMonitorRepository;
7172
constructor(
7273
jobQueue: IJobQueue,
73-
entitlementsProvider: IEntitlementsProvider
74+
entitlementsProvider: IEntitlementsProvider,
75+
monitorRepository: IMonitorRepository
7476
) {
7577
this.SERVICE_NAME = SERVICE_NAME;
7678
this.jobQueue = jobQueue;
7779
this.entitlementsProvider = entitlementsProvider;
80+
this.monitorRepository = monitorRepository;
7881
}
7982

8083
async register(signupData: RegisterData) {
@@ -487,14 +490,14 @@ class AuthService implements IAuthService {
487490
async cleanup() {
488491
await User.deleteMany({});
489492
await Role.deleteMany({});
490-
await Monitor.deleteMany({});
493+
await this.monitorRepository.deleteAll();
491494
await Check.deleteMany({});
492495
await NotificationChannel.deleteMany({});
493496
await this.jobQueue.flush();
494497
}
495498

496499
async cleanMonitors() {
497-
await Monitor.deleteMany({});
500+
this.monitorRepository.deleteAll();
498501
await Check.deleteMany({});
499502
}
500503

server/src/services/business/StatusPageService.ts

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {
55
IStatusPage,
66
StatusPage,
77
Monitor,
8+
Check,
9+
IMonitor,
810
} from "@/db/models/index.js";
911
import ApiError from "@/utils/ApiError.js";
1012
import { count } from "node:console";
@@ -21,8 +23,13 @@ export interface IStatusPageService {
2123
page: number,
2224
rowsPerPage: number
2325
) => Promise<{ statusPages: IStatusPage[]; count: number }>;
24-
get: (teamId: string, id: string) => Promise<IStatusPage>;
25-
getPublic: (url: string) => Promise<IStatusPage>;
26+
get: (
27+
teamId: string,
28+
id: string
29+
) => Promise<{ statusPage: IStatusPage; checksMap: Record<string, any[]> }>;
30+
getPublic: (
31+
url: string
32+
) => Promise<{ statusPage: IStatusPage; checksMap: Record<string, any[]> }>;
2633
update: (
2734
teamId: string,
2835
tokenizedUser: IUserContext,
@@ -72,7 +79,32 @@ class StatusPageService implements IStatusPageService {
7279
if (!statusPage) {
7380
throw new ApiError("Status page not found", 404);
7481
}
75-
return statusPage;
82+
83+
const monitorIds = (statusPage.monitors || []).map((m) => m._id);
84+
85+
const checks = await Check.aggregate([
86+
{ $match: { "metadata.monitorId": { $in: monitorIds } } },
87+
{ $sort: { createdAt: -1 } },
88+
{
89+
$group: {
90+
_id: "$metadata.monitorId",
91+
latestChecks: { $push: "$$ROOT" },
92+
},
93+
},
94+
{
95+
$project: {
96+
latestChecks: { $slice: [{ $ifNull: ["$latestChecks", []] }, 25] },
97+
},
98+
},
99+
]);
100+
101+
const checksMap = new Map(
102+
checks.map((c: any) => [c._id.toString(), c.latestChecks])
103+
);
104+
return {
105+
statusPage,
106+
checksMap: Object.fromEntries(checksMap),
107+
};
76108
};
77109

78110
getPublic = async (url: string) => {
@@ -83,7 +115,31 @@ class StatusPageService implements IStatusPageService {
83115
if (!statusPage) {
84116
throw new ApiError("Public status page not found", 404);
85117
}
86-
return statusPage;
118+
const monitorIds = (statusPage.monitors || []).map((m) => m._id);
119+
120+
const checks = await Check.aggregate([
121+
{ $match: { "metadata.monitorId": { $in: monitorIds } } },
122+
{ $sort: { createdAt: -1 } },
123+
{
124+
$group: {
125+
_id: "$metadata.monitorId",
126+
latestChecks: { $push: "$$ROOT" },
127+
},
128+
},
129+
{
130+
$project: {
131+
latestChecks: { $slice: [{ $ifNull: ["$latestChecks", []] }, 25] },
132+
},
133+
},
134+
]);
135+
136+
const checksMap = new Map(
137+
checks.map((c: any) => [c._id.toString(), c.latestChecks])
138+
);
139+
return {
140+
statusPage,
141+
checksMap: Object.fromEntries(checksMap),
142+
};
87143
};
88144

89145
getAll = async (teamId: string, page: number, rowsPerPage: number) => {

0 commit comments

Comments
 (0)