62 lines
2.0 KiB
TypeScript
62 lines
2.0 KiB
TypeScript
import { allow, compareValues, type CompareOperator } from './helpers.js';
|
|
import type { Constraint } from './types.js';
|
|
|
|
export const denyWithReason = (reason: string): Constraint => ({
|
|
name: 'denyWithReason',
|
|
requires: () => [],
|
|
test: () => ({ kind: 'deny', reason }),
|
|
});
|
|
|
|
export const notOpeningPart = (relYear: number, openingPartYear: number): Constraint => ({
|
|
name: 'notOpeningPart',
|
|
requires: () => [],
|
|
test: (_ctx) => {
|
|
if (relYear >= openingPartYear) {
|
|
return allow();
|
|
}
|
|
return { kind: 'deny', reason: '초반 제한 중에는 불가능합니다.' };
|
|
},
|
|
});
|
|
|
|
export const beOpeningPart = (): Constraint => ({
|
|
name: 'beOpeningPart',
|
|
requires: () => [
|
|
{ kind: 'env', key: 'relYear' },
|
|
{ kind: 'env', key: 'openingPartYear' },
|
|
],
|
|
test: (_ctx, view) => {
|
|
const relYear = view.get({ kind: 'env', key: 'relYear' }) as number | undefined;
|
|
const openingPartYear = view.get({ kind: 'env', key: 'openingPartYear' }) as number | undefined;
|
|
|
|
if (openingPartYear === undefined) {
|
|
return { kind: 'deny', reason: '초반 제한 중에는 불가능합니다.' };
|
|
}
|
|
|
|
if (relYear === undefined) {
|
|
return { kind: 'deny', reason: '초반 제한 중에는 불가능합니다.' };
|
|
}
|
|
|
|
if (relYear + 1 < openingPartYear) {
|
|
return allow();
|
|
}
|
|
|
|
return { kind: 'deny', reason: '초반 제한 중에는 불가능합니다.' };
|
|
},
|
|
});
|
|
|
|
export const reqEnvValue = (key: string, comp: CompareOperator, reqVal: unknown, failMessage: string): Constraint => ({
|
|
name: 'reqEnvValue',
|
|
requires: () => [{ kind: 'env', key }],
|
|
test: (_ctx, view) => {
|
|
const req = { kind: 'env', key } as const;
|
|
if (!view.has(req)) {
|
|
return { kind: 'deny', reason: failMessage };
|
|
}
|
|
const envValue = view.get(req);
|
|
if (compareValues(envValue, comp, reqVal)) {
|
|
return allow();
|
|
}
|
|
return { kind: 'deny', reason: failMessage };
|
|
},
|
|
});
|