project setup with core files including configuration, package management, and basic structure. Added .gitignore, README, and various TypeScript types for CMS components. Implemented initial components and layouts for the application.

This commit is contained in:
Peter Meier
2025-12-13 23:26:13 +01:00
parent ea288a5bbc
commit b1a556dc6d
167 changed files with 19057 additions and 131 deletions

217
middlelayer/schema.ts Normal file
View File

@@ -0,0 +1,217 @@
export const typeDefs = `#graphql
type ProductPromotion {
category: String!
text: String!
}
type Product {
id: ID!
name: String!
description: String
price: Float!
originalPrice: Float
currency: String!
imageUrl: String
category: String
inStock: Boolean!
promotion: ProductPromotion
}
type PageSeo {
title: String!
description: String!
metaRobotsIndex: String
metaRobotsFollow: String
}
type contentLayout {
mobile: String!
tablet: String
desktop: String
spaceBottom: Float
}
type HTMLContent {
type: String!
name: String!
html: String!
layout: contentLayout!
}
type MarkdownContent {
type: String!
name: String!
content: String!
layout: contentLayout!
alignment: String!
}
type IframeContent {
type: String!
name: String!
content: String!
iframe: String!
overlayImageUrl: String
layout: contentLayout!
}
type ImageGalleryContent {
type: String!
name: String!
images: [ImageGalleryImage!]!
description: String
layout: contentLayout!
}
type ImageGalleryImage {
url: String!
title: String
description: String
}
type ImageContent {
type: String!
name: String!
imageUrl: String!
caption: String!
maxWidth: Float
aspectRatio: Float
layout: contentLayout!
}
type QuoteContent {
type: String!
quote: String!
author: String!
variant: String!
layout: contentLayout!
}
type YoutubeVideoContent {
type: String!
id: String!
youtubeId: String!
params: String
title: String
description: String
layout: contentLayout!
}
type HeadlineContent {
type: String!
internal: String!
text: String!
tag: String!
align: String
layout: contentLayout!
}
union ContentItem = HTMLContent | MarkdownContent | IframeContent | ImageGalleryContent | ImageContent | QuoteContent | YoutubeVideoContent | HeadlineContent
type ContentRow {
justifyContent: String!
alignItems: String!
content: [ContentItem!]!
}
type Page {
slug: String!
name: String!
linkName: String!
headline: String!
subheadline: String!
seoTitle: String!
seoMetaRobots: String!
seoDescription: String!
topFullwidthBanner: FullwidthBanner
row1: ContentRow
row2: ContentRow
row3: ContentRow
}
type FullwidthBanner {
name: String!
variant: String!
headline: String!
subheadline: String!
text: String!
imageUrl: String
}
type NavigationLink {
slug: String
name: String!
linkName: String!
url: String
icon: String
newTab: Boolean
}
type Navigation {
name: String!
internal: String!
links: [NavigationLink!]!
}
enum UserRole {
ADMIN
CUSTOMER
GUEST
}
type User {
id: ID!
email: String!
name: String!
role: UserRole!
createdAt: String!
}
type AuthResponse {
user: User!
token: String!
}
type Translation {
key: String!
value: String!
namespace: String
}
type Translations {
locale: String!
translations: [Translation!]!
}
type Query {
products(limit: Int): [Product!]!
product(id: ID!): Product
pageSeo(locale: String): PageSeo!
page(slug: String!, locale: String): Page
pages(locale: String): [Page!]!
homepage(locale: String): Page
navigation(locale: String): Navigation!
me: User
translations(locale: String!, namespace: String): Translations!
}
type Mutation {
register(email: String!, password: String!, name: String!): AuthResponse!
login(email: String!, password: String!): AuthResponse!
}
type __Type {
kind: __TypeKind!
}
enum __TypeKind {
SCALAR
OBJECT
INTERFACE
UNION
ENUM
INPUT_OBJECT
LIST
NON_NULL
}
`;