diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..c4795ed --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,5 @@ +{ + "trailingComma": "es5", + "tabWidth": 2, + "printWidth": 120 +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6a07fe2 --- /dev/null +++ b/package-lock.json @@ -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" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ceae2ce --- /dev/null +++ b/package.json @@ -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" + } +} diff --git a/src/enums/newsletterConfigType.ts b/src/enums/newsletterConfigType.ts new file mode 100644 index 0000000..4703494 --- /dev/null +++ b/src/enums/newsletterConfigType.ts @@ -0,0 +1,4 @@ +export enum NewsletterConfigType { + pdf = "pdf", + mail = "mail", +} diff --git a/src/types/dynamicQueries.ts b/src/types/dynamicQueries.ts new file mode 100644 index 0000000..7ae4a79 --- /dev/null +++ b/src/types/dynamicQueries.ts @@ -0,0 +1,131 @@ +export interface DynamicQueryStructure { + select: string[] | "*"; + table: string; + where?: Array; + join?: Array; + orderBy?: Array; +} + +export type ConditionStructure = ( + | { + structureType: "condition"; + column: string; + operation: WhereOperation; + value: ConditionValue; + } + | { + structureType: "nested"; + invert?: boolean; + conditions: Array; + } +) & { + concat: WhereType; + structureType: "condition" | "nested"; +}; + +export type ConditionValue = FieldType | Array | { 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 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; +}; + +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", + }, + ], +}; diff --git a/src/types/fieldTypes.ts b/src/types/fieldTypes.ts new file mode 100644 index 0000000..b9105be --- /dev/null +++ b/src/types/fieldTypes.ts @@ -0,0 +1,18 @@ +export type CommunicationFieldType = + | "mobile" + | "email" + | "postalCode" + | "city" + | "street" + | "streetNumber" + | "streetNumberAddition"; + +export const communicationFieldTypes: Array = [ + "mobile", + "email", + "postalCode", + "city", + "street", + "streetNumber", + "streetNumberAddition", +]; diff --git a/src/types/permissionTypes.ts b/src/types/permissionTypes.ts new file mode 100644 index 0000000..cd37e49 --- /dev/null +++ b/src/types/permissionTypes.ts @@ -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 | "*"; + } & { all?: Array | "*" }; +} & { + admin?: boolean; +}; + +export type SectionsAndModulesObject = { + [section in PermissionSection]: Array; +}; + +export const permissionSections: Array = ["club", "settings", "user"]; +export const permissionModules: Array = [ + "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 = ["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"], +}; diff --git a/src/types/tableMeta.ts b/src/types/tableMeta.ts new file mode 100644 index 0000000..a50e115 --- /dev/null +++ b/src/types/tableMeta.ts @@ -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 }>; +} diff --git a/src/viewmodels/admin/club/calendar.models.ts b/src/viewmodels/admin/club/calendar.models.ts new file mode 100644 index 0000000..ee663c1 --- /dev/null +++ b/src/viewmodels/admin/club/calendar.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/club/member/communication.models.ts b/src/viewmodels/admin/club/member/communication.models.ts new file mode 100644 index 0000000..e4db956 --- /dev/null +++ b/src/viewmodels/admin/club/member/communication.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/club/member/member.models.ts b/src/viewmodels/admin/club/member/member.models.ts new file mode 100644 index 0000000..a6b49ff --- /dev/null +++ b/src/viewmodels/admin/club/member/member.models.ts @@ -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; + preferredCommunication?: Array; +} + +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; +} diff --git a/src/viewmodels/admin/club/member/memberAward.models.ts b/src/viewmodels/admin/club/member/memberAward.models.ts new file mode 100644 index 0000000..7b9e94b --- /dev/null +++ b/src/viewmodels/admin/club/member/memberAward.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/club/member/memberExecutivePosition.models.ts b/src/viewmodels/admin/club/member/memberExecutivePosition.models.ts new file mode 100644 index 0000000..d54d9f8 --- /dev/null +++ b/src/viewmodels/admin/club/member/memberExecutivePosition.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/club/member/memberQualification.models.ts b/src/viewmodels/admin/club/member/memberQualification.models.ts new file mode 100644 index 0000000..c723f26 --- /dev/null +++ b/src/viewmodels/admin/club/member/memberQualification.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/club/member/membership.models.ts b/src/viewmodels/admin/club/member/membership.models.ts new file mode 100644 index 0000000..6051ec9 --- /dev/null +++ b/src/viewmodels/admin/club/member/membership.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/club/newsletter/newsletter.models.ts b/src/viewmodels/admin/club/newsletter/newsletter.models.ts new file mode 100644 index 0000000..0f3e23b --- /dev/null +++ b/src/viewmodels/admin/club/newsletter/newsletter.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/club/newsletter/newsletterDates.models.ts b/src/viewmodels/admin/club/newsletter/newsletterDates.models.ts new file mode 100644 index 0000000..3db4d5b --- /dev/null +++ b/src/viewmodels/admin/club/newsletter/newsletterDates.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/club/newsletter/newsletterRecipients.models.ts b/src/viewmodels/admin/club/newsletter/newsletterRecipients.models.ts new file mode 100644 index 0000000..7e5ab15 --- /dev/null +++ b/src/viewmodels/admin/club/newsletter/newsletterRecipients.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/club/protocol/protocol.models.ts b/src/viewmodels/admin/club/protocol/protocol.models.ts new file mode 100644 index 0000000..0cd3279 --- /dev/null +++ b/src/viewmodels/admin/club/protocol/protocol.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/club/protocol/protocolAgenda.models.ts b/src/viewmodels/admin/club/protocol/protocolAgenda.models.ts new file mode 100644 index 0000000..6015315 --- /dev/null +++ b/src/viewmodels/admin/club/protocol/protocolAgenda.models.ts @@ -0,0 +1,12 @@ +export interface ProtocolAgendaViewModel { + id: number; + topic: string; + context: string; + protocolId: number; +} + +export interface SyncProtocolAgendaViewModel { + id?: number; + topic: string; + context: string; +} diff --git a/src/viewmodels/admin/club/protocol/protocolDecision.models.ts b/src/viewmodels/admin/club/protocol/protocolDecision.models.ts new file mode 100644 index 0000000..19e1d61 --- /dev/null +++ b/src/viewmodels/admin/club/protocol/protocolDecision.models.ts @@ -0,0 +1,12 @@ +export interface ProtocolDecisionViewModel { + id: number; + topic: string; + context: string; + protocolId: number; +} + +export interface SyncProtocolDecisionViewModel { + id?: number; + topic: string; + context: string; +} diff --git a/src/viewmodels/admin/club/protocol/protocolPresence.models.ts b/src/viewmodels/admin/club/protocol/protocolPresence.models.ts new file mode 100644 index 0000000..35bdd44 --- /dev/null +++ b/src/viewmodels/admin/club/protocol/protocolPresence.models.ts @@ -0,0 +1,10 @@ +export interface ProtocolPresenceViewModel { + memberId: number; + absent: boolean; + excused: boolean; + protocolId: number; +} + +export interface SyncProtocolPresenceViewModel { + memberIds: Array; +} diff --git a/src/viewmodels/admin/club/protocol/protocolPrintout.models.ts b/src/viewmodels/admin/club/protocol/protocolPrintout.models.ts new file mode 100644 index 0000000..ff60cdb --- /dev/null +++ b/src/viewmodels/admin/club/protocol/protocolPrintout.models.ts @@ -0,0 +1,7 @@ +export interface ProtocolPrintoutViewModel { + id: number; + title: string; + iteration: number; + createdAt: Date; + protocolId: number; +} diff --git a/src/viewmodels/admin/club/protocol/protocolVoting.models.ts b/src/viewmodels/admin/club/protocol/protocolVoting.models.ts new file mode 100644 index 0000000..cb61f68 --- /dev/null +++ b/src/viewmodels/admin/club/protocol/protocolVoting.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/settings/award.models.ts b/src/viewmodels/admin/settings/award.models.ts new file mode 100644 index 0000000..8fc9b9e --- /dev/null +++ b/src/viewmodels/admin/settings/award.models.ts @@ -0,0 +1,13 @@ +export interface AwardViewModel { + id: number; + award: string; +} + +export interface CreateAwardViewModel { + award: string; +} + +export interface UpdateAwardViewModel { + id: number; + award: string; +} diff --git a/src/viewmodels/admin/settings/calendarType.models.ts b/src/viewmodels/admin/settings/calendarType.models.ts new file mode 100644 index 0000000..0a56387 --- /dev/null +++ b/src/viewmodels/admin/settings/calendarType.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/settings/communicationType.models.ts b/src/viewmodels/admin/settings/communicationType.models.ts new file mode 100644 index 0000000..c8775de --- /dev/null +++ b/src/viewmodels/admin/settings/communicationType.models.ts @@ -0,0 +1,18 @@ +import type { CommunicationFieldType } from "../../../types/fieldTypes"; + +export interface CommunicationTypeViewModel { + id: number; + type: string; + fields: Array; +} + +export interface CreateCommunicationTypeViewModel { + type: string; + fields: Array; +} + +export interface UpdateCommunicationTypeViewModel { + id: number; + type: string; + fields: Array; +} diff --git a/src/viewmodels/admin/settings/executivePosition.models.ts b/src/viewmodels/admin/settings/executivePosition.models.ts new file mode 100644 index 0000000..a2daefc --- /dev/null +++ b/src/viewmodels/admin/settings/executivePosition.models.ts @@ -0,0 +1,13 @@ +export interface ExecutivePositionViewModel { + id: number; + position: string; +} + +export interface CreateExecutivePositionViewModel { + position: string; +} + +export interface UpdateExecutivePositionViewModel { + id: number; + position: string; +} diff --git a/src/viewmodels/admin/settings/membershipStatus.models.ts b/src/viewmodels/admin/settings/membershipStatus.models.ts new file mode 100644 index 0000000..812ddb9 --- /dev/null +++ b/src/viewmodels/admin/settings/membershipStatus.models.ts @@ -0,0 +1,13 @@ +export interface MembershipStatusViewModel { + id: number; + status: string; +} + +export interface CreateMembershipStatusViewModel { + status: string; +} + +export interface UpdateMembershipStatusViewModel { + id: number; + status: string; +} diff --git a/src/viewmodels/admin/settings/newsletterConfig.models.ts b/src/viewmodels/admin/settings/newsletterConfig.models.ts new file mode 100644 index 0000000..678c734 --- /dev/null +++ b/src/viewmodels/admin/settings/newsletterConfig.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/settings/qualification.models.ts b/src/viewmodels/admin/settings/qualification.models.ts new file mode 100644 index 0000000..2f11296 --- /dev/null +++ b/src/viewmodels/admin/settings/qualification.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/settings/query.models.ts b/src/viewmodels/admin/settings/query.models.ts new file mode 100644 index 0000000..8f75db3 --- /dev/null +++ b/src/viewmodels/admin/settings/query.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/settings/salutation.models.ts b/src/viewmodels/admin/settings/salutation.models.ts new file mode 100644 index 0000000..73915ab --- /dev/null +++ b/src/viewmodels/admin/settings/salutation.models.ts @@ -0,0 +1,13 @@ +export interface SalutationViewModel { + id: number; + salutation: string; +} + +export interface CreateSalutationViewModel { + salutation: string; +} + +export interface UpdateSalutationViewModel { + id: number; + salutation: string; +} diff --git a/src/viewmodels/admin/settings/template.models.ts b/src/viewmodels/admin/settings/template.models.ts new file mode 100644 index 0000000..c470fd1 --- /dev/null +++ b/src/viewmodels/admin/settings/template.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/settings/templateUsage.models.ts b/src/viewmodels/admin/settings/templateUsage.models.ts new file mode 100644 index 0000000..440f8e4 --- /dev/null +++ b/src/viewmodels/admin/settings/templateUsage.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/user/invite.models.ts b/src/viewmodels/admin/user/invite.models.ts new file mode 100644 index 0000000..f1a6264 --- /dev/null +++ b/src/viewmodels/admin/user/invite.models.ts @@ -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; +} diff --git a/src/viewmodels/admin/user/role.models.ts b/src/viewmodels/admin/user/role.models.ts new file mode 100644 index 0000000..bc907f5 --- /dev/null +++ b/src/viewmodels/admin/user/role.models.ts @@ -0,0 +1,7 @@ +import { PermissionObject } from "../../../types/permissionTypes"; + +export interface RoleViewModel { + id: number; + permissions: PermissionObject; + role: string; +} diff --git a/src/viewmodels/admin/user/user.models.ts b/src/viewmodels/admin/user/user.models.ts new file mode 100644 index 0000000..38d95e5 --- /dev/null +++ b/src/viewmodels/admin/user/user.models.ts @@ -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; + 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; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..92a571e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs", + "declaration": true, + "outDir": "./dist", + "strict": true + }, + "include": ["src/**/*"], + "exclude": ["tests", "dist", "node_modules"] +}