phase-2: add shared platform interfaces and type contracts

This commit is contained in:
sdarbinyan
2026-07-03 01:29:04 +04:00
parent b957112fc7
commit e0b73923f9
25 changed files with 334 additions and 0 deletions

2
src/app/shared/index.ts Normal file
View File

@@ -0,0 +1,2 @@
export * from './models';
export * from './types';

View File

@@ -0,0 +1,12 @@
export interface ApiEndpointConfig {
path: string;
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
timeoutMs?: number;
}
export interface ApiEndpointsConfig {
bootstrap: ApiEndpointConfig;
website: Record<string, ApiEndpointConfig>;
builder: Record<string, ApiEndpointConfig>;
backoffice: Record<string, ApiEndpointConfig>;
}

View File

@@ -0,0 +1,27 @@
import { ApiEndpointsConfig } from './api-endpoints.model';
import { BrandingConfig } from './branding.model';
import { CompanyConfig } from './company.model';
import { FeatureFlagsConfig } from './feature-flags.model';
import { LocalizationConfig } from './localization.model';
import { NavigationConfig } from './navigation.model';
import { PageConfig } from './page.model';
import { PermissionsConfig } from './permissions.model';
import { SeoConfig } from './seo.model';
import { TenantConfig } from './tenant.model';
import { ThemeConfig } from './theme.model';
export interface BootstrapConfig {
schemaVersion: string;
generatedAt: string;
tenant: TenantConfig;
branding: BrandingConfig;
theme: ThemeConfig;
company: CompanyConfig;
featureFlags: FeatureFlagsConfig;
apiEndpoints: ApiEndpointsConfig;
localization: LocalizationConfig;
seo: SeoConfig;
permissions: PermissionsConfig;
navigation: NavigationConfig;
pages: PageConfig[];
}

View File

@@ -0,0 +1,13 @@
import { UrlString } from '../../types/primitive.types';
export interface BrandingConfig {
brandName: string;
legalName: string;
slogan?: string;
logoUrl: UrlString;
logoCompactUrl?: UrlString;
faviconUrl: UrlString;
appIconUrl?: UrlString;
supportEmail?: string;
supportPhone?: string;
}

View File

@@ -0,0 +1,22 @@
export interface CompanyAddressConfig {
country: string;
region?: string;
city: string;
street?: string;
postalCode?: string;
}
export interface CompanyContactConfig {
email: string;
phone?: string;
telegram?: string;
website?: string;
}
export interface CompanyConfig {
companyName: string;
registrationNumber?: string;
taxId?: string;
address: CompanyAddressConfig;
contacts: CompanyContactConfig;
}

View File

@@ -0,0 +1,14 @@
export interface FeatureFlagsConfig {
wishlist: boolean;
compare: boolean;
reviews: boolean;
blog: boolean;
chat: boolean;
analytics: boolean;
notifications: boolean;
coupons: boolean;
loyalty: boolean;
giftCards: boolean;
invoices: boolean;
[key: string]: boolean;
}

View File

@@ -0,0 +1,14 @@
export * from './api-endpoints.model';
export * from './bootstrap-config.model';
export * from './branding.model';
export * from './company.model';
export * from './feature-flags.model';
export * from './localization.model';
export * from './navigation.model';
export * from './page.model';
export * from './permissions.model';
export * from './section.model';
export * from './seo.model';
export * from './tenant.model';
export * from './theme.model';
export * from './widget.model';

View File

@@ -0,0 +1,12 @@
export interface LocalizationDictionaryRef {
locale: string;
dictionaryUrl: string;
version: string;
}
export interface LocalizationConfig {
defaultLocale: string;
supportedLocales: string[];
currencyByLocale: Record<string, string>;
dictionaries: LocalizationDictionaryRef[];
}

View File

@@ -0,0 +1,15 @@
export interface NavigationItemConfig {
id: string;
labelKey: string;
route: string;
icon?: string;
order: number;
visibleWhenFlags?: string[];
children?: NavigationItemConfig[];
}
export interface NavigationConfig {
header: NavigationItemConfig[];
footer: NavigationItemConfig[];
sidebar?: NavigationItemConfig[];
}

View File

@@ -0,0 +1,18 @@
import { SectionConfig } from './section.model';
export interface PageRouteConfig {
path: string;
exact?: boolean;
}
export interface PageConfig {
id: string;
key: string;
title: string;
route: PageRouteConfig;
layout: string;
sections: SectionConfig[];
seoKey?: string;
featureFlag?: string;
visible?: boolean;
}

View File

@@ -0,0 +1,14 @@
export interface PermissionDefinition {
key: string;
description?: string;
}
export interface RolePermissions {
role: string;
permissions: string[];
}
export interface PermissionsConfig {
definitions: PermissionDefinition[];
roles: RolePermissions[];
}

