diff --git a/.gitignore b/.gitignore index d10deb885..4ebfa360c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ .vscode .VSCodeCounter AGENTS.md -*.sh \ No newline at end of file +*.sh +notes \ No newline at end of file diff --git a/server/src/middleware/VerifyPermission.ts b/server/src/middleware/VerifyPermission.ts index e0dcbbe68..0386fe010 100644 --- a/server/src/middleware/VerifyPermission.ts +++ b/server/src/middleware/VerifyPermission.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import ApiError from "@/utils/ApiError.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; export const hasPermission = ( permissions: string[], requiredPermissions: string[] diff --git a/server/src/routes/checks.ts b/server/src/routes/checks.ts index 4fdce568b..60256c569 100644 --- a/server/src/routes/checks.ts +++ b/server/src/routes/checks.ts @@ -5,7 +5,7 @@ import { verifyToken } from "@/middleware/VerifyToken.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; import { validateQuery } from "@/middleware/validation.js"; import { verifyOrgPermission } from "@/middleware/VerifyPermission.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; import { checksStatusIdQuerySchema } from "@/validation/index.js"; class CheckRoutes { diff --git a/server/src/routes/diagnostic.ts b/server/src/routes/diagnostic.ts index 7f9f07596..d8742e11b 100644 --- a/server/src/routes/diagnostic.ts +++ b/server/src/routes/diagnostic.ts @@ -3,7 +3,7 @@ import { DiagnosticController } from "@/controllers/index.js"; import { verifyToken } from "@/middleware/VerifyToken.js"; import { verifyOrgPermission } from "@/middleware/VerifyPermission.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; class DiagnosticRoutes { private router; diff --git a/server/src/routes/incidents.ts b/server/src/routes/incidents.ts index 739e26d00..235ebac45 100644 --- a/server/src/routes/incidents.ts +++ b/server/src/routes/incidents.ts @@ -5,7 +5,7 @@ import { verifyToken } from "@/middleware/VerifyToken.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; import { validateQuery, validateBody } from "@/middleware/validation.js"; import { verifyOrgPermission } from "@/middleware/VerifyPermission.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; import { getIncidentsQuerySchema, patchIncidentsBodySchema, diff --git a/server/src/routes/invite.ts b/server/src/routes/invite.ts index db0a5f5e5..cef4f5040 100644 --- a/server/src/routes/invite.ts +++ b/server/src/routes/invite.ts @@ -3,7 +3,7 @@ import { InviteController } from "@/controllers/index.js"; import { verifyToken } from "@/middleware/VerifyToken.js"; import { verifyOrgPermission } from "@/middleware/VerifyPermission.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; import { validateBody } from "@/middleware/validation.js"; import { inviteSchema } from "@/validation/index.js"; class InviteRoutes { diff --git a/server/src/routes/maintenance.ts b/server/src/routes/maintenance.ts index 543f15802..89739b665 100644 --- a/server/src/routes/maintenance.ts +++ b/server/src/routes/maintenance.ts @@ -3,7 +3,7 @@ import { MaintenanceController } from "@/controllers/index.js"; import { verifyToken } from "@/middleware/VerifyToken.js"; import { verifyTeamPermission } from "@/middleware/VerifyPermission.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; class MaintenanceRoutes { private router; diff --git a/server/src/routes/monitors.ts b/server/src/routes/monitors.ts index a4ee302c7..fd8e84768 100644 --- a/server/src/routes/monitors.ts +++ b/server/src/routes/monitors.ts @@ -6,7 +6,7 @@ import { verifyTeamPermission, } from "@/middleware/VerifyPermission.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; import { validateBody, validateQuery } from "@/middleware/validation.js"; import { enforceMax, diff --git a/server/src/routes/notificationChannels.ts b/server/src/routes/notificationChannels.ts index f8e26809b..d708ade2e 100644 --- a/server/src/routes/notificationChannels.ts +++ b/server/src/routes/notificationChannels.ts @@ -4,7 +4,7 @@ import { NotificationChannelController } from "@/controllers/index.js"; import { verifyToken } from "@/middleware/VerifyToken.js"; import { verifyTeamPermission } from "@/middleware/VerifyPermission.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; import { validateBody } from "@/middleware/validation.js"; import { enforceMax, requireFeature } from "@/middleware/VerifyEntitlements.js"; import { diff --git a/server/src/routes/roles.ts b/server/src/routes/roles.ts index 0e5148344..186303780 100644 --- a/server/src/routes/roles.ts +++ b/server/src/routes/roles.ts @@ -4,7 +4,7 @@ import { RoleController } from "@/controllers/index.js"; import { verifyToken } from "@/middleware/VerifyToken.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; import { verifyOrgPermission } from "@/middleware/VerifyPermission.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; class RoleRoutes { private controller: RoleController; diff --git a/server/src/routes/settings.ts b/server/src/routes/settings.ts index ad7f17af8..cfc395a36 100644 --- a/server/src/routes/settings.ts +++ b/server/src/routes/settings.ts @@ -3,7 +3,7 @@ import { SettingsController } from "@/controllers/index.js"; import { verifyToken } from "@/middleware/VerifyToken.js"; import { verifyTeamPermission } from "@/middleware/VerifyPermission.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; import { validateBody } from "@/middleware/validation.js"; import { systemSettingsSchema, diff --git a/server/src/routes/statusPages.ts b/server/src/routes/statusPages.ts index 98501ea63..7f7ec0dc7 100644 --- a/server/src/routes/statusPages.ts +++ b/server/src/routes/statusPages.ts @@ -4,7 +4,7 @@ import { StatusPageController } from "@/controllers/index.js"; import { verifyToken } from "@/middleware/VerifyToken.js"; import { verifyTeamPermission } from "@/middleware/VerifyPermission.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; import { validateBody } from "@/middleware/validation.js"; import { statusPageSchema } from "@/validation/index.js"; import { enforceMax } from "@/middleware/VerifyEntitlements.js"; diff --git a/server/src/routes/team.ts b/server/src/routes/team.ts index 444e27893..72d1d818a 100644 --- a/server/src/routes/team.ts +++ b/server/src/routes/team.ts @@ -6,7 +6,7 @@ import { verifyToken } from "@/middleware/VerifyToken.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; import { verifyOrgPermission } from "@/middleware/VerifyPermission.js"; import { enforceMax } from "@/middleware/VerifyEntitlements.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; class TeamRoutes { private controller: TeamController; diff --git a/server/src/routes/teamMembers.ts b/server/src/routes/teamMembers.ts index 5eda056b2..3fbc5d2cc 100644 --- a/server/src/routes/teamMembers.ts +++ b/server/src/routes/teamMembers.ts @@ -4,7 +4,7 @@ import { TeamMemberController } from "@/controllers/index.js"; import { verifyToken } from "@/middleware/VerifyToken.js"; import { addUserContext } from "@/middleware/AddUserContext.js"; import { verifyOrgPermission } from "@/middleware/VerifyPermission.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; class TeamMemberRoutes { private controller: TeamMemberController; diff --git a/server/src/services/business/AuthService.ts b/server/src/services/business/AuthService.ts index 706cb3ce0..c3b790db7 100644 --- a/server/src/services/business/AuthService.ts +++ b/server/src/services/business/AuthService.ts @@ -21,89 +21,10 @@ import ApiError from "@/utils/ApiError.js"; import { IJobQueue } from "../infrastructure/JobQueue.js"; import { hashPassword } from "@/utils/JWTUtils.js"; import { Plans } from "@/types/entitlements.js"; +import { PERMISSIONS } from "@/types/permissions.js"; const SERVICE_NAME = "AuthService"; -export const PERMISSIONS = { - master: "master", - users: { - all: "users.*", - write: "users.write", - read: "users.read", - delete: "users.delete", - }, - monitors: { - all: "monitors.*", - write: "monitors.write", - read: "monitors.read", - update: "monitors.update", - delete: "monitors.delete", - }, - notifications: { - all: "notifications.*", - write: "notifications.write", - read: "notifications.read", - update: "notifications.update", - delete: "notifications.delete", - }, - maintenance: { - all: "maintenance.*", - write: "maintenance.write", - read: "maintenance.read", - update: "maintenance.update", - delete: "maintenance.delete", - }, - invite: { - all: "invite.*", - write: "invite.write", - read: "invite.read", - delete: "invite.delete", - }, - checks: { - all: "checks.*", - write: "checks.write", - read: "checks.read", - update: "checks.update", - delete: "checks.delete", - }, - statusPages: { - all: "statusPages.*", - write: "statusPages.write", - read: "statusPages.read", - update: "statusPages.update", - delete: "statusPages.delete", - }, - teams: { - all: "teams.*", - write: "teams.write", - read: "teams.read", - update: "teams.update", - delete: "teams.delete", - }, - roles: { - all: "roles.*", - write: "roles.write", - read: "roles.read", - update: "roles.update", - delete: "roles.delete", - }, - - diagnostic: { - all: "diagnostic.*", - write: "diagnostic.write", - read: "diagnostic.read", - update: "diagnostic.update", - delete: "diagnostic.delete", - }, - incidents: { - all: "incidents.*", - write: "incidents.write", - read: "incidents.read", - update: "incidents.update", - delete: "incidents.delete", - }, -}; - export type RegisterData = { firstName: string; lastName: string; diff --git a/server/src/services/business/TeamService.ts b/server/src/services/business/TeamService.ts index bd36b042b..505c9cf3a 100644 --- a/server/src/services/business/TeamService.ts +++ b/server/src/services/business/TeamService.ts @@ -11,7 +11,7 @@ import { } from "@/db/models/index.js"; import type { IJobQueue } from "../infrastructure/JobQueue.js"; import ApiError from "@/utils/ApiError.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; const SERVICE_NAME = "TeamService"; export interface ITeamService { diff --git a/server/src/types/permissions.ts b/server/src/types/permissions.ts new file mode 100644 index 000000000..03516a651 --- /dev/null +++ b/server/src/types/permissions.ts @@ -0,0 +1,96 @@ +export const PERMISSIONS = { + master: "master", + users: { + all: "users.*", + write: "users.write", + read: "users.read", + delete: "users.delete", + }, + monitors: { + all: "monitors.*", + write: "monitors.write", + read: "monitors.read", + update: "monitors.update", + delete: "monitors.delete", + }, + notifications: { + all: "notifications.*", + write: "notifications.write", + read: "notifications.read", + update: "notifications.update", + delete: "notifications.delete", + }, + maintenance: { + all: "maintenance.*", + write: "maintenance.write", + read: "maintenance.read", + update: "maintenance.update", + delete: "maintenance.delete", + }, + invite: { + all: "invite.*", + write: "invite.write", + read: "invite.read", + delete: "invite.delete", + }, + checks: { + all: "checks.*", + write: "checks.write", + read: "checks.read", + update: "checks.update", + delete: "checks.delete", + }, + statusPages: { + all: "statusPages.*", + write: "statusPages.write", + read: "statusPages.read", + update: "statusPages.update", + delete: "statusPages.delete", + }, + teams: { + all: "teams.*", + write: "teams.write", + read: "teams.read", + update: "teams.update", + delete: "teams.delete", + }, + roles: { + all: "roles.*", + write: "roles.write", + read: "roles.read", + update: "roles.update", + delete: "roles.delete", + }, + diagnostic: { + all: "diagnostic.*", + write: "diagnostic.write", + read: "diagnostic.read", + update: "diagnostic.update", + delete: "diagnostic.delete", + }, + incidents: { + all: "incidents.*", + write: "incidents.write", + read: "incidents.read", + update: "incidents.update", + delete: "incidents.delete", + }, + billing: { + all: "billing.*", + }, +}; + +export type Permission = + | typeof PERMISSIONS.master + | (typeof PERMISSIONS.users)[keyof typeof PERMISSIONS.users] + | (typeof PERMISSIONS.monitors)[keyof typeof PERMISSIONS.monitors] + | (typeof PERMISSIONS.notifications)[keyof typeof PERMISSIONS.notifications] + | (typeof PERMISSIONS.maintenance)[keyof typeof PERMISSIONS.maintenance] + | (typeof PERMISSIONS.invite)[keyof typeof PERMISSIONS.invite] + | (typeof PERMISSIONS.checks)[keyof typeof PERMISSIONS.checks] + | (typeof PERMISSIONS.statusPages)[keyof typeof PERMISSIONS.statusPages] + | (typeof PERMISSIONS.teams)[keyof typeof PERMISSIONS.teams] + | (typeof PERMISSIONS.roles)[keyof typeof PERMISSIONS.roles] + | (typeof PERMISSIONS.diagnostic)[keyof typeof PERMISSIONS.diagnostic] + | (typeof PERMISSIONS.incidents)[keyof typeof PERMISSIONS.incidents] + | (typeof PERMISSIONS.billing)[keyof typeof PERMISSIONS.billing]; diff --git a/server/src/utils/FeatureFlags.ts b/server/src/utils/FeatureFlags.ts index c2775f6c9..bb3ff5c19 100644 --- a/server/src/utils/FeatureFlags.ts +++ b/server/src/utils/FeatureFlags.ts @@ -1,5 +1,5 @@ import { config } from "@/config/index.js"; -import { PERMISSIONS } from "@/services/business/AuthService.js"; +import { PERMISSIONS } from "@/types/permissions.js"; export type DeploymentMode = "saas" | "self_hosted"; const CURRENT_MODE = config.DEPLOYMENT_MODE;