base types and viewmodels

This commit is contained in:
Julian Krauser 2025-01-28 15:39:14 +01:00
parent 18ae1ddc04
commit 551b6353bf
39 changed files with 1046 additions and 0 deletions

5
.prettierrc.json Normal file
View file

@ -0,0 +1,5 @@
{
"trailingComma": "es5",
"tabWidth": 2,
"printWidth": 120
}

150
package-lock.json generated Normal file
View file

@ -0,0 +1,150 @@
{
"name": "@ff-admin/webapi-client",
"version": "0.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ff-admin/webapi-client",
"version": "0.0.0",
"license": "GPL-3.0-only",
"dependencies": {
"axios": "^1.6.2"
},
"devDependencies": {
"@types/node": "^20.17.16",
"typescript": "^5.7.3"
}
},
"node_modules/@types/node": {
"version": "20.17.16",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.16.tgz",
"integrity": "sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.19.2"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT"
},
"node_modules/axios": {
"version": "1.7.9",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
"integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/follow-redirects": {
"version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/form-data": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
"integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/typescript": {
"version": "5.7.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
"integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/undici-types": {
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"dev": true,
"license": "MIT"
}
}
}

33
package.json Normal file
View file

@ -0,0 +1,33 @@
{
"name": "@ff-admin/webapi-client",
"version": "0.0.0",
"description": "api client for ff admin webapi",
"main": "dist/index.js",
"scripts": {
"start_ts": "ts-node src/index.ts",
"build": "tsc",
"start": "node .",
"dev": "npm run build && set NODE_ENV=development && npm run start"
},
"repository": {
"type": "git",
"url": "https://forgejo.jk-effects.cloud/Ehrenamt/ff-admin-webapi-client.git"
},
"homepage": "https://forgejo.jk-effects.cloud/Ehrenamt/ff-admin-webapi-client.git#readme",
"dependencies": {
"axios": "^1.6.2"
},
"devDependencies": {
"@types/node": "^20.17.16",
"typescript": "^5.7.3"
},
"keywords": [
"Feuerwehr",
"ff-admin"
],
"author": "JK Effects",
"license": "GPL-3.0-only",
"publishConfig": {
"@ff-admin:registry": "https://npm.registry.jk-effects.cloud"
}
}

View file

@ -0,0 +1,4 @@
export enum NewsletterConfigType {
pdf = "pdf",
mail = "mail",
}

131
src/types/dynamicQueries.ts Normal file
View file

@ -0,0 +1,131 @@
export interface DynamicQueryStructure {
select: string[] | "*";
table: string;
where?: Array<ConditionStructure>;
join?: Array<DynamicQueryStructure & { foreignColumn: string }>;
orderBy?: Array<OrderByStructure>;
}
export type ConditionStructure = (
| {
structureType: "condition";
column: string;
operation: WhereOperation;
value: ConditionValue;
}
| {
structureType: "nested";
invert?: boolean;
conditions: Array<ConditionStructure>;
}
) & {
concat: WhereType;
structureType: "condition" | "nested";
};
export type ConditionValue = FieldType | Array<FieldType> | { start: FieldType; end: FieldType };
export type FieldType = number | string | Date | boolean;
export type WhereType = "OR" | "AND" | "_"; // _ represents initial where in (sub-)query
export type WhereOperation =
| "eq" // Equal
| "neq" // Not equal
| "lt" // Less than
| "lte" // Less than or equal to
| "gt" // Greater than
| "gte" // Greater than or equal to
| "in" // Included in an array
| "notIn" // Not included in an array
| "contains" // Contains
| "notContains" // Does not contain
| "null" // Is null
| "notNull" // Is not null
| "between" // Is between
| "startsWith" // Starts with
| "endsWith" // Ends with
| "timespanEq"; // Date before x years (YYYY-01-01 <bis> YYYY-12-31)
// TODO: age between | age equals | age greater | age smaller
export type OrderByStructure = {
column: string;
order: OrderByType;
};
export type OrderByType = "ASC" | "DESC";
export type QueryResult = {
[key: string]: FieldType | QueryResult | Array<QueryResult>;
};
export const exampleQuery: DynamicQueryStructure = {
select: ["firstname", "lastname"],
table: "member",
where: [
{
structureType: "condition",
concat: "_",
column: "mail",
operation: "endsWith",
value: "@gmail.com",
},
{
structureType: "nested",
concat: "AND",
conditions: [
{
structureType: "condition",
concat: "_",
column: "firstname",
operation: "startsWith",
value: "J",
},
{
structureType: "condition",
concat: "OR",
column: "lastname",
operation: "startsWith",
value: "K",
},
],
},
],
join: [
{
select: "*",
table: "communication",
foreignColumn: "sendNewsletter",
},
{
select: "*",
table: "membership",
foreignColumn: "memberships",
join: [
{
select: "*",
table: "membership_status",
foreignColumn: "status",
where: [
{
structureType: "condition",
concat: "_",
column: "status",
operation: "eq",
value: "aktiv",
},
],
},
],
},
],
orderBy: [
{
column: "firstname",
order: "ASC",
},
{
column: "lastname",
order: "ASC",
},
],
};

18
src/types/fieldTypes.ts Normal file
View file

@ -0,0 +1,18 @@
export type CommunicationFieldType =
| "mobile"
| "email"
| "postalCode"
| "city"
| "street"
| "streetNumber"
| "streetNumberAddition";
export const communicationFieldTypes: Array<CommunicationFieldType> = [
"mobile",
"email",
"postalCode",
"city",
"street",
"streetNumber",
"streetNumberAddition",
];

View file

@ -0,0 +1,84 @@
export type PermissionSection = "club" | "settings" | "user";
export type PermissionModule =
| "member"
| "calendar"
| "newsletter"
| "newsletter_config"
| "protocol"
| "qualification"
| "award"
| "executive_position"
| "communication_type"
| "membership_status"
| "salutation"
| "calendar_type"
| "user"
| "role"
| "webapi"
| "query"
| "query_store"
| "template"
| "template_usage";
export type PermissionType = "read" | "create" | "update" | "delete";
export type PermissionString =
| `${PermissionSection}.${PermissionModule}.${PermissionType}` // für spezifische Berechtigungen
| `${PermissionSection}.${PermissionModule}.*` // für alle Berechtigungen in einem Modul
| `${PermissionSection}.${PermissionType}` // für spezifische Berechtigungen in einem Abschnitt
| `${PermissionSection}.*` // für alle Berechtigungen in einem Abschnitt
| "*"; // für Admin
export type PermissionObject = {
[section in PermissionSection]?: {
[module in PermissionModule]?: Array<PermissionType> | "*";
} & { all?: Array<PermissionType> | "*" };
} & {
admin?: boolean;
};
export type SectionsAndModulesObject = {
[section in PermissionSection]: Array<PermissionModule>;
};
export const permissionSections: Array<PermissionSection> = ["club", "settings", "user"];
export const permissionModules: Array<PermissionModule> = [
"member",
"calendar",
"newsletter",
"newsletter_config",
"protocol",
"qualification",
"award",
"executive_position",
"communication_type",
"membership_status",
"salutation",
"calendar_type",
"user",
"role",
"webapi",
"query",
"query_store",
"template",
"template_usage",
];
export const permissionTypes: Array<PermissionType> = ["read", "create", "update", "delete"];
export const sectionsAndModules: SectionsAndModulesObject = {
club: ["member", "calendar", "newsletter", "protocol", "query"],
settings: [
"qualification",
"award",
"executive_position",
"communication_type",
"membership_status",
"salutation",
"calendar_type",
"query_store",
"template",
"template_usage",
"newsletter_config",
],
user: ["user", "role", "webapi"],
};

7
src/types/tableMeta.ts Normal file
View file

@ -0,0 +1,7 @@
import { ColumnType } from "typeorm";
export interface TableMeta {
tableName: string;
columns: Array<{ column: string; type: ColumnType }>;
relations: Array<{ column: string; relationType: string; referencedTableName: string }>;
}

View file

@ -0,0 +1,35 @@
import type { CalendarTypeViewModel } from "../settings/calendarType.models";
export interface CalendarViewModel {
id: string;
starttime: string;
endtime: string;
title: string;
content: string;
location: string;
allDay: boolean;
createdAt: Date;
updatedAt: Date;
type: CalendarTypeViewModel;
}
export interface CreateCalendarViewModel {
starttime: string;
endtime: string;
title: string;
content: string;
location: string;
allDay: boolean;
typeId: string;
}
export interface UpdateCalendarViewModel {
id: string;
starttime: string;
endtime: string;
title: string;
content: string;
location: string;
allDay: boolean;
typeId: string;
}

View file

@ -0,0 +1,44 @@
import type { CommunicationTypeViewModel } from "../../settings/communicationType.models";
export interface CommunicationViewModel {
id: number;
preferred: boolean;
mobile: string;
email: string;
postalCode: string;
city: string;
street: string;
streetNumber: number;
streetNumberAddition: string;
type: CommunicationTypeViewModel;
isNewsletterMain: boolean;
isSMSAlarming: boolean;
}
export interface CreateCommunicationViewModel {
preferred: boolean;
mobile: string;
email: string;
postalCode: string;
city: string;
street: string;
streetNumber: number;
streetNumberAddition: string;
typeId: number;
isNewsletterMain: boolean;
isSMSAlarming: boolean;
}
export interface UpdateCommunicationViewModel {
id: number;
preferred: boolean;
mobile: string;
email: string;
postalCode: string;
city: string;
street: string;
streetNumber: number;
streetNumberAddition: string;
isNewsletterMain: boolean;
isSMSAlarming: boolean;
}

View file

@ -0,0 +1,49 @@
import type { CommunicationViewModel } from "./communication.models";
import type { MembershipViewModel } from "./membership.models";
import type { SalutationViewModel } from "../../settings/salutation.models";
export interface MemberViewModel {
id: number;
salutation: SalutationViewModel;
firstname: string;
lastname: string;
nameaffix: string;
birthdate: Date;
internalId?: string;
firstMembershipEntry?: MembershipViewModel;
lastMembershipEntry?: MembershipViewModel;
sendNewsletter?: CommunicationViewModel;
smsAlarming?: Array<CommunicationViewModel>;
preferredCommunication?: Array<CommunicationViewModel>;
}
export interface MemberStatisticsViewModel {
id: number;
salutation: string;
firstname: string;
lastname: string;
nameaffix: string;
birthdate: Date;
todayAge: number;
ageThisYear: number;
exactAge: string;
}
export interface CreateMemberViewModel {
salutationId: number;
firstname: string;
lastname: string;
nameaffix: string;
birthdate: Date;
internalId?: string;
}
export interface UpdateMemberViewModel {
id: number;
salutationId: number;
firstname: string;
lastname: string;
nameaffix: string;
birthdate: Date;
internalId?: string;
}

View file

@ -0,0 +1,23 @@
export interface MemberAwardViewModel {
id: number;
given: boolean;
note?: string;
date: Date;
award: string;
awardId: number;
}
export interface CreateMemberAwardViewModel {
given: boolean;
note?: string;
date: Date;
awardId: number;
}
export interface UpdateMemberAwardViewModel {
id: number;
given: boolean;
note?: string;
date: Date;
awardId: number;
}

View file

@ -0,0 +1,23 @@
export interface MemberExecutivePositionViewModel {
id: number;
note?: string;
start: Date;
end?: Date;
executivePosition: string;
executivePositionId: number;
}
export interface CreateMemberExecutivePositionViewModel {
note?: string;
start: Date;
end?: Date;
executivePositionId: number;
}
export interface UpdateMemberExecutivePositionViewModel {
id: number;
note?: string;
start: Date;
end?: Date;
executivePositionId: number;
}

View file

@ -0,0 +1,24 @@
export interface MemberQualificationViewModel {
id: number;
note?: string;
start: Date;
end?: Date;
terminationReason?: string;
qualification: string;
qualificationId: number;
}
export interface CreateMemberQualificationViewModel {
note?: string;
start: Date;
qualificationId: number;
}
export interface UpdateMemberQualificationViewModel {
id: number;
note?: string;
start: Date;
end?: Date;
terminationReason?: string;
qualificationId: number;
}

View file

@ -0,0 +1,34 @@
export interface MembershipViewModel {
id: number;
start: Date;
end?: Date;
terminationReason?: string;
status: string;
statusId: number;
}
export interface MembershipStatisticsViewModel {
durationInDays: number;
durationInYears: string;
status: string;
statusId: number;
memberId: number;
memberSalutation: string;
memberFirstname: string;
memberLastname: string;
memberNameaffix: string;
memberBirthdate: Date;
}
export interface CreateMembershipViewModel {
start: Date;
statusId: number;
}
export interface UpdateMembershipViewModel {
id: number;
start: Date;
end?: Date;
terminationReason?: string;
statusId: number;
}

View file

@ -0,0 +1,31 @@
import type { QueryViewModel } from "../../settings/query.models";
export interface NewsletterViewModel {
id: number;
title: string;
description: string;
newsletterTitle: string;
newsletterText: string;
newsletterSignatur: string;
isSent: boolean;
recipientsByQueryId?: number | null;
recipientsByQuery?: QueryViewModel | null;
}
export interface CreateNewsletterViewModel {
title: string;
}
export interface SyncNewsletterViewModel {
id: number;
title: string;
description: string;
newsletterTitle: string;
newsletterText: string;
newsletterSignatur: string;
recipientsByQueryId?: number;
}
export interface SendNewsletterViewModel {
id: number;
}

View file

@ -0,0 +1,15 @@
import type { CalendarViewModel } from "../calendar.models";
export interface NewsletterDatesViewModel {
newsletterId: number;
calendarId: string;
diffTitle: string | null;
diffDescription: string | null;
calendar: CalendarViewModel;
}
export interface SyncNewsletterDatesViewModel {
calendarId: string;
diffTitle?: string;
diffDescription?: string;
}

View file

@ -0,0 +1,11 @@
import type { MemberViewModel } from "../member/member.models";
export interface NewsletterRecipientsViewModel {
newsletterId: number;
memberId: number;
member: MemberViewModel;
}
export interface SyncNewsletterRecipientsViewModel {
memberId: number;
}

View file

@ -0,0 +1,22 @@
export interface ProtocolViewModel {
id: number;
title: string;
date: Date;
starttime: Date;
endtime: Date;
summary: string;
}
export interface CreateProtocolViewModel {
title: string;
date: Date;
}
export interface SyncProtocolViewModel {
id: number;
title: string;
date: Date;
starttime: Date;
endtime: Date;
summary: string;
}

View file

@ -0,0 +1,12 @@
export interface ProtocolAgendaViewModel {
id: number;
topic: string;
context: string;
protocolId: number;
}
export interface SyncProtocolAgendaViewModel {
id?: number;
topic: string;
context: string;
}

View file

@ -0,0 +1,12 @@
export interface ProtocolDecisionViewModel {
id: number;
topic: string;
context: string;
protocolId: number;
}
export interface SyncProtocolDecisionViewModel {
id?: number;
topic: string;
context: string;
}

View file

@ -0,0 +1,10 @@
export interface ProtocolPresenceViewModel {
memberId: number;
absent: boolean;
excused: boolean;
protocolId: number;
}
export interface SyncProtocolPresenceViewModel {
memberIds: Array<number>;
}

View file

@ -0,0 +1,7 @@
export interface ProtocolPrintoutViewModel {
id: number;
title: string;
iteration: number;
createdAt: Date;
protocolId: number;
}

View file

@ -0,0 +1,19 @@
export interface ProtocolVotingViewModel {
id: number;
topic: string;
context: string;
favour: number;
abstain: number;
against: number;
protocolId: number;
}
export interface SyncProtocolVotingViewModel {
id?: number;
topic: string;
context: string;
favour: number;
abstain: number;
against: number;
protocolId: number;
}

View file

@ -0,0 +1,13 @@
export interface AwardViewModel {
id: number;
award: string;
}
export interface CreateAwardViewModel {
award: string;
}
export interface UpdateAwardViewModel {
id: number;
award: string;
}

View file

@ -0,0 +1,22 @@
export interface CalendarTypeViewModel {
id: string;
type: string;
nscdr: boolean;
color: string;
passphrase: string | null;
}
export interface CreateCalendarTypeViewModel {
type: string;
nscdr: boolean;
color: string;
passphrase?: string;
}
export interface UpdateCalendarTypeViewModel {
id: string;
type: string;
nscdr: boolean;
color: string;
passphrase?: string;
}

View file

@ -0,0 +1,18 @@
import type { CommunicationFieldType } from "../../../types/fieldTypes";
export interface CommunicationTypeViewModel {
id: number;
type: string;
fields: Array<CommunicationFieldType>;
}
export interface CreateCommunicationTypeViewModel {
type: string;
fields: Array<CommunicationFieldType>;
}
export interface UpdateCommunicationTypeViewModel {
id: number;
type: string;
fields: Array<CommunicationFieldType>;
}

View file

@ -0,0 +1,13 @@
export interface ExecutivePositionViewModel {
id: number;
position: string;
}
export interface CreateExecutivePositionViewModel {
position: string;
}
export interface UpdateExecutivePositionViewModel {
id: number;
position: string;
}

View file

@ -0,0 +1,13 @@
export interface MembershipStatusViewModel {
id: number;
status: string;
}
export interface CreateMembershipStatusViewModel {
status: string;
}
export interface UpdateMembershipStatusViewModel {
id: number;
status: string;
}

View file

@ -0,0 +1,13 @@
import type { NewsletterConfigType } from "../../../enums/newsletterConfigType";
import type { CommunicationTypeViewModel } from "./communicationType.models";
export interface NewsletterConfigViewModel {
comTypeId: number;
config: NewsletterConfigType;
comType: CommunicationTypeViewModel;
}
export interface SetNewsletterConfigViewModel {
comTypeId: number;
config: NewsletterConfigType;
}

View file

@ -0,0 +1,16 @@
export interface QualificationViewModel {
id: number;
qualification: string;
description: string | null;
}
export interface CreateQualificationViewModel {
qualification: string;
description: string | null;
}
export interface UpdateQualificationViewModel {
id: number;
qualification: string;
description: string | null;
}

View file

@ -0,0 +1,23 @@
import type { DynamicQueryStructure } from "../../../types/dynamicQueries";
export interface TableMeta {
tableName: string;
columns: Array<{ column: string; type: string }>;
relations: Array<{ column: string; relationType: string; referencedTableName: string }>;
}
export interface QueryViewModel {
id: number;
title: string;
query: string | DynamicQueryStructure;
}
export interface CreateQueryViewModel {
title: string;
query: string | DynamicQueryStructure;
}
export interface UpdateQueryViewModel {
id: number;
query: string | DynamicQueryStructure;
}

View file

@ -0,0 +1,13 @@
export interface SalutationViewModel {
id: number;
salutation: string;
}
export interface CreateSalutationViewModel {
salutation: string;
}
export interface UpdateSalutationViewModel {
id: number;
salutation: string;
}

View file

@ -0,0 +1,20 @@
export interface TemplateViewModel {
id: number;
template: string;
description: string | null;
design: object;
html: string;
}
export interface CreateTemplateViewModel {
template: string;
description: string | null;
}
export interface UpdateTemplateViewModel {
id: number;
template: string;
description: string | null;
design: object;
html: string;
}

View file

@ -0,0 +1,19 @@
import type { PermissionModule } from "../../../types/permissionTypes";
export interface TemplateUsageViewModel {
scope: PermissionModule;
header: { id: number; template: string } | null;
body: { id: number; template: string } | null;
footer: { id: number; template: string } | null;
headerHeight: number | null;
footerHeight: number | null;
}
export interface UpdateTemplateUsageViewModel {
scope: PermissionModule;
headerId: number | null;
bodyId: number | null;
footerId: number | null;
headerHeight: number | null;
footerHeight: number | null;
}

View file

@ -0,0 +1,13 @@
export interface InviteViewModel {
username: string;
mail: string;
firstname: string;
lastname: string;
}
export interface CreateInviteViewModel {
username: string;
mail: string;
firstname: string;
lastname: string;
}

View file

@ -0,0 +1,7 @@
import { PermissionObject } from "../../../types/permissionTypes";
export interface RoleViewModel {
id: number;
permissions: PermissionObject;
role: string;
}

View file

@ -0,0 +1,29 @@
import { PermissionObject } from "../../../types/permissionTypes";
import { RoleViewModel } from "./role.models";
export interface UserViewModel {
id: string;
username: string;
mail: string;
firstname: string;
lastname: string;
isOwner: boolean;
permissions: PermissionObject;
roles: Array<RoleViewModel>;
permissions_total: PermissionObject;
}
export interface CreateUserViewModel {
username: string;
mail: string;
firstname: string;
lastname: string;
}
export interface UpdateUserViewModel {
id: string;
username: string;
mail: string;
firstname: string;
lastname: string;
}

11
tsconfig.json Normal file
View file

@ -0,0 +1,11 @@
{
"compilerOptions": {
"target": "ES6",
"module": "commonjs",
"declaration": true,
"outDir": "./dist",
"strict": true
},
"include": ["src/**/*"],
"exclude": ["tests", "dist", "node_modules"]
}