base types and viewmodels
This commit is contained in:
parent
18ae1ddc04
commit
551b6353bf
39 changed files with 1046 additions and 0 deletions
5
.prettierrc.json
Normal file
5
.prettierrc.json
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"trailingComma": "es5",
|
||||
"tabWidth": 2,
|
||||
"printWidth": 120
|
||||
}
|
150
package-lock.json
generated
Normal file
150
package-lock.json
generated
Normal 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
33
package.json
Normal 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"
|
||||
}
|
||||
}
|
4
src/enums/newsletterConfigType.ts
Normal file
4
src/enums/newsletterConfigType.ts
Normal file
|
@ -0,0 +1,4 @@
|
|||
export enum NewsletterConfigType {
|
||||
pdf = "pdf",
|
||||
mail = "mail",
|
||||
}
|
131
src/types/dynamicQueries.ts
Normal file
131
src/types/dynamicQueries.ts
Normal 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
18
src/types/fieldTypes.ts
Normal 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",
|
||||
];
|
84
src/types/permissionTypes.ts
Normal file
84
src/types/permissionTypes.ts
Normal 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
7
src/types/tableMeta.ts
Normal 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 }>;
|
||||
}
|
35
src/viewmodels/admin/club/calendar.models.ts
Normal file
35
src/viewmodels/admin/club/calendar.models.ts
Normal 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;
|
||||
}
|
44
src/viewmodels/admin/club/member/communication.models.ts
Normal file
44
src/viewmodels/admin/club/member/communication.models.ts
Normal 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;
|
||||
}
|
49
src/viewmodels/admin/club/member/member.models.ts
Normal file
49
src/viewmodels/admin/club/member/member.models.ts
Normal 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;
|
||||
}
|
23
src/viewmodels/admin/club/member/memberAward.models.ts
Normal file
23
src/viewmodels/admin/club/member/memberAward.models.ts
Normal 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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
34
src/viewmodels/admin/club/member/membership.models.ts
Normal file
34
src/viewmodels/admin/club/member/membership.models.ts
Normal 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;
|
||||
}
|
31
src/viewmodels/admin/club/newsletter/newsletter.models.ts
Normal file
31
src/viewmodels/admin/club/newsletter/newsletter.models.ts
Normal 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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
22
src/viewmodels/admin/club/protocol/protocol.models.ts
Normal file
22
src/viewmodels/admin/club/protocol/protocol.models.ts
Normal 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;
|
||||
}
|
12
src/viewmodels/admin/club/protocol/protocolAgenda.models.ts
Normal file
12
src/viewmodels/admin/club/protocol/protocolAgenda.models.ts
Normal 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;
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
export interface ProtocolDecisionViewModel {
|
||||
id: number;
|
||||
topic: string;
|
||||
context: string;
|
||||
protocolId: number;
|
||||
}
|
||||
|
||||
export interface SyncProtocolDecisionViewModel {
|
||||
id?: number;
|
||||
topic: string;
|
||||
context: string;
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
export interface ProtocolPresenceViewModel {
|
||||
memberId: number;
|
||||
absent: boolean;
|
||||
excused: boolean;
|
||||
protocolId: number;
|
||||
}
|
||||
|
||||
export interface SyncProtocolPresenceViewModel {
|
||||
memberIds: Array<number>;
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
export interface ProtocolPrintoutViewModel {
|
||||
id: number;
|
||||
title: string;
|
||||
iteration: number;
|
||||
createdAt: Date;
|
||||
protocolId: number;
|
||||
}
|
19
src/viewmodels/admin/club/protocol/protocolVoting.models.ts
Normal file
19
src/viewmodels/admin/club/protocol/protocolVoting.models.ts
Normal 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;
|
||||
}
|
13
src/viewmodels/admin/settings/award.models.ts
Normal file
13
src/viewmodels/admin/settings/award.models.ts
Normal file
|
@ -0,0 +1,13 @@
|
|||
export interface AwardViewModel {
|
||||
id: number;
|
||||
award: string;
|
||||
}
|
||||
|
||||
export interface CreateAwardViewModel {
|
||||
award: string;
|
||||
}
|
||||
|
||||
export interface UpdateAwardViewModel {
|
||||
id: number;
|
||||
award: string;
|
||||
}
|
22
src/viewmodels/admin/settings/calendarType.models.ts
Normal file
22
src/viewmodels/admin/settings/calendarType.models.ts
Normal 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;
|
||||
}
|
18
src/viewmodels/admin/settings/communicationType.models.ts
Normal file
18
src/viewmodels/admin/settings/communicationType.models.ts
Normal 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>;
|
||||
}
|
13
src/viewmodels/admin/settings/executivePosition.models.ts
Normal file
13
src/viewmodels/admin/settings/executivePosition.models.ts
Normal file
|
@ -0,0 +1,13 @@
|
|||
export interface ExecutivePositionViewModel {
|
||||
id: number;
|
||||
position: string;
|
||||
}
|
||||
|
||||
export interface CreateExecutivePositionViewModel {
|
||||
position: string;
|
||||
}
|
||||
|
||||
export interface UpdateExecutivePositionViewModel {
|
||||
id: number;
|
||||
position: string;
|
||||
}
|
13
src/viewmodels/admin/settings/membershipStatus.models.ts
Normal file
13
src/viewmodels/admin/settings/membershipStatus.models.ts
Normal file
|
@ -0,0 +1,13 @@
|
|||
export interface MembershipStatusViewModel {
|
||||
id: number;
|
||||
status: string;
|
||||
}
|
||||
|
||||
export interface CreateMembershipStatusViewModel {
|
||||
status: string;
|
||||
}
|
||||
|
||||
export interface UpdateMembershipStatusViewModel {
|
||||
id: number;
|
||||
status: string;
|
||||
}
|
13
src/viewmodels/admin/settings/newsletterConfig.models.ts
Normal file
13
src/viewmodels/admin/settings/newsletterConfig.models.ts
Normal 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;
|
||||
}
|
16
src/viewmodels/admin/settings/qualification.models.ts
Normal file
16
src/viewmodels/admin/settings/qualification.models.ts
Normal 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;
|
||||
}
|
23
src/viewmodels/admin/settings/query.models.ts
Normal file
23
src/viewmodels/admin/settings/query.models.ts
Normal 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;
|
||||
}
|
13
src/viewmodels/admin/settings/salutation.models.ts
Normal file
13
src/viewmodels/admin/settings/salutation.models.ts
Normal file
|
@ -0,0 +1,13 @@
|
|||
export interface SalutationViewModel {
|
||||
id: number;
|
||||
salutation: string;
|
||||
}
|
||||
|
||||
export interface CreateSalutationViewModel {
|
||||
salutation: string;
|
||||
}
|
||||
|
||||
export interface UpdateSalutationViewModel {
|
||||
id: number;
|
||||
salutation: string;
|
||||
}
|
20
src/viewmodels/admin/settings/template.models.ts
Normal file
20
src/viewmodels/admin/settings/template.models.ts
Normal 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;
|
||||
}
|
19
src/viewmodels/admin/settings/templateUsage.models.ts
Normal file
19
src/viewmodels/admin/settings/templateUsage.models.ts
Normal 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;
|
||||
}
|
13
src/viewmodels/admin/user/invite.models.ts
Normal file
13
src/viewmodels/admin/user/invite.models.ts
Normal 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;
|
||||
}
|
7
src/viewmodels/admin/user/role.models.ts
Normal file
7
src/viewmodels/admin/user/role.models.ts
Normal file
|
@ -0,0 +1,7 @@
|
|||
import { PermissionObject } from "../../../types/permissionTypes";
|
||||
|
||||
export interface RoleViewModel {
|
||||
id: number;
|
||||
permissions: PermissionObject;
|
||||
role: string;
|
||||
}
|
29
src/viewmodels/admin/user/user.models.ts
Normal file
29
src/viewmodels/admin/user/user.models.ts
Normal 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
11
tsconfig.json
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES6",
|
||||
"module": "commonjs",
|
||||
"declaration": true,
|
||||
"outDir": "./dist",
|
||||
"strict": true
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["tests", "dist", "node_modules"]
|
||||
}
|
Loading…
Add table
Reference in a new issue