style: privilegies => privileges

This commit is contained in:
kroyzen 2023-08-22 11:14:53 +03:00
parent b30590dbfb
commit c25f72a185
14 changed files with 88 additions and 88 deletions

@ -15,8 +15,8 @@ export const validatePrivilege = (privilege: RawPrivilege): Error | null => {
return null; return null;
}; };
export const convertPrivilegiesToMap = (privilegies: Privilege[]) => { export const convertPrivilegesToMap = (privileges: Privilege[]) => {
return privilegies.reduce<Record<string, Privilege[]>>((accamulator, privilege) => { return privileges.reduce<Record<string, Privilege[]>>((accamulator, privilege) => {
if (!accamulator[privilege.serviceKey]) { if (!accamulator[privilege.serviceKey]) {
accamulator[privilege.serviceKey] = []; accamulator[privilege.serviceKey] = [];
} }

@ -3,31 +3,31 @@ import { Types } from "mongoose";
import { PrivilegeModel } from "@/models/privilege.model"; import { PrivilegeModel } from "@/models/privilege.model";
import { validateEmptyFields } from "@/utils/validate-empty-fields"; import { validateEmptyFields } from "@/utils/validate-empty-fields";
import { convertPrivilegiesToMap, validatePrivilege } from "./helpers"; import { convertPrivilegesToMap, validatePrivilege } from "./helpers";
import type { FastifyReply } from "fastify"; import type { FastifyReply } from "fastify";
import type { import type {
GetServicePrivilegiesRequest, GetServicePrivilegesRequest,
RegisterPrivilegeRequest, RegisterPrivilegeRequest,
GetPrivilegeRequest, GetPrivilegeRequest,
RegisterPrivilegiesRequest, RegisterPrivilegesRequest,
RemovePrivilegeRequest, RemovePrivilegeRequest,
} from "./types"; } from "./types";
export const registerPrivilegies = async (request: RegisterPrivilegiesRequest, reply: FastifyReply) => { export const registerPrivileges = async (request: RegisterPrivilegesRequest, reply: FastifyReply) => {
const [requestBody, errorEmpty] = validateEmptyFields(request.body ?? {}, ["privilegies"]); const [requestBody, errorEmpty] = validateEmptyFields(request.body ?? {}, ["privileges"]);
if (errorEmpty) { if (errorEmpty) {
void reply.status(400); void reply.status(400);
return errorEmpty; return errorEmpty;
} }
if (!requestBody.privilegies.length) { if (!requestBody.privileges.length) {
void reply.status(400); void reply.status(400);
return new Error("empty privilege array"); return new Error("empty privilege array");
} }
for (const rawPrivilege of requestBody.privilegies) { for (const rawPrivilege of requestBody.privileges) {
const errorInvalid = validatePrivilege(rawPrivilege); const errorInvalid = validatePrivilege(rawPrivilege);
if (errorInvalid) { if (errorInvalid) {
@ -36,7 +36,7 @@ export const registerPrivilegies = async (request: RegisterPrivilegiesRequest, r
} }
} }
const updatePrivilegeRequests = requestBody.privilegies.map(async (privilege) => { const updatePrivilegeRequests = requestBody.privileges.map(async (privilege) => {
await PrivilegeModel.updateOne( await PrivilegeModel.updateOne(
{ privilegeId: privilege.privilegeId }, { privilegeId: privilege.privilegeId },
{ {
@ -100,19 +100,19 @@ export const registerPrivilege = async (request: RegisterPrivilegeRequest, reply
return newPrivilege.save(); return newPrivilege.save();
}; };
export const getAllPrivilegies = async () => PrivilegeModel.find({ isDeleted: false }).lean(); export const getAllPrivileges = async () => PrivilegeModel.find({ isDeleted: false }).lean();
export const getAllPrivilegiesMap = async () => { export const getAllPrivilegesMap = async () => {
const privilegies = await PrivilegeModel.find({ isDeleted: false }).lean(); const privileges = await PrivilegeModel.find({ isDeleted: false }).lean();
if (!privilegies.length) { if (!privileges.length) {
return {}; return {};
} }
return convertPrivilegiesToMap(privilegies); return convertPrivilegesToMap(privileges);
}; };
export const getServicePrivilegies = async (request: GetServicePrivilegiesRequest, reply: FastifyReply) => { export const getServicePrivileges = async (request: GetServicePrivilegesRequest, reply: FastifyReply) => {
const [requestParams, error] = validateEmptyFields(request.params ?? {}, ["serviceKey"]); const [requestParams, error] = validateEmptyFields(request.params ?? {}, ["serviceKey"]);
if (error) { if (error) {
@ -212,20 +212,20 @@ export const removePrivilege = async (request: RemovePrivilegeRequest, reply: Fa
return privilege; return privilege;
}; };
export const replacePrivilegies = async (request: RegisterPrivilegiesRequest, reply: FastifyReply) => { export const replacePrivileges = async (request: RegisterPrivilegesRequest, reply: FastifyReply) => {
const [requestBody, errorEmpty] = validateEmptyFields(request.body ?? {}, ["privilegies"]); const [requestBody, errorEmpty] = validateEmptyFields(request.body ?? {}, ["privileges"]);
if (errorEmpty) { if (errorEmpty) {
void reply.status(400); void reply.status(400);
return errorEmpty; return errorEmpty;
} }
if (!requestBody.privilegies.length) { if (!requestBody.privileges.length) {
void reply.status(400); void reply.status(400);
return new Error("empty privilege array"); return new Error("empty privilege array");
} }
for (const rawPrivilege of requestBody.privilegies) { for (const rawPrivilege of requestBody.privileges) {
const errorInvalid = validatePrivilege(rawPrivilege); const errorInvalid = validatePrivilege(rawPrivilege);
if (errorInvalid) { if (errorInvalid) {
@ -234,7 +234,7 @@ export const replacePrivilegies = async (request: RegisterPrivilegiesRequest, re
} }
} }
const replacePrivilegeRequests = requestBody.privilegies.map(async (privilege) => { const replacePrivilegeRequests = requestBody.privileges.map(async (privilege) => {
await PrivilegeModel.replaceOne( await PrivilegeModel.replaceOne(
{ privilegeId: privilege.privilegeId }, { privilegeId: privilege.privilegeId },
{ {

@ -8,13 +8,13 @@ export type RegisterPrivilegeRequest = FastifyRequest<{
Body?: RawPrivilege; Body?: RawPrivilege;
}>; }>;
export type RegisterPrivilegiesRequest = FastifyRequest<{ export type RegisterPrivilegesRequest = FastifyRequest<{
Body?: { Body?: {
privilegies?: RawPrivilege[]; privileges?: RawPrivilege[];
}; };
}>; }>;
export type GetServicePrivilegiesRequest = FastifyRequest<{ export type GetServicePrivilegesRequest = FastifyRequest<{
Params?: { Params?: {
serviceKey?: string; serviceKey?: string;
}; };

@ -4,7 +4,7 @@ import type { TariffMessage } from "@/types/messages/tariff-message.type";
import type { ObjectWithRequiredFields } from "@/types/object-with-required-fields"; import type { ObjectWithRequiredFields } from "@/types/object-with-required-fields";
export const validateTariff = (tariff?: TariffMessage): [ObjectWithRequiredFields<TariffMessage>, Error | null] => { export const validateTariff = (tariff?: TariffMessage): [ObjectWithRequiredFields<TariffMessage>, Error | null] => {
const [validatedTariff, errorEmpty] = validateEmptyFields(tariff ?? {}, ["isCustom", "name", "privilegies"], false); const [validatedTariff, errorEmpty] = validateEmptyFields(tariff ?? {}, ["isCustom", "name", "privileges"], false);
if (errorEmpty) { if (errorEmpty) {
return [validatedTariff, errorEmpty]; return [validatedTariff, errorEmpty];

@ -75,7 +75,7 @@ export const createTariff = async (request: CreateTariffRequest, reply: FastifyR
throw error; throw error;
} }
for (const privilege of requestBody.privilegies) { for (const privilege of requestBody.privileges) {
if (!Types.ObjectId.isValid(privilege.privilegeId)) { if (!Types.ObjectId.isValid(privilege.privilegeId)) {
void reply.status(404); void reply.status(404);
throw new Error(`privilege id <${privilege.privilegeId}> invalid`); throw new Error(`privilege id <${privilege.privilegeId}> invalid`);
@ -87,7 +87,7 @@ export const createTariff = async (request: CreateTariffRequest, reply: FastifyR
price: requestBody.price, price: requestBody.price,
userId: request.user.id, userId: request.user.id,
isCustom: requestBody.isCustom, isCustom: requestBody.isCustom,
privilegies: requestBody.privilegies, privileges: requestBody.privileges,
}); });
return newTariff.save(); return newTariff.save();
@ -113,19 +113,19 @@ export const replaceTariff = async (request: ReplaceTariffRequest, reply: Fastif
throw new Error("tariff not found"); throw new Error("tariff not found");
} }
for (const privilege of requestBody.privilegies) { for (const privilege of requestBody.privileges) {
if (!Types.ObjectId.isValid(privilege.privilegeId)) { if (!Types.ObjectId.isValid(privilege.privilegeId)) {
void reply.status(404); void reply.status(404);
throw new Error(`privilege id <${privilege.privilegeId}> invalid`); throw new Error(`privilege id <${privilege.privilegeId}> invalid`);
} }
} }
const privilegiesMap = new Map(requestBody.privilegies.map((privilege) => [privilege.privilegeId, privilege])); const privilegesMap = new Map(requestBody.privileges.map((privilege) => [privilege.privilegeId, privilege]));
const privilegeIDs = requestBody.privilegies.map(({ privilegeId }) => privilegeId); const privilegeIDs = requestBody.privileges.map(({ privilegeId }) => privilegeId);
const privilegies = await PrivilegeModel.find({ _id: privilegeIDs }).lean(); const privileges = await PrivilegeModel.find({ _id: privilegeIDs }).lean();
const cleanPrivilegies = privilegies.map<Omit<Privilege, keyof Eloquent>>((privilege) => { const cleanPrivileges = privileges.map<Omit<Privilege, keyof Eloquent>>((privilege) => {
const currentPrivilege = privilegiesMap.get(privilege._id.toString()); const currentPrivilege = privilegesMap.get(privilege._id.toString());
return { return {
name: privilege.name, name: privilege.name,
@ -143,7 +143,7 @@ export const replaceTariff = async (request: ReplaceTariffRequest, reply: Fastif
name: requestBody.name, name: requestBody.name,
price: requestBody.price, price: requestBody.price,
isCustom: requestBody.isCustom, isCustom: requestBody.isCustom,
privilegies: cleanPrivilegies, privileges: cleanPrivileges,
}); });
return tariff; return tariff;

@ -47,7 +47,7 @@ const schema: SchemaDefinition<Privilege> = {
const schemaSettings = { const schemaSettings = {
versionKey: false, versionKey: false,
collection: "privilegies", collection: "privileges",
}; };
export const PrivilegeSchema = new Schema<Privilege>(schema, schemaSettings); export const PrivilegeSchema = new Schema<Privilege>(schema, schemaSettings);

@ -22,7 +22,7 @@ const schema: SchemaDefinition<Tariff> = {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
privilegies: { privileges: {
type: [PrivilegeSchema], type: [PrivilegeSchema],
default: [], default: [],
}, },

@ -2,39 +2,39 @@ import { Router } from "@/server/router";
import { import {
registerPrivilege, registerPrivilege,
getAllPrivilegies, getAllPrivileges,
getAllPrivilegiesMap, getAllPrivilegesMap,
getPrivilege, getPrivilege,
getServicePrivilegies, getServicePrivileges,
replacePrivilege, replacePrivilege,
registerPrivilegies, registerPrivileges,
removePrivilege, removePrivilege,
replacePrivilegies, replacePrivileges,
restorePrivilege, restorePrivilege,
} from "@/handlers/privilege"; } from "@/handlers/privilege";
import { import {
getPrivilegiesSchema, getPrivilegesSchema,
getPrivilegiesMapSchema, getPrivilegesMapSchema,
getPrivilegeSchema, getPrivilegeSchema,
getServicePrivilegiesSchema, getServicePrivilegesSchema,
registerPrivilegeSchema, registerPrivilegeSchema,
registerPrivilegiesSchema, registerPrivilegesSchema,
replacePrivilegeSchema, replacePrivilegeSchema,
replacePrivilegiesSchema, replacePrivilegesSchema,
removePrivilegeSchema, removePrivilegeSchema,
restorePrivilegeSchema, restorePrivilegeSchema,
} from "@/swagger/privilege"; } from "@/swagger/privilege";
export const setPrivilegeRoutes = (router: Router): void => { export const setPrivilegeRoutes = (router: Router): void => {
router.get("/", getAllPrivilegies, { schema: getPrivilegiesSchema }); router.get("/", getAllPrivileges, { schema: getPrivilegesSchema });
router.get("/service", getAllPrivilegiesMap, { schema: getPrivilegiesMapSchema }); router.get("/service", getAllPrivilegesMap, { schema: getPrivilegesMapSchema });
router.get("/:privilegeId", getPrivilege, { schema: getPrivilegeSchema }); router.get("/:privilegeId", getPrivilege, { schema: getPrivilegeSchema });
router.get("/service/:serviceKey", getServicePrivilegies, { schema: getServicePrivilegiesSchema }); router.get("/service/:serviceKey", getServicePrivileges, { schema: getServicePrivilegesSchema });
router.post("/", registerPrivilege, { schema: registerPrivilegeSchema }); router.post("/", registerPrivilege, { schema: registerPrivilegeSchema });
router.post("/many", registerPrivilegies, { schema: registerPrivilegiesSchema }); router.post("/many", registerPrivileges, { schema: registerPrivilegesSchema });
router.post("/restore/", restorePrivilege, { schema: restorePrivilegeSchema }); router.post("/restore/", restorePrivilege, { schema: restorePrivilegeSchema });
router.put("/", replacePrivilege, { schema: replacePrivilegeSchema }); router.put("/", replacePrivilege, { schema: replacePrivilegeSchema });
router.put("/many", replacePrivilegies, { schema: replacePrivilegiesSchema }); router.put("/many", replacePrivileges, { schema: replacePrivilegesSchema });
router.delete("/", removePrivilege, { schema: removePrivilegeSchema }); router.delete("/", removePrivilege, { schema: removePrivilegeSchema });
}; };

@ -1,30 +1,30 @@
import { privilegeBody, registerPrivilegiesBody, getPrivilegeParams, getServicePrivilegiesParams } from "./inputs"; import { privilegeBody, registerPrivilegesBody, getPrivilegeParams, getServicePrivilegesParams } from "./inputs";
import { import {
getPrivilegeReponse, getPrivilegeReponse,
getPrivilegiesReponse, getPrivilegesReponse,
getAllPrivilegiesMapReponse, getAllPrivilegesMapReponse,
getAllPrivilegiesReponse, getAllPrivilegesReponse,
registerPrivilegeResponse, registerPrivilegeResponse,
replacePrivilegeResponse, replacePrivilegeResponse,
registerPrivilegiesResponse, registerPrivilegesResponse,
replacePrivilegiesResponse, replacePrivilegesResponse,
removePrivilegeResponse, removePrivilegeResponse,
} from "./responses"; } from "./responses";
import type { SwaggerSchema } from "@/types/swagger.type"; import type { SwaggerSchema } from "@/types/swagger.type";
export const getPrivilegiesSchema: SwaggerSchema = { export const getPrivilegesSchema: SwaggerSchema = {
summary: "Получение всех привелегий", summary: "Получение всех привелегий",
description: "Получение всех привелегий в виде массива", description: "Получение всех привелегий в виде массива",
tags: ["privilege"], tags: ["privilege"],
response: getAllPrivilegiesReponse, response: getAllPrivilegesReponse,
}; };
export const getPrivilegiesMapSchema: SwaggerSchema = { export const getPrivilegesMapSchema: SwaggerSchema = {
summary: "Получение всех привелегий", summary: "Получение всех привелегий",
description: "Получение всех привелегий в виде объекта ключ-значение, где ключём является serviceKey", description: "Получение всех привелегий в виде объекта ключ-значение, где ключём является serviceKey",
tags: ["privilege"], tags: ["privilege"],
response: getAllPrivilegiesMapReponse, response: getAllPrivilegesMapReponse,
}; };
export const getPrivilegeSchema: SwaggerSchema = { export const getPrivilegeSchema: SwaggerSchema = {
@ -34,11 +34,11 @@ export const getPrivilegeSchema: SwaggerSchema = {
response: getPrivilegeReponse, response: getPrivilegeReponse,
}; };
export const getServicePrivilegiesSchema: SwaggerSchema = { export const getServicePrivilegesSchema: SwaggerSchema = {
summary: "Получение привилегий сервиса", summary: "Получение привилегий сервиса",
tags: ["privilege"], tags: ["privilege"],
params: getServicePrivilegiesParams, params: getServicePrivilegesParams,
response: getPrivilegiesReponse, response: getPrivilegesReponse,
}; };
export const registerPrivilegeSchema: SwaggerSchema = { export const registerPrivilegeSchema: SwaggerSchema = {
@ -48,11 +48,11 @@ export const registerPrivilegeSchema: SwaggerSchema = {
response: registerPrivilegeResponse, response: registerPrivilegeResponse,
}; };
export const registerPrivilegiesSchema: SwaggerSchema = { export const registerPrivilegesSchema: SwaggerSchema = {
summary: "Регистрация привелегий сервиса", summary: "Регистрация привелегий сервиса",
tags: ["privilege"], tags: ["privilege"],
body: registerPrivilegiesBody, body: registerPrivilegesBody,
response: registerPrivilegiesResponse, response: registerPrivilegesResponse,
}; };
export const replacePrivilegeSchema: SwaggerSchema = { export const replacePrivilegeSchema: SwaggerSchema = {
@ -62,11 +62,11 @@ export const replacePrivilegeSchema: SwaggerSchema = {
response: replacePrivilegeResponse, response: replacePrivilegeResponse,
}; };
export const replacePrivilegiesSchema: SwaggerSchema = { export const replacePrivilegesSchema: SwaggerSchema = {
summary: "Замена привилегий сервиса", summary: "Замена привилегий сервиса",
tags: ["privilege"], tags: ["privilege"],
body: registerPrivilegiesBody, body: registerPrivilegesBody,
response: replacePrivilegiesResponse, response: replacePrivilegesResponse,
}; };
export const removePrivilegeSchema: SwaggerSchema = { export const removePrivilegeSchema: SwaggerSchema = {

@ -27,15 +27,15 @@ export const privilegeBody: SwaggerMessage = {
], ],
}; };
export const privilegiesBody: SwaggerMessage = { export const privilegesBody: SwaggerMessage = {
type: "array", type: "array",
items: privilegeBody, items: privilegeBody,
}; };
export const registerPrivilegiesBody: SwaggerMessage = { export const registerPrivilegesBody: SwaggerMessage = {
type: "object", type: "object",
properties: { properties: {
privilegies: privilegiesBody, privileges: privilegesBody,
}, },
}; };
@ -51,7 +51,7 @@ export const getPrivilegeParams: SwaggerMessage = {
examples: [{ privilegeId: "507f1f77bcf86cd799439011" }], examples: [{ privilegeId: "507f1f77bcf86cd799439011" }],
}; };
export const getServicePrivilegiesParams: SwaggerMessage = { export const getServicePrivilegesParams: SwaggerMessage = {
type: "object", type: "object",
required: ["serviceKey"], required: ["serviceKey"],
properties: { properties: {

@ -4,7 +4,7 @@ import { privilege } from "./models";
import type { SwaggerMessage } from "@/types/swagger.type"; import type { SwaggerMessage } from "@/types/swagger.type";
export const getAllPrivilegiesReponse: Record<string, SwaggerMessage> = { export const getAllPrivilegesReponse: Record<string, SwaggerMessage> = {
200: { 200: {
type: "array", type: "array",
description: "Привилегии", description: "Привилегии",
@ -12,7 +12,7 @@ export const getAllPrivilegiesReponse: Record<string, SwaggerMessage> = {
}, },
}; };
export const getAllPrivilegiesMapReponse: Record<string, SwaggerMessage> = { export const getAllPrivilegesMapReponse: Record<string, SwaggerMessage> = {
200: { 200: {
type: "object", type: "object",
description: "Привилегии", description: "Привилегии",
@ -44,7 +44,7 @@ export const getAllPrivilegiesMapReponse: Record<string, SwaggerMessage> = {
}, },
}; };
export const getPrivilegiesReponse: Record<string, SwaggerMessage> = { export const getPrivilegesReponse: Record<string, SwaggerMessage> = {
200: { 200: {
type: "array", type: "array",
description: "Массив привилегий", description: "Массив привилегий",
@ -64,7 +64,7 @@ export const registerPrivilegeResponse: Record<string, SwaggerMessage> = {
409: swaggerError(409, "privilege already exist"), 409: swaggerError(409, "privilege already exist"),
}; };
export const registerPrivilegiesResponse: Record<string, SwaggerMessage> = { export const registerPrivilegesResponse: Record<string, SwaggerMessage> = {
200: { 200: {
type: "array", type: "array",
description: "Массив привилегий", description: "Массив привилегий",
@ -79,7 +79,7 @@ export const replacePrivilegeResponse: Record<string, SwaggerMessage> = {
404: swaggerError(404, "privilege not found"), 404: swaggerError(404, "privilege not found"),
}; };
export const replacePrivilegiesResponse: Record<string, SwaggerMessage> = { export const replacePrivilegesResponse: Record<string, SwaggerMessage> = {
200: { 200: {
type: "array", type: "array",
description: "Массив привилегий", description: "Массив привилегий",

@ -29,12 +29,12 @@ export const getTariffsQuerystring: SwaggerMessage = {
export const tariffBody: SwaggerMessage = { export const tariffBody: SwaggerMessage = {
type: "object", type: "object",
description: "Тариф", description: "Тариф",
required: ["name", "isCustom", "privilegies"], required: ["name", "isCustom", "privileges"],
properties: { properties: {
name: { type: "string" }, name: { type: "string" },
price: { type: "number" }, price: { type: "number" },
isCustom: { type: "boolean" }, isCustom: { type: "boolean" },
privilegies: { privileges: {
type: "array", type: "array",
items: { items: {
type: "object", type: "object",
@ -57,7 +57,7 @@ export const tariffBody: SwaggerMessage = {
name: "Использование сервисов", name: "Использование сервисов",
price: 14000, price: 14000,
isCustom: false, isCustom: false,
privilegies: [ privileges: [
{ {
name: "Количество попыток использования", name: "Количество попыток использования",
privilegeId: "507f1f77bcf86cd799439011", privilegeId: "507f1f77bcf86cd799439011",

@ -8,7 +8,7 @@ export const tariff: SwaggerMessage = {
name: { type: "string" }, name: { type: "string" },
price: { type: "number" }, price: { type: "number" },
isCustom: { type: "boolean" }, isCustom: { type: "boolean" },
privilegies: { privileges: {
type: "array", type: "array",
items: { items: {
type: "object", type: "object",
@ -43,7 +43,7 @@ export const tariff: SwaggerMessage = {
name: "Использование сервисов", name: "Использование сервисов",
price: 14000, price: 14000,
isCustom: false, isCustom: false,
privilegies: [ privileges: [
{ {
name: "name", name: "name",
privilegeId: "507f1f77bcf86cd799439011", privilegeId: "507f1f77bcf86cd799439011",
@ -63,7 +63,7 @@ export const tariff: SwaggerMessage = {
name: "user", name: "user",
price: 14000, price: 14000,
isCustom: false, isCustom: false,
privilegies: [ privileges: [
{ {
name: "507f1f77bcf86cd799439011", name: "507f1f77bcf86cd799439011",
privilegeId: "507f1f77bcf86cd799439011", privilegeId: "507f1f77bcf86cd799439011",
@ -103,7 +103,7 @@ export const tariffs: SwaggerMessage = {
name: "Использование сервисов", name: "Использование сервисов",
price: 14000, price: 14000,
isCustom: false, isCustom: false,
privilegies: [ privileges: [
{ {
name: "name", name: "name",
privilegeId: "507f1f77bcf86cd799439011", privilegeId: "507f1f77bcf86cd799439011",
@ -123,7 +123,7 @@ export const tariffs: SwaggerMessage = {
name: "user", name: "user",
price: 14000, price: 14000,
isCustom: false, isCustom: false,
privilegies: [ privileges: [
{ {
name: "507f1f77bcf86cd799439011", name: "507f1f77bcf86cd799439011",
privilegeId: "507f1f77bcf86cd799439011", privilegeId: "507f1f77bcf86cd799439011",

@ -6,5 +6,5 @@ export type Tariff = Eloquent & {
userId: string; userId: string;
price?: number; price?: number;
isCustom: boolean; isCustom: boolean;
privilegies: Array<Omit<Privilege, keyof Eloquent>>; privileges: Array<Omit<Privilege, keyof Eloquent>>;
}; };