diff --git a/src/clients/webpage.client.ts b/src/clients/webpage.client.ts new file mode 100644 index 0000000..78bb3ba --- /dev/null +++ b/src/clients/webpage.client.ts @@ -0,0 +1,15 @@ +import { BaseClient } from "./clientBase"; + +export class WebPageClient extends BaseClient { + constructor({ serverAdress, webapiToken }: { serverAdress: string; webapiToken: string }) { + super({ serverAdress, webapiToken }); + + this.setAccessToken(webapiToken); + } + + public refreshToken(): Promise { + return new Promise(async (resolve, reject) => { + reject("some error occured by Code 401"); + }); + } +} diff --git a/src/index.ts b/src/index.ts index 312ca0d..68dd9e6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,11 @@ export { WebApiClient } from "./clients/webapi.client"; +export { WebPageClient } from "./clients/webpage.client"; export * as AdminRequests from "./requests/admin"; export * as AdminModels from "./viewmodels/admin"; export * as AdminTypes from "./types/admin"; export * as AdminEnums from "./enums/admin"; + +export * as WebpageRequests from "./requests/webpage"; +export * as WebpageModels from "./viewmodels/webpage"; +export * as WebpageTypes from "./types/webpage"; diff --git a/src/requests/webpage.ts b/src/requests/webpage.ts new file mode 100644 index 0000000..6571ac2 --- /dev/null +++ b/src/requests/webpage.ts @@ -0,0 +1,4 @@ +export { default as ArticleRequests } from "./webpage/articleRequests"; +export { default as EventRequests } from "./webpage/eventRequests"; +export { default as OperationRequests } from "./webpage/operationRequests"; +export { default as VehicleRequests } from "./webpage/vehicleRequests"; diff --git a/src/requests/webpage/articleRequests.ts b/src/requests/webpage/articleRequests.ts new file mode 100644 index 0000000..a1c5828 --- /dev/null +++ b/src/requests/webpage/articleRequests.ts @@ -0,0 +1,31 @@ +import { AxiosResponse } from "axios"; +import { RequestDefinition, RequestData, ImplementsRequestInterface } from "../requestBase"; +import { BaseClient } from "../../clients/clientBase"; +import { Article } from "../../viewmodels/webpage/collection"; + +interface IArticleRequests { + getArticles: RequestDefinition; + getArticleById: RequestDefinition<{ id: string }, void, Article>; + createArticle: RequestDefinition, string>; + updateArticle: RequestDefinition<{ id: string }, Partial
, void>; + deleteArticle: RequestDefinition<{ id: string }, void, void>; +} + +@ImplementsRequestInterface() +export default abstract class ArticleRequests { + static async getArticles({ http }: BaseClient): Promise> { + return await http.get("/articles"); + } + static async getArticleById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.get(`/articles/${p.params.id}`); + } + static async createArticle({ http }: BaseClient, p: RequestData>): Promise> { + return await http.post("/articles", p.body); + } + static async updateArticle({ http }: BaseClient, p: RequestData<{ id: string }, Partial
>): Promise> { + return await http.post(`/articles/${p.params.id}`, p.body); + } + static async deleteArticle({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.post(`/articles/${p.params.id}`); + } +} diff --git a/src/requests/webpage/eventRequests.ts b/src/requests/webpage/eventRequests.ts new file mode 100644 index 0000000..779fe0e --- /dev/null +++ b/src/requests/webpage/eventRequests.ts @@ -0,0 +1,31 @@ +import { AxiosResponse } from "axios"; +import { RequestDefinition, RequestData, ImplementsRequestInterface } from "../requestBase"; +import { BaseClient } from "../../clients/clientBase"; +import { Event } from "../../viewmodels/webpage/collection"; + +interface IEventRequests { + getEvents: RequestDefinition; + getEventById: RequestDefinition<{ id: string }, void, Event>; + createEvent: RequestDefinition, string>; + updateEvent: RequestDefinition<{ id: string }, Partial, void>; + deleteEvent: RequestDefinition<{ id: string }, void, void>; +} + +@ImplementsRequestInterface() +export default abstract class EventRequests { + static async getEvents({ http }: BaseClient): Promise> { + return await http.get("/events"); + } + static async getEventById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.get(`/events/${p.params.id}`); + } + static async createEvent({ http }: BaseClient, p: RequestData>): Promise> { + return await http.post("/events", p.body); + } + static async updateEvent({ http }: BaseClient, p: RequestData<{ id: string }, Partial>): Promise> { + return await http.post(`/events/${p.params.id}`, p.body); + } + static async deleteEvent({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.post(`/events/${p.params.id}`); + } +} diff --git a/src/requests/webpage/operationRequests.ts b/src/requests/webpage/operationRequests.ts new file mode 100644 index 0000000..b0a3bb6 --- /dev/null +++ b/src/requests/webpage/operationRequests.ts @@ -0,0 +1,31 @@ +import { AxiosResponse } from "axios"; +import { RequestDefinition, RequestData, ImplementsRequestInterface } from "../requestBase"; +import { BaseClient } from "../../clients/clientBase"; +import { Operation } from "../../viewmodels/webpage/collection"; + +interface IOperationRequests { + getOperations: RequestDefinition; + getOperationById: RequestDefinition<{ id: string }, void, Operation>; + createOperation: RequestDefinition, string>; + updateOperation: RequestDefinition<{ id: string }, Partial, void>; + deleteOperation: RequestDefinition<{ id: string }, void, void>; +} + +@ImplementsRequestInterface() +export default abstract class OperationRequests { + static async getOperations({ http }: BaseClient): Promise> { + return await http.get("/operations"); + } + static async getOperationById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.get(`/operations/${p.params.id}`); + } + static async createOperation({ http }: BaseClient, p: RequestData>): Promise> { + return await http.post("/operations", p.body); + } + static async updateOperation({ http }: BaseClient, p: RequestData<{ id: string }, Partial>): Promise> { + return await http.post(`/operations/${p.params.id}`, p.body); + } + static async deleteOperation({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.post(`/operations/${p.params.id}`); + } +} diff --git a/src/requests/webpage/vehicleRequests.ts b/src/requests/webpage/vehicleRequests.ts new file mode 100644 index 0000000..6751744 --- /dev/null +++ b/src/requests/webpage/vehicleRequests.ts @@ -0,0 +1,31 @@ +import { AxiosResponse } from "axios"; +import { RequestDefinition, RequestData, ImplementsRequestInterface } from "../requestBase"; +import { BaseClient } from "../../clients/clientBase"; +import { Vehicle } from "../../viewmodels/webpage/collection"; + +interface IVehicleRequests { + getVehicles: RequestDefinition; + getVehicleById: RequestDefinition<{ id: string }, void, Vehicle>; + createVehicle: RequestDefinition, string>; + updateVehicle: RequestDefinition<{ id: string }, Partial, void>; + deleteVehicle: RequestDefinition<{ id: string }, void, void>; +} + +@ImplementsRequestInterface() +export default abstract class VehicleRequests { + static async getVehicles({ http }: BaseClient): Promise> { + return await http.get("/vehicles"); + } + static async getVehicleById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.get(`/vehicles/${p.params.id}`); + } + static async createVehicle({ http }: BaseClient, p: RequestData>): Promise> { + return await http.post("/vehicles", p.body); + } + static async updateVehicle({ http }: BaseClient, p: RequestData<{ id: string }, Partial>): Promise> { + return await http.post(`/vehicles/${p.params.id}`, p.body); + } + static async deleteVehicle({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.post(`/vehicles/${p.params.id}`); + } +} diff --git a/src/types/webpage.ts b/src/types/webpage.ts new file mode 100644 index 0000000..ecebb8f --- /dev/null +++ b/src/types/webpage.ts @@ -0,0 +1,2 @@ +export * as ComponentTypes from "./webpage/componentTypes"; +export * as TextTypes from "./webpage/textTypes"; diff --git a/src/types/webpage/componentTypes.ts b/src/types/webpage/componentTypes.ts new file mode 100644 index 0000000..7ea8f96 --- /dev/null +++ b/src/types/webpage/componentTypes.ts @@ -0,0 +1,42 @@ +import { List } from "postcss/lib/list"; +import { + Spacer, + Gallery, + FullText, + FullImage, + DualColumnText, + ColumnImageText, + FileViewer, + FileDownload, + Embedding, + Section, +} from "../../viewmodels/webpage/component/dynamic-zone"; +import { EmphasiseArticle } from "../../viewmodels/webpage/component/shared"; + +export type ComponentNames = + | "shared.list" + | "shared.emphasise-article" + | "dynamic-zone.section" + | "dynamic-zone.spacer" + | "dynamic-zone.gallery" + | "dynamic-zone.full-text" + | "dynamic-zone.full-image" + | "dynamic-zone.dual-column-text" + | "dynamic-zone.column-image-text" + | "dynamic-zone.file-viewer" + | "dynamic-zone.file-download" + | "dynamic-zone.embedding"; + +export type ComponentTypes = + | List + | EmphasiseArticle + | Section + | Spacer + | Gallery + | FullText + | FullImage + | DualColumnText + | ColumnImageText + | FileViewer + | FileDownload + | Embedding; diff --git a/src/types/webpage/textTypes.ts b/src/types/webpage/textTypes.ts new file mode 100644 index 0000000..d35df07 --- /dev/null +++ b/src/types/webpage/textTypes.ts @@ -0,0 +1,10 @@ +export type TypeField = TextField | { type: "link"; url: string; children: Array }; + +export type TextField = { + type: "text"; + text: string; + strikethrough?: boolean; + underline?: boolean; + italic?: boolean; + bold?: boolean; +}; diff --git a/src/viewmodels/webpage.ts b/src/viewmodels/webpage.ts new file mode 100644 index 0000000..ac94686 --- /dev/null +++ b/src/viewmodels/webpage.ts @@ -0,0 +1,4 @@ +export * as CollectionModels from "./webpage/collection"; +export * as ComponentModels from "./webpage/component"; +export * as FieldModels from "./webpage/field"; +export * as SingleModels from "./webpage/single"; diff --git a/src/viewmodels/webpage/collection.ts b/src/viewmodels/webpage/collection.ts new file mode 100644 index 0000000..f436c27 --- /dev/null +++ b/src/viewmodels/webpage/collection.ts @@ -0,0 +1,59 @@ +import { ComponentTypes } from "../../types/webpage/componentTypes"; +import { File } from "./component/base"; +import { Hero } from "./component/items"; +import { ContentField } from "./field"; + +export interface BaseCollection { + id: number; + documentId: string; + slug: string; + createdAt: string; + updatedAt: string; + publishedAt: string; + locale: string; + + title: string; + description: string; + date: string; + content: ContentField | undefined; + image: File | undefined; + attachment: Array; +} + +export interface Article extends BaseCollection {} + +export interface Event extends BaseCollection {} + +export interface Operation extends BaseCollection {} + +export interface Vehicle extends BaseCollection {} + +export interface Lookup { + id: number; + documentId: string; + createdAt: string; + updatedAt: string; + publishedAt: string; + + reference: string; + collection: "events" | "vehicles" | "articles" | "operations"; + show_image: boolean; + show_date: boolean; + list_with_date: "none" | "by-year" | "by-month"; + items_with_number: "none" | "numbered" | "inverted"; + enable_detail: boolean; +} + +export interface Page { + id: number; + documentId: string; + identifier: string; + createdAt: string; + updatedAt: string; + publishedAt: string; + locale: string; + slug: string; + hero: Hero; + content: Array; + localizations: any[]; +} diff --git a/src/viewmodels/webpage/component.ts b/src/viewmodels/webpage/component.ts new file mode 100644 index 0000000..5c3b9c9 --- /dev/null +++ b/src/viewmodels/webpage/component.ts @@ -0,0 +1,5 @@ +export * as BaseModels from "./component/base"; +export * as DaynamicZoneModels from "./component/dynamic-zone"; +export * as GlobalModels from "./component/global"; +export * as ItemsModels from "./component/items"; +export * as SharedModels from "./component/shared"; diff --git a/src/viewmodels/webpage/component/base.ts b/src/viewmodels/webpage/component/base.ts new file mode 100644 index 0000000..8de8a0a --- /dev/null +++ b/src/viewmodels/webpage/component/base.ts @@ -0,0 +1,41 @@ +import { ComponentNames } from "../../../types/webpage/componentTypes"; + +export interface Component { + __component: ComponentNames; + id: number; +} + +export interface File { + id: number; + documentId: string; + name: string; + alternativeText: string | null; + caption: string | null; + width: number; + height: number; + formats: Record | null; + hash: string; + ext: string; + mime: string; + size: number; + url: string; + previewUrl: string | null; + provider: string; + provider_metadata: any; + createdAt: string; + updatedAt: string; + publishedAt: string; +} + +export interface ImageFormat { + name: string; + hash: string; + ext: string; + mime: string; + path: string | null; + width: number; + height: number; + size: number; + sizeInBytes: number; + url: string; +} diff --git a/src/viewmodels/webpage/component/dynamic-zone.ts b/src/viewmodels/webpage/component/dynamic-zone.ts new file mode 100644 index 0000000..e65d550 --- /dev/null +++ b/src/viewmodels/webpage/component/dynamic-zone.ts @@ -0,0 +1,55 @@ +import { ContentField } from "../field"; +import { File, Component } from "./base"; + +export interface ColumnImageText extends Component { + __component: "dynamic-zone.column-image-text"; + text: ContentField; + image_left: boolean; + image: File; +} + +export interface DualColumnText extends Component { + __component: "dynamic-zone.dual-column-text"; + left_side: ContentField; + right_side: ContentField; +} + +export interface Embedding extends Component { + __component: "dynamic-zone.embedding"; + link: string; +} + +export interface FileDownload extends Component { + __component: "dynamic-zone.file-download"; + file: File; +} + +export interface FileViewer extends Component { + __component: "dynamic-zone.file-viewer"; + file: File; +} + +export interface FullImage extends Component { + __component: "dynamic-zone.full-image"; + image: File; +} + +export interface FullText extends Component { + __component: "dynamic-zone.full-text"; + text: ContentField; +} + +export interface Gallery extends Component { + __component: "dynamic-zone.gallery"; + images: Array; +} + +export interface Section extends Component { + __component: "dynamic-zone.section"; + title: string; + description: string; +} + +export interface Spacer extends Component { + __component: "dynamic-zone.spacer"; +} diff --git a/src/viewmodels/webpage/component/global.ts b/src/viewmodels/webpage/component/global.ts new file mode 100644 index 0000000..cc45cdc --- /dev/null +++ b/src/viewmodels/webpage/component/global.ts @@ -0,0 +1,19 @@ +import { NavbarItem, FooterLink } from "./items"; + +export interface SEO { + metaTitle: string; + metaDescription: string; + keywords: string; +} + +export interface Navbar { + id: number; + navbar_items: NavbarItem[]; +} + +export interface Footer { + id: number; + copyright: undefined | string; + maintained_by: undefined | string; + links: FooterLink[]; +} diff --git a/src/viewmodels/webpage/component/items.ts b/src/viewmodels/webpage/component/items.ts new file mode 100644 index 0000000..c74ceee --- /dev/null +++ b/src/viewmodels/webpage/component/items.ts @@ -0,0 +1,37 @@ +import { Page } from "../collection"; +import { File } from "./base"; + +export interface FooterLink { + id: number; + text: string; + URL: string; + target: string; +} + +export interface Hero { + id: number; + title: string | undefined; + banner: File | undefined; +} + +export interface Link { + text: string; + URL: string; + target: "_blank" | "_self" | "_parent" | "_top"; +} + +export interface NavbarItem { + id: number; + name: string; + URL: string; + default_active_child: string; + page: any; + navbar_sub_items: NavbarSubItem[]; +} + +export interface NavbarSubItem { + id: number; + name: string; + URL: string; + page: Page | null; +} diff --git a/src/viewmodels/webpage/component/shared.ts b/src/viewmodels/webpage/component/shared.ts new file mode 100644 index 0000000..133c242 --- /dev/null +++ b/src/viewmodels/webpage/component/shared.ts @@ -0,0 +1,13 @@ +import { Article, Lookup } from "../collection"; +import { Component } from "./base"; + +export interface List extends Component { + __component: "shared.list"; + lookup: Lookup; +} + +export interface EmphasiseArticle extends Component { + __component: "shared.emphasise-article"; + articles: Array
; + link_to_articles: string; +} diff --git a/src/viewmodels/webpage/field.ts b/src/viewmodels/webpage/field.ts new file mode 100644 index 0000000..da5bc30 --- /dev/null +++ b/src/viewmodels/webpage/field.ts @@ -0,0 +1,20 @@ +import { TextField, TypeField } from "../../types/webpage/textTypes"; + +export interface ContentField + extends Array< + | { + type: "paragraph" | "heading" | "quote"; + children: Array; + level?: number; + } + | { + type: "list"; + format: "unordered" | "ordered"; + children: Array<{ type: "list-item"; children: Array }>; + } + | { + type: "code"; + children: Array; + language: "plaintext"; + } + > {} diff --git a/src/viewmodels/webpage/single.ts b/src/viewmodels/webpage/single.ts new file mode 100644 index 0000000..85dbd51 --- /dev/null +++ b/src/viewmodels/webpage/single.ts @@ -0,0 +1,27 @@ +import { ComponentTypes } from "../../types/webpage/componentTypes"; +import { File } from "./component/base"; +import { Navbar, Footer, SEO } from "./component/global"; + +export interface Global { + id: number; + documentId: string; + createdAt: string; + updatedAt: string; + publishedAt: string; + locale: string; + logo: File; + navbar: Navbar | undefined; + footer: Footer | undefined; + SEO: SEO | undefined; +} + +export interface Homepage { + id: number; + documentId: string; + createdAt: string; + updatedAt: string; + publishedAt: string; + locale: string; + backdrop: undefined | File; + content: Array; +}