Compare commits

...

2 commits

5 changed files with 40 additions and 11 deletions

View file

@ -1,9 +1,11 @@
import { Request, Response } from "express"; import { Request, Response } from "express";
import MissionService from "../../../service/operation/missionService"; import MissionService from "../../../service/operation/missionService";
import MissionFactory from "../../../factory/admin/operation/mission"; import MissionFactory from "../../../factory/admin/operation/mission";
import { DeleteMissionCommand, SyncMissionCommand } from "../../../command/operation/mission/missionCommand"; import { DeleteMissionCommand } from "../../../command/operation/mission/missionCommand";
import MissionCommandHandler from "../../../command/operation/mission/missionCommandHandler"; import MissionCommandHandler from "../../../command/operation/mission/missionCommandHandler";
import SocketServer from "../../../websocket"; import SocketServer from "../../../websocket";
import PermissionHelper from "../../../helpers/permissionHelper";
import moment from "moment";
/** /**
* @description get all missions * @description get all missions
@ -16,7 +18,15 @@ export async function getAllMissions(req: Request, res: Response): Promise<any>
let count = parseInt((req.query.count as string) ?? "25"); let count = parseInt((req.query.count as string) ?? "25");
let noLimit = req.query.noLimit === "true"; let noLimit = req.query.noLimit === "true";
let [missions, total] = await MissionService.getAll({ offset, count, noLimit }); let maxVisInDays = PermissionHelper.canValue(req.permissions, "maxVisInDays", true);
let maxVisByMissions = PermissionHelper.canValue(req.permissions, "maxVisByMissions", true);
let [missions, total] = await MissionService.getAll({
offset: maxVisByMissions != "" && parseInt(maxVisByMissions) <= 25 ? 0 : offset,
count: maxVisByMissions != "" ? Math.min(parseInt(maxVisByMissions), (offset + 1) * count) : count,
noLimit: maxVisByMissions != "" ? false : noLimit,
laterThan: maxVisInDays != "" ? moment().subtract(parseInt(maxVisInDays), "days").toDate() : undefined,
});
res.json({ res.json({
missions: MissionFactory.mapToBaseShort(missions), missions: MissionFactory.mapToBaseShort(missions),

View file

@ -55,7 +55,10 @@ export abstract class JWTHelper {
let rolePermissions = let rolePermissions =
userRoles.length != 0 ? await RolePermissionService.getByRoles(userRoles.map((e) => e.id)) : []; userRoles.length != 0 ? await RolePermissionService.getByRoles(userRoles.map((e) => e.id)) : [];
let rolePermissionStrings = rolePermissions.map((e) => e.permission); let rolePermissionStrings = rolePermissions.map((e) => e.permission);
let permissionObject = PermissionHelper.convertToObject([...userPermissionStrings, ...rolePermissionStrings]); let permissionObject = PermissionHelper.convertToObject(
[...userPermissionStrings, ...rolePermissionStrings],
isOwner
);
let jwtData: JWTToken = { let jwtData: JWTToken = {
userId: id, userId: id,

View file

@ -19,8 +19,8 @@ export default class PermissionHelper {
section: PermissionSection, section: PermissionSection,
module?: PermissionModule module?: PermissionModule
) { ) {
if (type == "admin") return permissions?.admin ?? false; if (type == "admin") return permissions?.admin ?? permissions?.adminByOwner ?? false;
if (permissions?.admin) return true; if (permissions?.admin || permissions?.adminByOwner) return true;
if ( if (
(!module && (!module &&
permissions[section] != undefined && permissions[section] != undefined &&
@ -52,8 +52,8 @@ export default class PermissionHelper {
type: PermissionType | "admin", type: PermissionType | "admin",
section: PermissionSection section: PermissionSection
): boolean { ): boolean {
if (type == "admin") return permissions?.admin ?? false; if (type == "admin") return permissions?.admin ?? permissions?.adminByOwner ?? false;
if (permissions?.admin) return true; if (permissions?.admin || permissions?.adminByOwner) return true;
if ( if (
permissions[section]?.all == "*" || permissions[section]?.all == "*" ||
permissions[section]?.all?.includes(type) || permissions[section]?.all?.includes(type) ||
@ -76,7 +76,7 @@ export default class PermissionHelper {
} }
static canValue(permissions: PermissionObject, key: string, emptyIfAdmin: boolean = false): string { static canValue(permissions: PermissionObject, key: string, emptyIfAdmin: boolean = false): string {
if (emptyIfAdmin && permissions.admin) return ""; if (emptyIfAdmin && (permissions.admin || permissions.adminByOwner)) return "";
return permissions?.additional?.[key] ?? ""; return permissions?.additional?.[key] ?? "";
} }
@ -166,7 +166,7 @@ export default class PermissionHelper {
}; };
} }
static convertToObject(permissions: Array<PermissionString>): PermissionObject { static convertToObject(permissions: Array<PermissionString>, isOwner: boolean = false): PermissionObject {
let isAdmin = permissions.includes("*"); let isAdmin = permissions.includes("*");
let additional: { [key: string]: string } = {}; let additional: { [key: string]: string } = {};
@ -181,6 +181,7 @@ export default class PermissionHelper {
if (isAdmin) { if (isAdmin) {
return { return {
admin: true, admin: true,
adminByOwner: isOwner,
...(Object.keys(additional).length > 0 && { additional }), ...(Object.keys(additional).length > 0 && { additional }),
}; };
} }
@ -230,6 +231,7 @@ export default class PermissionHelper {
} }
return { return {
adminByOwner: isOwner,
...output, ...output,
...(Object.keys(additional).length > 0 && { additional }), ...(Object.keys(additional).length > 0 && { additional }),
}; };

View file

@ -1,3 +1,4 @@
import { Brackets, IsNull, MoreThanOrEqual } from "typeorm";
import { dataSource } from "../../data-source"; import { dataSource } from "../../data-source";
import { mission } from "../../entity/operation/mission"; import { mission } from "../../entity/operation/mission";
import DatabaseActionException from "../../exceptions/databaseActionException"; import DatabaseActionException from "../../exceptions/databaseActionException";
@ -11,20 +12,32 @@ export default abstract class MissionService {
offset = 0, offset = 0,
count = 25, count = 25,
noLimit = false, noLimit = false,
laterThan = undefined,
}: { }: {
offset?: number; offset?: number;
count?: number; count?: number;
noLimit?: boolean; noLimit?: boolean;
laterThan?: Date;
}): Promise<[Array<mission>, number]> { }): Promise<[Array<mission>, number]> {
let query = dataSource.getRepository(mission).createQueryBuilder("mission"); let query = dataSource.getRepository(mission).createQueryBuilder("mission");
if (laterThan != undefined) {
query = query
.where(
new Brackets((qb) => {
qb.where({ mission_start: IsNull() }).andWhere({ createdAt: MoreThanOrEqual(laterThan) });
})
)
.orWhere({ mission_start: MoreThanOrEqual(laterThan) });
}
if (!noLimit) { if (!noLimit) {
query = query.offset(offset).limit(count); query = query.offset(offset).limit(count);
} }
return await query return await query
.orderBy("mission.mission_start") .orderBy("mission.mission_start", "DESC")
.addOrderBy("mission.createdAt") .addOrderBy("mission.createdAt", "DESC")
.getManyAndCount() .getManyAndCount()
.then((res) => { .then((res) => {
return res; return res;

View file

@ -18,6 +18,7 @@ export type PermissionObject = {
} & { all?: Array<PermissionType> | "*" }; } & { all?: Array<PermissionType> | "*" };
} & { } & {
admin?: boolean; admin?: boolean;
adminByOwner?: boolean;
} & { } & {
additional?: { [key: string]: string }; additional?: { [key: string]: string };
}; };