View File

@@ -0,0 +1,17 @@
import { WidgetConfig } from './widget.model';
export interface SectionLayoutConfig {
columns?: number;
gap?: string;
align?: 'start' | 'center' | 'end' | 'stretch';
}
export interface SectionConfig {
id: string;
type: string;
order: number;
layout?: SectionLayoutConfig;
widgets: WidgetConfig[];
featureFlag?: string;
visible?: boolean;
}

View File

@@ -0,0 +1,18 @@
export interface SeoMetaTagConfig {
name?: string;
property?: string;
content: string;
}
export interface SeoPageConfig {
title: string;
description: string;
canonicalUrl?: string;
robots?: string;
metaTags?: SeoMetaTagConfig[];
}
export interface SeoConfig {
default: SeoPageConfig;
byPageKey: Record<string, SeoPageConfig>;
}

View File

@@ -0,0 +1,17 @@
import { UUID, UrlString } from '../../types/primitive.types';
export interface TenantConfig {
id: UUID;
slug: string;
code: string;
host: string;
name: string;
websiteBaseUrl: UrlString;
builderBaseUrl: UrlString;
backofficeBaseUrl: UrlString;
defaultLocale: string;
supportedLocales: string[];
defaultCurrency: string;
supportedCurrencies: string[];
timezone: string;
}

View File

@@ -0,0 +1,36 @@
export interface ThemeTypographyConfig {
primaryFontFamily: string;
headingFontFamily?: string;
baseFontSize: number;
}
export interface ThemeSpacingConfig {
unit: number;
scale: number[];
}
export interface ThemePaletteConfig {
primary: string;
secondary: string;
accent: string;
success: string;
warning: string;
danger: string;
info: string;
textPrimary: string;
textSecondary: string;
backgroundPrimary: string;
backgroundSecondary: string;
border: string;
}
export interface ThemeConfig {
themeId: string;
mode: 'light' | 'dark' | 'system';
palette: ThemePaletteConfig;
typography: ThemeTypographyConfig;
spacing: ThemeSpacingConfig;
borderRadiusScale: Record<string, string>;
shadows: Record<string, string>;
iconSet: string;
}

View File

@@ -0,0 +1,15 @@
export interface WidgetActionConfig {
type: 'navigate' | 'open' | 'submit' | 'custom';
target?: string;
payload?: Record<string, unknown>;
}
export interface WidgetConfig {
id: string;
type: string;
version: string;
props: Record<string, unknown>;
actions?: Record<string, WidgetActionConfig>;
featureFlag?: string;
visible?: boolean;
}

View File

@@ -0,0 +1 @@
export * from './user-preferences.model';

View File

@@ -0,0 +1,8 @@
export interface UserPreferences {
locale: string;
currency: string;
themeMode: 'light' | 'dark' | 'system';
compactMode?: boolean;
wishlistEnabled?: boolean;
notificationsEnabled?: boolean;
}

View File

@@ -0,0 +1,3 @@
export * as ConfigModels from './config';
export * as DomainModels from './domain';
export * as UiModels from './ui';

View File

@@ -0,0 +1,13 @@
export interface ButtonConfig {
id?: string;
label: string;
variant: 'primary' | 'secondary' | 'tertiary' | 'ghost' | 'danger';
size?: 'sm' | 'md' | 'lg';
icon?: string;
disabled?: boolean;
loading?: boolean;
action?: {
type: 'navigate' | 'submit' | 'emit' | 'custom';
target?: string;
};
}

View File

@@ -0,0 +1,11 @@
import { ButtonConfig } from './button.model';
export interface CategoryCardConfig {
id: string;
title: string;
description?: string;
imageUrl?: string;
icon?: string;
itemsCount?: number;
action?: ButtonConfig;
}

View File

@@ -0,0 +1,3 @@
export * from './button.model';
export * from './category-card.model';
export * from './product-card.model';

View File

@@ -0,0 +1,23 @@
import { ButtonConfig } from './button.model';
export interface ProductCardPrice {
amount: number;
currency: string;
originalAmount?: number;
}
export interface ProductCardConfig {
id: string;
sku: string;
title: string;
subtitle?: string;
imageUrl: string;
badges?: string[];
tags?: string[];
rating?: number;
reviewsCount?: number;
price: ProductCardPrice;
stockStatus?: 'in_stock' | 'low_stock' | 'out_of_stock';
primaryAction?: ButtonConfig;
secondaryAction?: ButtonConfig;
}

View File

@@ -0,0 +1 @@
export * from './primitive.types';

View File

@@ -0,0 +1,5 @@
export type UUID = string;
export type ISODateTime = string;
export type LocaleCode = string;
export type CurrencyCode = string;
export type UrlString = string;