diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..1700f19 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,22 @@ +image: docker:stable + +services: + - docker:dind + +before_script: + - docker info + +build: + only: + - master + before_script: + - docker login hcr0002.corp.maks-it.com -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} + script: + # weatherforecast + - docker build ./src/ -f ./src/WeatherForecast/Dockerfile -t ${CI_REGISTRY}/weatherforecast:latest + - docker push ${CI_REGISTRY}/weatherforecast:latest + after_script: + - docker logout ${CI_REGISTRY} + stage: build + tags: + - docker \ No newline at end of file diff --git a/db/DML/content.json b/db/DML/content.json index cd4db30..3fc4478 100644 --- a/db/DML/content.json +++ b/db/DML/content.json @@ -1,6 +1,5 @@ { - "_id": "b3f39a82-6a1b-46a4-85cc-04c3b4315511", - "siteId": "404c8232-9048-4519-bfba-6e78dc7005ca", + "_id": "404c8232-9048-4519-bfba-6e78dc7005ca", "l10n": [ { @@ -14,6 +13,131 @@ "currency": "EUR", "currencySymbol": "€" }, + + + "header": { + "title": "{siteName}", + "meta": { + "chartset": "utf-8", + "google-site-verification": "", + "description": "Single-page application home page" + }, + "link": { + "canonical": "{siteUrl}" + } + }, + + "routes": [ + { + "target": "/", + "component": "Home" + }, + { + "target": "/home", + "component": "Home" + }, + { + "target": "/shop", + "childRoutes": [ + { + "target": "", + "component": "ShopCatalog" + }, + { + "target": ":page", + "component": "ShopCatalog" + }, + { + "target": ":page", + "childRoutes": [ + { + "target": ":slug", + "component": "ShopItem" + } + ] + }, + { + "target": "cart", + "childRoutes": [ + { + "target": "", + "component": "Cart" + }, + { + "target": "checkout", + "component": "Checkout" + } + ] + } + ] + }, + { + "target": "/blog", + "childRoutes": [ + { + "target": "", + "component": "BlogCatalog" + }, + { + "target": ":page", + "component": "BlogCatalog" + }, + { + "target": ":page", + "childRoutes": [ + { + "target": ":slug", + "component": "BlogItem" + } + ] + } + ] + } + ], + "adminRoutes": [], + "serviceRoutes": [ + { + "target": "/signin", + "component": "Signin" + }, + { + "target": "/signup", + "component": "Signup" + } + ], + + + "topMenu": [ + { + "target": "/", + "title": "Home" + }, + { + "target": "/shop", + "title": "Shop" + }, + { + "target": "/blog", + "title": "Blog" + }, + { + "target": "/signin", + "title": "Sign in" + }, + { + "target": "/signup", + "title": "Sign up" + }, + { + "target": "/shop/cart", + "icon": "shopping-cart", + "title": "Cart ({quantity})" + + } + ], + "sideMenu": [], + + "homePage": { "header": { "title": "Home - {siteName}", @@ -379,155 +503,5 @@ } } } - ], - - "header": { - "title": "{siteName}", - "meta": { - "chartset": "utf-8", - "google-site-verification": "", - "description": "Single-page application home page" - }, - "link": { - "canonical": "{siteUrl}" - } - }, - - "routes": [ - { - "target": "/", - "component": "Home" - }, - { - "target": "/home", - "component": "Home" - }, - { - "target": "/shop", - "childRoutes": [ - { - "target": "", - "component": "ShopCatalog" - }, - { - "target": ":page", - "component": "ShopCatalog" - }, - { - "target": ":page", - "childRoutes": [ - { - "target": ":slug", - "component": "ShopItem" - } - ] - }, - { - "target": "cart", - "childRoutes": [ - { - "target": "", - "component": "Cart" - }, - { - "target": "checkout", - "component": "Checkout" - } - ] - } - ] - }, - { - "target": "/blog", - "childRoutes": [ - { - "target": "", - "component": "BlogCatalog" - }, - { - "target": ":page", - "component": "BlogCatalog" - }, - { - "target": ":page", - "childRoutes": [ - { - "target": ":slug", - "component": "BlogItem" - } - ] - } - ] - } - ], - "adminRoutes": [], - "serviceRoutes": [ - { - "target": "/signin", - "component": "Signin" - }, - { - "target": "/signup", - "component": "Signup" - } - ], - "topMenu": [ - { - "target": "/", - "l10n": [ - { - "locale": 0, - "title": "Home" - } - ] - }, - { - "target": "/shop", - "l10n": [ - { - "locale": 0, - "title": "Shop" - } - ] - }, - { - "target": "/blog", - "l10n": [ - { - "locale": 0, - "title": "Blog" - } - ] - }, - { - "target": "/signin", - "l10n": [ - { - "locale": 0, - "title": "Sign in" - } - ] - }, - { - "target": "/signup", - "l10n": [ - { - "locale": 0, - "title": "Sign up" - } - ] - }, - { - "target": "/shop/cart", - "icon": "shopping-cart", - "l10n": [ - { - "locale": 0, - "title": "Cart ({quantity})" - } - ] - } - ], - "sideMenu": [] - + ] } \ No newline at end of file diff --git a/src/ClientApp/.env b/src/ClientApp/.env index e9a34ea..16171ec 100644 --- a/src/ClientApp/.env +++ b/src/ClientApp/.env @@ -1,9 +1,9 @@ BROWSER=none -REACT_APP_LOCAL_ONLY=Y +REACT_APP_LOCAL_ONLY=N REACT_APP_FRONTEND=https://localhost:7174 -REACT_APP_API=https://reverseproxy:7174/api +REACT_APP_API=https://localhost:7174/api REACT_APP_SITEID=404c8232-9048-4519-bfba-6e78dc7005ca REACT_APP_LOCALE=en-US diff --git a/src/ClientApp/src/App.tsx b/src/ClientApp/src/App.tsx index 4550cf8..c8491d5 100644 --- a/src/ClientApp/src/App.tsx +++ b/src/ClientApp/src/App.tsx @@ -5,7 +5,7 @@ import { Route, Routes, useLocation } from 'react-router' // Redux import { useSelector, useDispatch } from 'react-redux' import type {} from 'redux-thunk/extend-redux' -import { actionCreators as settingsActionCreators } from './store/reducers/Content' +import { actionCreators as contentActionCreators } from './store/reducers/Content' // Components @@ -86,7 +86,7 @@ const App = () => { const { content, header } = useSelector((state: ApplicationState) => state) useEffect(() => { - dispatch(settingsActionCreators.requestContent()) + dispatch(contentActionCreators.requestContent()) }, []) useEffect(() => { diff --git a/src/ClientApp/src/store/reducers/Content.ts b/src/ClientApp/src/store/reducers/Content.ts index bc084c1..9d02ad9 100644 --- a/src/ClientApp/src/store/reducers/Content.ts +++ b/src/ClientApp/src/store/reducers/Content.ts @@ -547,12 +547,19 @@ export const actionCreators = { requestContent: (props?: IGetContentRequestModel): AppThunkAction => (dispatch, getState) => { dispatch({ type: 'REQUEST_CONTENT' }) + if(process.env.REACT_APP_LOCAL_ONLY == 'Y') { dispatch({ type: 'RECEIVE_CONTENT', ...cloneObject(mockData) }) return } - Get>(`${process.env.REACT_APP_API}/${process.env.REACT_APP_CONTENT}/${process.env.REACT_APP_SITEID}`, props?.pathParams, props?.searchParams) + const siteId = process.env.REACT_APP_SITEID + const pathParams = { ...props?.pathParams, siteId } + + const locale = process.env.REACT_APP_LOCALE + const searchParams = { ...props?.searchParams, locale } + + Get>(`${process.env.REACT_APP_API}/${process.env.REACT_APP_CONTENT}`, pathParams, searchParams) .then(response => response) .then((data) => { if(data) { diff --git a/src/DataProviders/Collections/ContentDataProvider.cs b/src/DataProviders/Collections/ContentDataProvider.cs index 143799d..c0dde12 100644 --- a/src/DataProviders/Collections/ContentDataProvider.cs +++ b/src/DataProviders/Collections/ContentDataProvider.cs @@ -4,14 +4,14 @@ using DomainResults.Common; using MongoDB.Bson.Serialization; using MongoDB.Driver; -using DomainObjects.Documents; using DataProviders.Collections.Abstractions; +using DomainObjects.Documents.Content; namespace DataProviders.Collections { public interface IContentDataProvider { - (List?, IDomainResult) Get(Guid siteId); + (ContentDocument?, IDomainResult) Get(Guid siteId); } public class ContentDataProvider : CollectionDataProviderBase, IContentDataProvider { @@ -25,6 +25,13 @@ namespace DataProviders.Collections ISessionService sessionService) : base(logger, client, idGenerator, sessionService, _databaseName, _collectionName) { } - public (List?, IDomainResult) Get(Guid siteId) => GetWithPredicate(x => x.SiteId == siteId, x => x); + public (ContentDocument?, IDomainResult) Get(Guid siteId) { + var (list, result) = GetWithPredicate(x => x.Id == siteId, x => x); + + if (!result.IsSuccess || list == null) + return (null, result); + + return (list.First(), result); + } } } diff --git a/src/DataProviders/Mappings.cs b/src/DataProviders/Mappings.cs index 47d9c63..fc597e4 100644 --- a/src/DataProviders/Mappings.cs +++ b/src/DataProviders/Mappings.cs @@ -15,6 +15,10 @@ using DomainObjects.Documents.Sites; using DomainObjects.Documents.Categories; using DomainObjects.Documents.Categories.L10n; using DomainObjects.Documents.Posts; +using DomainObjects.Documents.Content; +using DomainObjects.Abstractions.Posts.L10n; +using DomainObjects.Documents.Content.L10n; +using Core.Enumerations; namespace DataProviders { @@ -32,19 +36,8 @@ namespace DataProviders // https://kevsoft.net/2020/07/02/how-to-store-decimal-fields-in-mongodb-with-csharp.html BsonSerializer.RegisterSerializer(new DecimalSerializer(BsonType.Decimal128)); - #region L10n - if (!BsonClassMap.IsClassMapRegistered(typeof(PostItemL10n))) { - BsonClassMap.RegisterClassMap(cm => { - cm.AutoMap(); - - cm.GetMemberMap(c => c.Locale) - .SetSerializer(new EnumerationSerializer()); - - cm.GetMemberMap(c => c.TextFormat) - .SetSerializer(new EnumerationSerializer()); - }); - } + #region MediaAttachments if (!BsonClassMap.IsClassMapRegistered(typeof(MediaAttachmentL10n))) { BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); @@ -54,6 +47,21 @@ namespace DataProviders }); } + if (!BsonClassMap.IsClassMapRegistered(typeof(MediaAttachment))) { + BsonClassMap.RegisterClassMap(cm => { + cm.AutoMap(); + + cm.GetMemberMap(c => c.MediaType) + .SetSerializer(new EnumerationSerializer()); + }); + } + #endregion + + #region L10n + + + + if (!BsonClassMap.IsClassMapRegistered(typeof(CategoryL10n))) { BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); @@ -118,14 +126,7 @@ namespace DataProviders }); } - if (!BsonClassMap.IsClassMapRegistered(typeof(Localization))) { - BsonClassMap.RegisterClassMap(cm => { - cm.AutoMap(); - cm.GetMemberMap(c => c.Locale) - .SetSerializer(new EnumerationSerializer()); - }); - } if (!BsonClassMap.IsClassMapRegistered(typeof(MenuItem))) { BsonClassMap.RegisterClassMap(cm => { @@ -158,15 +159,25 @@ namespace DataProviders #endregion - #region BlogItem + #region Blog and Shop item + if (!BsonClassMap.IsClassMapRegistered(typeof(PostItemL10n))) { + BsonClassMap.RegisterClassMap(cm => { + cm.AutoMap(); + + cm.GetMemberMap(c => c.Locale) + .SetSerializer(new EnumerationSerializer()); + + cm.GetMemberMap(c => c.TextFormat) + .SetSerializer(new EnumerationSerializer()); + }); + } + if (!BsonClassMap.IsClassMapRegistered(typeof(BlogDocument))) { BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); }); } - #endregion - #region ShopItem if (!BsonClassMap.IsClassMapRegistered(typeof(ShopDocument))) { BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); @@ -331,6 +342,21 @@ namespace DataProviders #region Content + if (!BsonClassMap.IsClassMapRegistered(typeof(Settings))) { + BsonClassMap.RegisterClassMap(cm => { + cm.AutoMap(); + }); + } + + if (!BsonClassMap.IsClassMapRegistered(typeof(ContentL10n))) { + BsonClassMap.RegisterClassMap(cm => { + cm.AutoMap(); + + cm.GetMemberMap(c => c.Locale) + .SetSerializer(new EnumerationSerializer()); + }); + } + if (!BsonClassMap.IsClassMapRegistered(typeof(ContentDocument))) { BsonClassMap.RegisterClassMap(cm => { diff --git a/src/DomainObjects/Abstractions/PostItemBase.cs b/src/DomainObjects/Abstractions/PostItemBase.cs deleted file mode 100644 index cb2eba6..0000000 --- a/src/DomainObjects/Abstractions/PostItemBase.cs +++ /dev/null @@ -1,25 +0,0 @@ -using DomainObjects.L10n; - -namespace DomainObjects.Abstractions; - -public abstract class PostItemBase : DomainObjectDocumentBase { - - public Guid SiteId { get; set; } - - public List L10n { get; set; } - - public List? MediaAttachments { get; set; } - - public Guid Author { get; set; } - - public DateTime Created { get; set; } - - public DateTime? Published { get; set; } - - - public List? Tags { get; set; } - - public List Categories { get; set; } - - public bool? FamilyFriendly { get; set; } -} diff --git a/src/DomainObjects/Abstractions/Posts/L10n/PostItemL10n.cs b/src/DomainObjects/Abstractions/Posts/L10n/PostItemL10n.cs new file mode 100644 index 0000000..fcbd2af --- /dev/null +++ b/src/DomainObjects/Abstractions/Posts/L10n/PostItemL10n.cs @@ -0,0 +1,37 @@ +using DomainObjects.Enumerations; + +namespace DomainObjects.Abstractions.Posts.L10n; + +public class PostItemL10n : DomainObjectBase { + public Locales Locale { get; set; } + public string Slug { get; set; } + public string Description { get; set; } + public string Title { get; set; } + public string Text { get; set; } + public TextFormat TextFormat { get; set; } + public string PlainText { get; set; } + public string ShortText { get; set; } + public List? Badges { get; set; } + + public override int GetHashCode() + { + unchecked + { + int hash = 17; + + hash = hash * 23 + Locale.GetHashCode(); + hash = hash * 23 + Slug.GetHashCode(); + hash = hash * 23 + Description.GetHashCode(); + hash = hash * 23 + Title.GetHashCode(); + hash = hash * 23 + Text.GetHashCode(); + hash = hash * 23 + TextFormat.GetHashCode(); + hash = hash * 23 + ShortText.GetHashCode(); + + if (Badges != null) + hash = hash * 23 + Badges.GetHashCode(); + + return hash; + } + } +} + diff --git a/src/DomainObjects/Abstractions/Posts/PostItemBase.cs b/src/DomainObjects/Abstractions/Posts/PostItemBase.cs new file mode 100644 index 0000000..415d672 --- /dev/null +++ b/src/DomainObjects/Abstractions/Posts/PostItemBase.cs @@ -0,0 +1,25 @@ +using DomainObjects.Abstractions.Posts.L10n; + +namespace DomainObjects.Abstractions.Posts; + +public abstract class PostItemBase : DomainObjectDocumentBase { + + public Guid SiteId { get; set; } + + public List L10n { get; set; } + + public List? MediaAttachments { get; set; } + + public Guid Author { get; set; } + + public DateTime Created { get; set; } + + public DateTime? Published { get; set; } + + + public List? Tags { get; set; } + + public List Categories { get; set; } + + public bool? FamilyFriendly { get; set; } +} diff --git a/src/DomainObjects/Documents/Content/ContentDocument.cs b/src/DomainObjects/Documents/Content/ContentDocument.cs new file mode 100644 index 0000000..4d7d595 --- /dev/null +++ b/src/DomainObjects/Documents/Content/ContentDocument.cs @@ -0,0 +1,13 @@ +using DomainObjects.Abstractions; +using DomainObjects.Documents.Content.L10n; + +namespace DomainObjects.Documents.Content; + +public class ContentDocument : DomainObjectDocumentBase { + public List L10n { get; set; } + + public override int GetHashCode() + { + throw new NotImplementedException(); + } +} diff --git a/src/DomainObjects/Documents/Content/L10n/ContentL10n.cs b/src/DomainObjects/Documents/Content/L10n/ContentL10n.cs new file mode 100644 index 0000000..d62d80b --- /dev/null +++ b/src/DomainObjects/Documents/Content/L10n/ContentL10n.cs @@ -0,0 +1,41 @@ +using DomainObjects.Enumerations; +using DomainObjects.Pages; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DomainObjects.Documents.Content.L10n { + public class ContentL10n { + public Locales Locale { get; set; } + + public string SiteName { get; set; } + public string SiteUrl { get; set; } + + public Header Header { get; set; } + + public Settings Settings { get; set; } + + public List Routes { get; set; } + public List AdminRoutes { get; set; } + public List ServiceRoutes { get; set; } + + public List TopMenu { get; set; } + public List SideMenu { get; set; } + + public HomePage HomePage { get; set; } + + public ShopCatalogPage ShopCatalog { get; set; } + public ShopItemPage ShopItem { get; set; } + public ShopCartPage ShopCart { get; set; } + public ShopCheckoutPage ShopCheckout { get; set; } + + + public BlogCatalogPage BlogCatalog { get; set; } + public BlogItemPage BlogItem { get; set; } + + public SignInPage SignIn { get; set; } + public SignUpPage SignUp { get; set; } + } +} diff --git a/src/DomainObjects/Documents/ContentDocument.cs b/src/DomainObjects/Documents/ContentDocument.cs deleted file mode 100644 index 10ee7f1..0000000 --- a/src/DomainObjects/Documents/ContentDocument.cs +++ /dev/null @@ -1,41 +0,0 @@ -using DomainObjects.Abstractions; -using DomainObjects.Pages; - -namespace DomainObjects.Documents; - -public class ContentDocument : DomainObjectDocumentBase { - - public Guid SiteId { get; set; } - - public string SiteName { get; set; } - public string SiteUrl { get; set; } - - public Header Header { get; set; } - - public Localization Localization { get; set; } - - public List Routes { get; set; } - public List AdminRoutes { get; set; } - public List ServiceRoutes { get; set; } - - public List TopMenu { get; set; } - public List SideMenu { get; set; } - - public HomePage HomePage { get; set; } - - public ShopCatalogPage ShopCatalog { get; set; } - public ShopItemPage ShopItem { get; set; } - public ShopCartPage ShopCart { get; set; } - public ShopCheckoutPage ShopCheckout { get; set; } - - - public BlogCatalogPage BlogCatalog { get; set; } - public BlogItemPage BlogItem { get; set; } - - public SignInPage SignIn { get; set; } - public SignUpPage SignUp { get; set; } - - public override int GetHashCode() { - throw new NotImplementedException(); - } -} diff --git a/src/DomainObjects/Documents/Posts/BlogDocument.cs b/src/DomainObjects/Documents/Posts/BlogDocument.cs index b85df91..39929e9 100644 --- a/src/DomainObjects/Documents/Posts/BlogDocument.cs +++ b/src/DomainObjects/Documents/Posts/BlogDocument.cs @@ -1,4 +1,4 @@ -using DomainObjects.Abstractions; +using DomainObjects.Abstractions.Posts; namespace DomainObjects.Documents.Posts; diff --git a/src/DomainObjects/Documents/Posts/ShopDocument.cs b/src/DomainObjects/Documents/Posts/ShopDocument.cs index 5ed4240..e7d33db 100644 --- a/src/DomainObjects/Documents/Posts/ShopDocument.cs +++ b/src/DomainObjects/Documents/Posts/ShopDocument.cs @@ -1,4 +1,4 @@ -using DomainObjects.Abstractions; +using DomainObjects.Abstractions.Posts; namespace DomainObjects.Documents.Posts; diff --git a/src/DomainObjects/L10n/PostItemL10n.cs b/src/DomainObjects/L10n/PostItemL10n.cs deleted file mode 100644 index b550550..0000000 --- a/src/DomainObjects/L10n/PostItemL10n.cs +++ /dev/null @@ -1,36 +0,0 @@ -using DomainObjects.Abstractions; -using DomainObjects.Enumerations; - -namespace DomainObjects.L10n; - -public class PostItemL10n : DomainObjectBase { - public Locales Locale { get; set; } - public string Slug { get; set; } - public string Description { get; set; } - public string Title { get; set; } - public string Text { get; set; } - public TextFormat TextFormat { get; set; } - public string PlainText { get; set; } - public string ShortText { get; set; } - public List? Badges { get; set; } - - public override int GetHashCode() { - unchecked { - int hash = 17; - - hash = hash * 23 + Locale.GetHashCode(); - hash = hash * 23 + Slug.GetHashCode(); - hash = hash * 23 + Description.GetHashCode(); - hash = hash * 23 + Title.GetHashCode(); - hash = hash * 23 + Text.GetHashCode(); - hash = hash * 23 + TextFormat.GetHashCode(); - hash = hash * 23 + ShortText.GetHashCode(); - - if(Badges != null) - hash = hash * 23 + Badges.GetHashCode(); - - return hash; - } - } -} - diff --git a/src/DomainObjects/Localization.cs b/src/DomainObjects/Settings.cs similarity index 79% rename from src/DomainObjects/Localization.cs rename to src/DomainObjects/Settings.cs index 57ec343..7356cc9 100644 --- a/src/DomainObjects/Localization.cs +++ b/src/DomainObjects/Settings.cs @@ -3,12 +3,10 @@ using DomainObjects.Enumerations; namespace DomainObjects; -public class Localization : DomainObjectBase { +public class Settings : DomainObjectBase { public string? TimeZone { get; set; } - public Locales Locale { get; set; } - public string? DateFormat { get; set; } public string? TimeFormat { get; set; } diff --git a/src/WeatherForecast/Models/Blog/Requests/PostBlogItemRequestModel.cs b/src/WeatherForecast/Models/Blog/Requests/PostBlogItemRequestModel.cs index 336818d..e231a8d 100644 --- a/src/WeatherForecast/Models/Blog/Requests/PostBlogItemRequestModel.cs +++ b/src/WeatherForecast/Models/Blog/Requests/PostBlogItemRequestModel.cs @@ -7,6 +7,7 @@ using DomainObjects; using Core.Enumerations; using Core.Abstractions.Models; +using DomainObjects.Abstractions.Posts.L10n; namespace WeatherForecast.Models.Blog.Requests { diff --git a/src/WeatherForecast/Models/Blog/Requests/PutBlogItemRequestModel.cs b/src/WeatherForecast/Models/Blog/Requests/PutBlogItemRequestModel.cs index 62d4ccb..890e8ea 100644 --- a/src/WeatherForecast/Models/Blog/Requests/PutBlogItemRequestModel.cs +++ b/src/WeatherForecast/Models/Blog/Requests/PutBlogItemRequestModel.cs @@ -1,5 +1,6 @@ using System.ComponentModel.DataAnnotations; +using DomainObjects.Abstractions.Posts.L10n; using DomainObjects.Documents.Posts; using DomainObjects.Enumerations; using DomainObjects.L10n; @@ -8,6 +9,7 @@ using DomainObjects; using Core.Enumerations; using Core.Abstractions.Models; + namespace WeatherForecast.Models.Blog.Requests { /// diff --git a/src/WeatherForecast/Models/Blog/Responses/GetBlogItemResponseModel.cs b/src/WeatherForecast/Models/Blog/Responses/GetBlogItemResponseModel.cs index 43ff31a..9004062 100644 --- a/src/WeatherForecast/Models/Blog/Responses/GetBlogItemResponseModel.cs +++ b/src/WeatherForecast/Models/Blog/Responses/GetBlogItemResponseModel.cs @@ -8,14 +8,16 @@ using DomainObjects.Documents.Posts; using DomainObjects.Documents.Users; using DomainObjects.Documents.Categories; using DomainObjects.Documents.Categories.L10n; +using DomainObjects.Abstractions.Posts.L10n; -namespace WeatherForecast.Models.Blog.Responses { +namespace WeatherForecast.Models.Blog.Responses +{ - #region Media attachment - /// - /// - /// - public class GetBlogItemMediaAttachmentL10nResponseModel : ResponseModelBase { + #region Media attachment + /// + /// + /// + public class GetBlogItemMediaAttachmentL10nResponseModel : ResponseModelBase { /// /// /// diff --git a/src/WeatherForecast/Models/Content/Responses/GetContentResponseModel.cs b/src/WeatherForecast/Models/Content/Responses/GetContentResponseModel.cs index ea9b08c..51852c8 100644 --- a/src/WeatherForecast/Models/Content/Responses/GetContentResponseModel.cs +++ b/src/WeatherForecast/Models/Content/Responses/GetContentResponseModel.cs @@ -1,6 +1,7 @@ -using Core.Abstractions.Models; +using Amazon.Runtime.Internal; +using Core.Abstractions.Models; using DomainObjects; -using DomainObjects.Documents; +using DomainObjects.Documents.Content; using DomainObjects.Enumerations; using WeatherForecast.Models.Content.Responses.Pages; @@ -10,18 +11,13 @@ namespace WeatherForecast.Models.Content.Responses /// /// /// - public class LocalizationModel { + public class SettingsModel { /// /// /// public string? TimeZone { get; set; } - /// - /// - /// - public Locales? Locale { get; set; } - /// /// /// @@ -47,9 +43,8 @@ namespace WeatherForecast.Models.Content.Responses /// /// /// - public LocalizationModel(Localization localization) { + public SettingsModel(Settings localization) { TimeZone = localization.TimeZone; - Locale = localization.Locale; DateFormat = localization.DateFormat; TimeFormat = localization.TimeFormat; Currency = localization.Currency; @@ -80,7 +75,7 @@ namespace WeatherForecast.Models.Content.Responses /// /// /// - public LocalizationModel Localization { get; set; } + public SettingsModel Settings { get; set; } /// /// @@ -156,33 +151,37 @@ namespace WeatherForecast.Models.Content.Responses /// /// /// - public GetContentResponseModel(ContentDocument domainObject) { + /// + public GetContentResponseModel(ContentDocument domainObject, Locales locale) { - SiteName = domainObject.SiteName; - SiteUrl = domainObject.SiteUrl; + var l10n = domainObject.L10n.Single(x => x.Locale == locale); - Header = new HeaderModel(domainObject.Header); - Localization = new LocalizationModel(domainObject.Localization); - Routes = domainObject.Routes.Select(x => new RouteModel(x)).ToList(); - AdminRoutes = domainObject.AdminRoutes.Select(x => new RouteModel(x)).ToList(); - ServiceRoutes = domainObject.ServiceRoutes.Select(x => new RouteModel(x)).ToList(); + SiteName = l10n.SiteName; + SiteUrl = l10n.SiteUrl; - TopMenu = domainObject.TopMenu.Select(x => new MenuItemModel(x)).ToList(); - SideMenu = domainObject.SideMenu.Select(x => new MenuItemModel(x)).ToList(); + Header = new HeaderModel(l10n.Header); + Settings = new SettingsModel(l10n.Settings); - HomePage = new HomePageModel(domainObject.HomePage); + Routes = l10n.Routes.Select(x => new RouteModel(x)).ToList(); + AdminRoutes = l10n.AdminRoutes.Select(x => new RouteModel(x)).ToList(); + ServiceRoutes = l10n.ServiceRoutes.Select(x => new RouteModel(x)).ToList(); - ShopCatalog = new ShopCatalogPageModel(domainObject.ShopCatalog); - ShopItem = new ShopItemPageModel(domainObject.ShopItem); - ShopCart = new ShopCartPageModel(domainObject.ShopCart); - ShopCheckout = new ShopCheckoutPageModel(domainObject.ShopCheckout); + TopMenu = l10n.TopMenu.Select(x => new MenuItemModel(x)).ToList(); + SideMenu = l10n.SideMenu.Select(x => new MenuItemModel(x)).ToList(); - BlogCatalog = new BlogCatalogPageModel(domainObject.BlogCatalog); - BlogItem = new BlogItemPageModel(domainObject.BlogItem); + HomePage = new HomePageModel(l10n.HomePage); - SignIn = new SignInPageModel(domainObject.SignIn); - SignUp = new SignUpPageModel(domainObject.SignUp); + ShopCatalog = new ShopCatalogPageModel(l10n.ShopCatalog); + ShopItem = new ShopItemPageModel(l10n.ShopItem); + ShopCart = new ShopCartPageModel(l10n.ShopCart); + ShopCheckout = new ShopCheckoutPageModel(l10n.ShopCheckout); + + BlogCatalog = new BlogCatalogPageModel(l10n.BlogCatalog); + BlogItem = new BlogItemPageModel(l10n.BlogItem); + + SignIn = new SignInPageModel(l10n.SignIn); + SignUp = new SignUpPageModel(l10n.SignUp); } } } diff --git a/src/WeatherForecast/Models/Shop/Requests/PostShopItemRequestModel.cs b/src/WeatherForecast/Models/Shop/Requests/PostShopItemRequestModel.cs index 8d62c1c..42edf66 100644 --- a/src/WeatherForecast/Models/Shop/Requests/PostShopItemRequestModel.cs +++ b/src/WeatherForecast/Models/Shop/Requests/PostShopItemRequestModel.cs @@ -7,6 +7,7 @@ using DomainObjects; using Core.Enumerations; using Core.Abstractions.Models; +using DomainObjects.Abstractions.Posts.L10n; namespace WeatherForecast.Models.Requests { diff --git a/src/WeatherForecast/Models/Shop/Requests/PutShopItemRequestModel.cs b/src/WeatherForecast/Models/Shop/Requests/PutShopItemRequestModel.cs index affc086..acf6e1a 100644 --- a/src/WeatherForecast/Models/Shop/Requests/PutShopItemRequestModel.cs +++ b/src/WeatherForecast/Models/Shop/Requests/PutShopItemRequestModel.cs @@ -9,6 +9,7 @@ using Core.Enumerations; using Core.Abstractions.Models; using Core.Abstractions; using System.Collections.Generic; +using DomainObjects.Abstractions.Posts.L10n; namespace WeatherForecast.Models.Requests { diff --git a/src/WeatherForecast/Models/Shop/Responses/GetShopItemResponseModel.cs b/src/WeatherForecast/Models/Shop/Responses/GetShopItemResponseModel.cs index 54ef6d5..c60a173 100644 --- a/src/WeatherForecast/Models/Shop/Responses/GetShopItemResponseModel.cs +++ b/src/WeatherForecast/Models/Shop/Responses/GetShopItemResponseModel.cs @@ -1,6 +1,7 @@ using Core.Abstractions.Models; using Core.Enumerations; using DomainObjects; +using DomainObjects.Abstractions.Posts.L10n; using DomainObjects.Documents.Categories; using DomainObjects.Documents.Categories.L10n; using DomainObjects.Documents.Posts; @@ -11,13 +12,14 @@ using DomainObjects.L10n; using WeatherForecast.Models.Blog.Responses; -namespace WeatherForecast.Models.Shop.Responses { +namespace WeatherForecast.Models.Shop.Responses +{ - #region Media attachment - /// - /// - /// - public class GetShopItemMediaAttachmentL10nResponseModel { + #region Media attachment + /// + /// + /// + public class GetShopItemMediaAttachmentL10nResponseModel { /// /// /// diff --git a/src/WeatherForecast/Models/ShopCart/Responses/GetShopCartItemResponseModel.cs b/src/WeatherForecast/Models/ShopCart/Responses/GetShopCartItemResponseModel.cs index dadb165..0645d5f 100644 --- a/src/WeatherForecast/Models/ShopCart/Responses/GetShopCartItemResponseModel.cs +++ b/src/WeatherForecast/Models/ShopCart/Responses/GetShopCartItemResponseModel.cs @@ -1,18 +1,20 @@ using Core.Abstractions.Models; using Core.Enumerations; using DomainObjects; +using DomainObjects.Abstractions.Posts.L10n; using DomainObjects.Documents; using DomainObjects.Documents.Posts; using DomainObjects.Enumerations; using DomainObjects.L10n; -namespace WeatherForecast.Models.ShopCart.Responses { +namespace WeatherForecast.Models.ShopCart.Responses +{ - /// - /// - /// - public class GetShopCartItemMediaAttachmentL10nModel : ResponseModelBase { + /// + /// + /// + public class GetShopCartItemMediaAttachmentL10nModel : ResponseModelBase { /// /// diff --git a/src/WeatherForecast/Services/ContentService.cs b/src/WeatherForecast/Services/ContentService.cs index 90061ce..5e4cc24 100644 --- a/src/WeatherForecast/Services/ContentService.cs +++ b/src/WeatherForecast/Services/ContentService.cs @@ -52,7 +52,8 @@ namespace WeatherForecast.Services { if (!result.IsSuccess || content == null) return (null, result); - return IDomainResult.Success(new GetContentResponseModel(content.Single(x => x.Localization.Locale == requestData.Locale))); + + return IDomainResult.Success(new GetContentResponseModel(content, requestData.Locale)); } } } diff --git a/src/WeatherForecast/Services/ImageService.cs b/src/WeatherForecast/Services/ImageService.cs index ee504f6..3217d88 100644 --- a/src/WeatherForecast/Services/ImageService.cs +++ b/src/WeatherForecast/Services/ImageService.cs @@ -170,7 +170,8 @@ namespace WeatherForecast.Services { if (!getContentResult.IsSuccess || content == null) return IDomainResult.Failed(); - var (image, transformResult) = _imageProvider.ResizeAndWatermark(file.Bytes, width, height, FontsEnum.Montserrat, FontStylesEnum.Regular, content.First().SiteName); + // TODO: Get site name + var (image, transformResult) = _imageProvider.ResizeAndWatermark(file.Bytes, width, height, FontsEnum.Montserrat, FontStylesEnum.Regular, "TODO"); if (!transformResult.IsSuccess || image == null) return IDomainResult.Failed(); diff --git a/src/docker-compose.override.yml b/src/docker-compose.override.yml index e5b9457..51fd25d 100644 --- a/src/docker-compose.override.yml +++ b/src/docker-compose.override.yml @@ -110,7 +110,7 @@ services: image: mongo restart: always ports: - - 27018:27017 + - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example diff --git a/src/docker-compose/mongo/data/db/WiredTiger.turtle b/src/docker-compose/mongo/data/db/WiredTiger.turtle index 645d190..ea0bc96 100644 --- a/src/docker-compose/mongo/data/db/WiredTiger.turtle +++ b/src/docker-compose/mongo/data/db/WiredTiger.turtle @@ -3,4 +3,4 @@ WiredTiger 10.0.2: (December 21, 2021) WiredTiger version major=10,minor=0,patch=2 file:WiredTiger.wt -access_pattern_hint=none,allocation_size=4KB,app_metadata=,assert=(commit_timestamp=none,durable_timestamp=none,read_timestamp=none,write_timestamp=off),block_allocation=best,block_compressor=,cache_resident=false,checksum=on,collator=,columns=,dictionary=0,encryption=(keyid=,name=),format=btree,huffman_key=,huffman_value=,id=0,ignore_in_memory_cache_size=false,internal_item_max=0,internal_key_max=0,internal_key_truncate=true,internal_page_max=4KB,key_format=S,key_gap=10,leaf_item_max=0,leaf_key_max=0,leaf_page_max=32KB,leaf_value_max=0,log=(enabled=true),memory_page_image_max=0,memory_page_max=5MB,os_cache_dirty_max=0,os_cache_max=0,prefix_compression=false,prefix_compression_min=4,readonly=false,split_deepen_min_child=0,split_deepen_per_child=0,split_pct=90,tiered_object=false,tiered_storage=(auth_token=,bucket=,bucket_prefix=,cache_directory=,local_retention=300,name=,object_target_size=0),value_format=S,verbose=[],version=(major=1,minor=1),write_timestamp_usage=none,checkpoint=(WiredTigerCheckpoint.128176=(addr="018381e4ba16d6a78481e491b9ee468581e4a61a442c808080e302cfc0e3010fc0",order=128176,time=1685120283,size=81920,newest_start_durable_ts=0,oldest_start_ts=0,newest_txn=12,newest_stop_durable_ts=0,newest_stop_ts=-1,newest_stop_txn=-11,prepare=0,write_gen=385381,run_write_gen=385369)),checkpoint_backup_info=,checkpoint_lsn=(95,7552) +access_pattern_hint=none,allocation_size=4KB,app_metadata=,assert=(commit_timestamp=none,durable_timestamp=none,read_timestamp=none,write_timestamp=off),block_allocation=best,block_compressor=,cache_resident=false,checksum=on,collator=,columns=,dictionary=0,encryption=(keyid=,name=),format=btree,huffman_key=,huffman_value=,id=0,ignore_in_memory_cache_size=false,internal_item_max=0,internal_key_max=0,internal_key_truncate=true,internal_page_max=4KB,key_format=S,key_gap=10,leaf_item_max=0,leaf_key_max=0,leaf_page_max=32KB,leaf_value_max=0,log=(enabled=true),memory_page_image_max=0,memory_page_max=5MB,os_cache_dirty_max=0,os_cache_max=0,prefix_compression=false,prefix_compression_min=4,readonly=false,split_deepen_min_child=0,split_deepen_per_child=0,split_pct=90,tiered_object=false,tiered_storage=(auth_token=,bucket=,bucket_prefix=,cache_directory=,local_retention=300,name=,object_target_size=0),value_format=S,verbose=[],version=(major=1,minor=1),write_timestamp_usage=none,checkpoint=(WiredTigerCheckpoint.129073=(addr="018081e4e7b10cf78181e4228ff9ae8281e4cb791c0e808080e3028fc0e3010fc0",order=129073,time=1685215510,size=81920,newest_start_durable_ts=0,oldest_start_ts=0,newest_txn=270,newest_stop_durable_ts=0,newest_stop_ts=-1,newest_stop_txn=-11,prepare=0,write_gen=388099,run_write_gen=386079)),checkpoint_backup_info=,checkpoint_lsn=(98,494592) diff --git a/src/docker-compose/mongo/data/db/WiredTiger.wt b/src/docker-compose/mongo/data/db/WiredTiger.wt index 66438b2..f3d8e1e 100644 Binary files a/src/docker-compose/mongo/data/db/WiredTiger.wt and b/src/docker-compose/mongo/data/db/WiredTiger.wt differ diff --git a/src/docker-compose/mongo/data/db/collection-2--4715807334585891142.wt b/src/docker-compose/mongo/data/db/collection-2--4715807334585891142.wt index 65c19c5..f4bcbb8 100644 Binary files a/src/docker-compose/mongo/data/db/collection-2--4715807334585891142.wt and b/src/docker-compose/mongo/data/db/collection-2--4715807334585891142.wt differ diff --git a/src/docker-compose/mongo/data/db/collection-4--4715807334585891142.wt b/src/docker-compose/mongo/data/db/collection-4--4715807334585891142.wt index 8eb9cbe..aae3622 100644 Binary files a/src/docker-compose/mongo/data/db/collection-4--4715807334585891142.wt and b/src/docker-compose/mongo/data/db/collection-4--4715807334585891142.wt differ diff --git a/src/docker-compose/mongo/data/db/collection-6--4748285384625290805.wt b/src/docker-compose/mongo/data/db/collection-6--4748285384625290805.wt index 6e5fa29..8bb7489 100644 Binary files a/src/docker-compose/mongo/data/db/collection-6--4748285384625290805.wt and b/src/docker-compose/mongo/data/db/collection-6--4748285384625290805.wt differ diff --git a/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-26T16-53-57Z-00000 b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-26T16-53-57Z-00000 index be15747..1ab09b0 100644 Binary files a/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-26T16-53-57Z-00000 and b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-26T16-53-57Z-00000 differ diff --git a/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-26T17-55-43Z-00000 b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-26T17-55-43Z-00000 new file mode 100644 index 0000000..73b3f25 Binary files /dev/null and b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-26T17-55-43Z-00000 differ diff --git a/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-26T17-56-56Z-00000 b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-26T17-56-56Z-00000 new file mode 100644 index 0000000..863c688 Binary files /dev/null and b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-26T17-56-56Z-00000 differ diff --git a/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-27T08-11-44Z-00000 b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-27T08-11-44Z-00000 new file mode 100644 index 0000000..8b2ec80 Binary files /dev/null and b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-05-27T08-11-44Z-00000 differ diff --git a/src/docker-compose/mongo/data/db/diagnostic.data/metrics.interim b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.interim index c8d3c73..481207a 100644 Binary files a/src/docker-compose/mongo/data/db/diagnostic.data/metrics.interim and b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.interim differ diff --git a/src/docker-compose/mongo/data/db/index-3--4715807334585891142.wt b/src/docker-compose/mongo/data/db/index-3--4715807334585891142.wt index e8d0b68..f28fa74 100644 Binary files a/src/docker-compose/mongo/data/db/index-3--4715807334585891142.wt and b/src/docker-compose/mongo/data/db/index-3--4715807334585891142.wt differ diff --git a/src/docker-compose/mongo/data/db/index-5--4715807334585891142.wt b/src/docker-compose/mongo/data/db/index-5--4715807334585891142.wt index a68af13..a25094d 100644 Binary files a/src/docker-compose/mongo/data/db/index-5--4715807334585891142.wt and b/src/docker-compose/mongo/data/db/index-5--4715807334585891142.wt differ diff --git a/src/docker-compose/mongo/data/db/index-6--4715807334585891142.wt b/src/docker-compose/mongo/data/db/index-6--4715807334585891142.wt index 5726175..a7c6f04 100644 Binary files a/src/docker-compose/mongo/data/db/index-6--4715807334585891142.wt and b/src/docker-compose/mongo/data/db/index-6--4715807334585891142.wt differ diff --git a/src/docker-compose/mongo/data/db/index-7--4748285384625290805.wt b/src/docker-compose/mongo/data/db/index-7--4748285384625290805.wt index d9506f3..7ee3bc9 100644 Binary files a/src/docker-compose/mongo/data/db/index-7--4748285384625290805.wt and b/src/docker-compose/mongo/data/db/index-7--4748285384625290805.wt differ diff --git a/src/docker-compose/mongo/data/db/journal/WiredTigerLog.0000000095 b/src/docker-compose/mongo/data/db/journal/WiredTigerLog.0000000098 similarity index 99% rename from src/docker-compose/mongo/data/db/journal/WiredTigerLog.0000000095 rename to src/docker-compose/mongo/data/db/journal/WiredTigerLog.0000000098 index a638bb2..c2aa94d 100644 Binary files a/src/docker-compose/mongo/data/db/journal/WiredTigerLog.0000000095 and b/src/docker-compose/mongo/data/db/journal/WiredTigerLog.0000000098 differ diff --git a/src/docker-compose/mongo/data/db/sizeStorer.wt b/src/docker-compose/mongo/data/db/sizeStorer.wt index 4e7aae9..6799efa 100644 Binary files a/src/docker-compose/mongo/data/db/sizeStorer.wt and b/src/docker-compose/mongo/data/db/sizeStorer.wt differ