diff --git a/src/ClientApp/.env b/src/ClientApp/.env index 040f640..9493bf6 100644 --- a/src/ClientApp/.env +++ b/src/ClientApp/.env @@ -1,2 +1,35 @@ BROWSER=none -REACT_APP_SITEID=404c8232-9048-4519-bfba-6e78dc7005ca \ No newline at end of file + +REACT_APP_API=https://localhost:7151/api +REACT_APP_SITEID=404c8232-9048-4519-bfba-6e78dc7005ca + +REACT_APP_ACCOUNT=Account + +REACT_APP_BLOGITEM=BlogItem +REACT_APP_BLOGITEMS=BlogItems + +REACT_APP_BLOGITEMS_FEAUTERED=BlogItems/Featured + +REACT_APP_CATEGORYITEM=CategoryItem +REACT_APP_CATEGORYITEMS=CategoryItems + +REACT_APP_CONTENT=Content + +REACT_APP_DKIM=Dkim + +REACT_APP_IMAGE=Image +REACT_APP_IMAGES=Images + +REACT_APP_INITIALIZATION=Initialization + +REACT_APP_SHOPCARTITEM=ShopCartItem +REACT_APP_SHOPCARTITEMS=ShopCartItems + +REACT_APP_SHOPITEM=ShopItem +REACT_APP_SHOPITEMS=ShopItems + +REACT_APP_TEMPLATE=Template + +REACT_APP_UTILS=Utils + +REACT_APP_WeatherForecast=WeatherForecast \ No newline at end of file diff --git a/src/ClientApp/ClientApp.njsproj b/src/ClientApp/ClientApp.njsproj index 0d8451a..9bef263 100644 --- a/src/ClientApp/ClientApp.njsproj +++ b/src/ClientApp/ClientApp.njsproj @@ -37,6 +37,67 @@ Dockerfile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -44,19 +105,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ClientApp/Dockerfile b/src/ClientApp/Dockerfile index b60ef2b..b88171d 100644 --- a/src/ClientApp/Dockerfile +++ b/src/ClientApp/Dockerfile @@ -1,21 +1,19 @@ -#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed. -#For more information, please see https://aka.ms/containercompat - -FROM node:16 AS base +# ==== CONFIGURE ===== +# Use a Node 16 base image +FROM node:16-alpine +# Set the working directory to /app inside the container WORKDIR /app -EXPOSE 80 -EXPOSE 443 - -FROM node:16 AS build -WORKDIR /src -COPY ["ClientApp/package.json", "ClientApp/"] -WORKDIR "/src/ClientApp" +# Copy app files COPY . . -RUN npm install -RUN npm install --location=global react-scripts - -#FROM base AS final -#WORKDIR "/src/ClientApp" -#COPY --from=build /app/publish . - -ENTRYPOINT ["npm", "run", "start"] +# ==== BUILD ===== +# Install dependencies (npm ci makes sure the exact versions in the lockfile gets installed) +RUN npm ci +# Build the app +RUN npm run build +# ==== RUN ======= +# Set the env to "production" +ENV NODE_ENV production +# Expose the port on which the app will be running (3000 is the default that `serve` uses) +EXPOSE 3000 +# Start the app +CMD [ "npx", "serve", "build" ] \ No newline at end of file diff --git a/src/ClientApp/src/App.tsx b/src/ClientApp/src/App.tsx index 69d3b55..e49d34c 100644 --- a/src/ClientApp/src/App.tsx +++ b/src/ClientApp/src/App.tsx @@ -45,7 +45,7 @@ const App = () => { const { content, header, loader } = useSelector((state: ApplicationState) => state) useEffect(() => { - dispatch(settingsActionCreators.requestContent({ searchParams: { locale: "en-US" }})) + dispatch(settingsActionCreators.requestContent()) }, []) useEffect(() => { diff --git a/src/ClientApp/src/pages/Blog/Catalog/index.tsx b/src/ClientApp/src/pages/Blog/Catalog/index.tsx index 76e5513..d47febd 100644 --- a/src/ClientApp/src/pages/Blog/Catalog/index.tsx +++ b/src/ClientApp/src/pages/Blog/Catalog/index.tsx @@ -49,7 +49,7 @@ const FeaturedBlogSection: FC = ({ badges: [], image: { - src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`, alt: "..." }, title: "", @@ -58,7 +58,7 @@ const FeaturedBlogSection: FC = ({ id: "", nickName: "", image: { - src: "https://dummyimage.com/40x40/ced4da/6c757d", + src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." } }, diff --git a/src/ClientApp/src/pages/Home/index.tsx b/src/ClientApp/src/pages/Home/index.tsx index 437f9ad..01c153f 100644 --- a/src/ClientApp/src/pages/Home/index.tsx +++ b/src/ClientApp/src/pages/Home/index.tsx @@ -44,7 +44,7 @@ const TitleSection : FC = ({ -
...
+
...
diff --git a/src/ClientApp/src/pages/Shop/Cart/index.tsx b/src/ClientApp/src/pages/Shop/Cart/index.tsx index e1ca018..82b517c 100644 --- a/src/ClientApp/src/pages/Shop/Cart/index.tsx +++ b/src/ClientApp/src/pages/Shop/Cart/index.tsx @@ -105,7 +105,7 @@ const Cart = () => {
- +

{item.title}

diff --git a/src/ClientApp/src/store/reducers/BlogCatalog.ts b/src/ClientApp/src/store/reducers/BlogCatalog.ts index 7c7f77e..bc619ff 100644 --- a/src/ClientApp/src/store/reducers/BlogCatalog.ts +++ b/src/ClientApp/src/store/reducers/BlogCatalog.ts @@ -22,7 +22,11 @@ type KnownAction = RequestAction | ReceiveAction export const actionCreators = { requestBlogCatalog: (props?: GetBlogCatalogRequestModel): AppThunkAction => (dispatch, getState) => { - Get>('https://localhost:7151/api/BlogCatalog', props?.pathParams, props?.searchParams) + const locale = getState().content?.localization.locale + + const searchParams = {...props?.searchParams, locale} + + Get>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_BLOGITEMS}/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams) .then(response => response) .then(data => { if(data) @@ -42,7 +46,7 @@ const unloadedState: BlogCatalogState = { slug: "demo-post", badges: [ "demo" ], image: { - src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`, alt: "..." }, title: "Lorem ipsum", @@ -52,7 +56,7 @@ const unloadedState: BlogCatalogState = { id: "", nickName: "Admin", image: { - src: "https://dummyimage.com/40x40/ced4da/6c757d", + src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." } }, @@ -66,7 +70,7 @@ const unloadedState: BlogCatalogState = { slug: "demo-post", badges: [ "demo" ], image: { - src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`, alt: "..." }, title: "Lorem ipsum", @@ -76,7 +80,7 @@ const unloadedState: BlogCatalogState = { id: "", nickName: "Admin", image: { - src: "https://dummyimage.com/40x40/ced4da/6c757d", + src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." } }, @@ -90,7 +94,7 @@ const unloadedState: BlogCatalogState = { slug: "demo-post", badges: [ "demo" ], image: { - src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`, alt: "..." }, title: "Lorem ipsum", @@ -100,7 +104,7 @@ const unloadedState: BlogCatalogState = { id: "", nickName: "Admin", image: { - src: "https://dummyimage.com/40x40/ced4da/6c757d", + src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." } }, @@ -114,7 +118,7 @@ const unloadedState: BlogCatalogState = { slug: "demo-post", badges: [ "demo" ], image: { - src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`, alt: "..." }, title: "Lorem ipsum", @@ -124,7 +128,7 @@ const unloadedState: BlogCatalogState = { id: "", nickName: "Admin", image: { - src: "https://dummyimage.com/40x40/ced4da/6c757d", + src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." } }, diff --git a/src/ClientApp/src/store/reducers/BlogCategories.ts b/src/ClientApp/src/store/reducers/BlogCategories.ts index 8d20952..d911186 100644 --- a/src/ClientApp/src/store/reducers/BlogCategories.ts +++ b/src/ClientApp/src/store/reducers/BlogCategories.ts @@ -22,7 +22,11 @@ type KnownAction = RequestAction | ReceiveAction export const actionCreators = { requestBlogCategories: (props?: GetBlogCategoriesRequestModel): AppThunkAction => (dispatch, getState) => { - Get>('https://localhost:7151/api/BlogCategories', props?.pathParams, props?.searchParams) + const locale = getState().content?.localization.locale + + const searchParams = {...props?.searchParams, locale} + + Get>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_CATEGORYITEMS}/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams) .then(response => response) .then(data => { if(data) diff --git a/src/ClientApp/src/store/reducers/BlogFeatured.ts b/src/ClientApp/src/store/reducers/BlogFeatured.ts index 933ce09..12176df 100644 --- a/src/ClientApp/src/store/reducers/BlogFeatured.ts +++ b/src/ClientApp/src/store/reducers/BlogFeatured.ts @@ -24,9 +24,9 @@ export const actionCreators = { const locale = getState().content?.localization.locale - const searchParams = {...props?.pathParams, locale} + const searchParams = {...props?.searchParams, locale} - Get>(`https://localhost:7151/api/BlogItems/Featured/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams) + Get>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_BLOGITEMS_FEAUTERED}/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams) .then(response => response) .then(data => { if(data) @@ -44,7 +44,7 @@ const unloadedState: BlogFeaturedState = { slug: "demo-post", badges: [ "demo" ], image: { - src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`, alt: "..." }, title: "Lorem ipsum", @@ -53,7 +53,7 @@ const unloadedState: BlogFeaturedState = { id: "", nickName: "Admin", image: { - src: "https://dummyimage.com/40x40/ced4da/6c757d", + src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." } }, @@ -68,7 +68,7 @@ const unloadedState: BlogFeaturedState = { slug: "demo-post", badges: [ "demo" ], image: { - src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`, alt: "..." }, title: "Lorem ipsum", @@ -77,7 +77,7 @@ const unloadedState: BlogFeaturedState = { id: "", nickName: "Admin", image: { - src: "https://dummyimage.com/40x40/ced4da/6c757d", + src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." } }, @@ -92,7 +92,7 @@ const unloadedState: BlogFeaturedState = { slug: "demo-post", badges: [ "demo" ], image: { - src: "https://dummyimage.com/850x350/dee2e6/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/850x350/dee2e6/6c757d`, alt: "..." }, title: "Lorem ipsum", @@ -101,7 +101,7 @@ const unloadedState: BlogFeaturedState = { id: "", nickName: "Admin", image: { - src: "https://dummyimage.com/40x40/ced4da/6c757d", + src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." } }, diff --git a/src/ClientApp/src/store/reducers/BlogItem.ts b/src/ClientApp/src/store/reducers/BlogItem.ts index 866183e..8b1fdf6 100644 --- a/src/ClientApp/src/store/reducers/BlogItem.ts +++ b/src/ClientApp/src/store/reducers/BlogItem.ts @@ -22,7 +22,11 @@ type KnownAction = RequestAction | ReceiveAction export const actionCreators = { requestBlogItem: (props?: GetBlogItemRequestModel): AppThunkAction => (dispatch, getState) => { - Get>('https://localhost:7151/api/BlogItem', props?.pathParams, props?.searchParams) + const locale = getState().content?.localization.locale + + const searchParams = {...props?.searchParams, locale} + + Get>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_BLOGITEM}/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams) .then(response => response) .then(data => { if(data) @@ -37,7 +41,7 @@ const unloadedState: BlogItemState = { id: "", slug: "demo-post", image: { - src: "https://dummyimage.com/900x400/ced4da/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/900x400/ced4da/6c757d`, alt: "..." }, badges: [ @@ -56,7 +60,7 @@ const unloadedState: BlogItemState = { id: "", nickName: "Admin", image: { - src: "https://dummyimage.com/40x40/ced4da/6c757d", + src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." } }, @@ -68,7 +72,7 @@ const unloadedState: BlogItemState = { id: "", nickName: "Commenter Name 1", image: { - src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`, alt: "..." } }, @@ -80,7 +84,7 @@ const unloadedState: BlogItemState = { id: "", nickName: "Commenter Name 4", image: { - src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`, alt: "..." } }, @@ -91,7 +95,7 @@ const unloadedState: BlogItemState = { id: "", nickName: "Commenter Name 3", image: { - src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`, alt: "..." } }, @@ -104,7 +108,7 @@ const unloadedState: BlogItemState = { id: "", nickName: "Commenter Name 2", image: { - src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`, alt: "..." } }, diff --git a/src/ClientApp/src/store/reducers/Content.ts b/src/ClientApp/src/store/reducers/Content.ts index bde1757..52ee8bd 100644 --- a/src/ClientApp/src/store/reducers/Content.ts +++ b/src/ClientApp/src/store/reducers/Content.ts @@ -23,7 +23,7 @@ type KnownAction = RequestAction | ReceiveAction; export const actionCreators = { requestContent: (props?: GetContentRequestModel): AppThunkAction => (dispatch, getState) => { - Get>(`https://localhost:7151/api/Content/${process.env.REACT_APP_SITEID}`, props?.pathParams, props?.searchParams) + Get>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_CONTENT}/${process.env.REACT_APP_SITEID}`, props?.pathParams, props?.searchParams) .then(response => response) .then((data) => { if(data) { @@ -142,7 +142,7 @@ const unloadedState: ContentState = { text: "The ClientApp subdirectory is a standard React application based on the create-react-app template. If you open a command prompt in that directory, you can run yarn commands such as yarn test or yarn install.", reviewer: { id: "", - image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." }, fullName: "Admin", position: "CEO, MAKS-IT" } diff --git a/src/ClientApp/src/store/reducers/ShopCart.ts b/src/ClientApp/src/store/reducers/ShopCart.ts index 20e12e5..86e6b2e 100644 --- a/src/ClientApp/src/store/reducers/ShopCart.ts +++ b/src/ClientApp/src/store/reducers/ShopCart.ts @@ -79,7 +79,7 @@ const unloadedState: ShopCartState = { { slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, title: "Shop item title", brandName: "Brand & Name", shortText: "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...", @@ -91,7 +91,7 @@ const unloadedState: ShopCartState = { { slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, title: "Shop item title", brandName: "Brand & Name", shortText: "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...", @@ -103,7 +103,7 @@ const unloadedState: ShopCartState = { { slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, title: "Shop item title", brandName: "Brand & Name", shortText: "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...", diff --git a/src/ClientApp/src/store/reducers/ShopCatalog.ts b/src/ClientApp/src/store/reducers/ShopCatalog.ts index b870545..c1d87bd 100644 --- a/src/ClientApp/src/store/reducers/ShopCatalog.ts +++ b/src/ClientApp/src/store/reducers/ShopCatalog.ts @@ -22,7 +22,11 @@ type KnownAction = RequestAction | ReceiveAction export const actionCreators = { requestShopCatalog: (props?: GetShopCatalogRequestModel): AppThunkAction => (dispatch, getState) => { - Get>('https://localhost:7151/api/ShopCatalog', props?.pathParams, props?.searchParams) + const locale = getState().content?.localization.locale + + const searchParams = { ...props?.searchParams, locale } + + Get>(`${process.env.REACT_APP_API}/Image/${process.env.REACT_APP_SHOPITEMS}/${process.env.REACT_APP_SITEID}`, props?.pathParams, searchParams) .then(response => response) .then(data => { if(data) @@ -41,7 +45,7 @@ const unloadedState: ShopCatalogState = { id: '', slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, badges: [ "sale" ], title: "Shop item title", brandName: "Brand & Name", @@ -50,7 +54,7 @@ const unloadedState: ShopCatalogState = { text: "", author: { id: '', - image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." }, nickName: "Admin" }, created: (new Date).toString(), @@ -65,7 +69,7 @@ const unloadedState: ShopCatalogState = { id: '', slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, badges: [ "sale" ], title: "Shop item title", brandName: "Brand & Name", @@ -74,7 +78,7 @@ const unloadedState: ShopCatalogState = { text: "", author: { id: '', - image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." }, nickName: "Admin" }, created: (new Date).toString(), @@ -89,7 +93,7 @@ const unloadedState: ShopCatalogState = { id: '', slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, badges: [ "sale", "out of stock" ], title: "Shop item title", brandName: "Brand & Name", @@ -98,7 +102,7 @@ const unloadedState: ShopCatalogState = { text: "", author: { id: '', - image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." }, nickName: "Admin" }, created: (new Date).toString(), @@ -113,7 +117,7 @@ const unloadedState: ShopCatalogState = { id: '', slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, badges: [ "sale" ], title: "Shop item title", brandName: "Brand & Name", @@ -122,7 +126,7 @@ const unloadedState: ShopCatalogState = { text: "", author: { id: '', - image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." }, nickName: "Admin" }, created: (new Date).toString(), diff --git a/src/ClientApp/src/store/reducers/ShopFeatured.ts b/src/ClientApp/src/store/reducers/ShopFeatured.ts index 057e5db..80d2ef5 100644 --- a/src/ClientApp/src/store/reducers/ShopFeatured.ts +++ b/src/ClientApp/src/store/reducers/ShopFeatured.ts @@ -39,7 +39,7 @@ const unloadedState: ShopFeaturedState = { id: '', slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, badges: [ "sale" ], title: "Shop item title", brandName: "Brand & Name", @@ -48,7 +48,7 @@ const unloadedState: ShopFeaturedState = { text: "", author: { id: '', - image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." }, nickName: "Admin" }, created: (new Date).toString(), diff --git a/src/ClientApp/src/store/reducers/ShopItem.ts b/src/ClientApp/src/store/reducers/ShopItem.ts index 4bdcf42..318d657 100644 --- a/src/ClientApp/src/store/reducers/ShopItem.ts +++ b/src/ClientApp/src/store/reducers/ShopItem.ts @@ -38,7 +38,7 @@ const unloadedState: ShopItemState = { id: "", slug: "demo-post", image: { - src: "https://dummyimage.com/600x700/dee2e6/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/600x700/dee2e6/6c757d`, alt: "..." }, @@ -56,7 +56,7 @@ const unloadedState: ShopItemState = { id: "", nickName: "Admin", image: { - src: "https://dummyimage.com/40x40/ced4da/6c757d", + src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." } }, @@ -74,7 +74,7 @@ const unloadedState: ShopItemState = { id: "", nickName: "Commenter Name 1", image: { - src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`, alt: "..." } }, @@ -86,7 +86,7 @@ const unloadedState: ShopItemState = { id: "", nickName: "Commenter Name 4", image: { - src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`, alt: "..." } }, @@ -97,7 +97,7 @@ const unloadedState: ShopItemState = { id: "", nickName: "Commenter Name 3", image: { - src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`, alt: "..." } }, @@ -110,7 +110,7 @@ const unloadedState: ShopItemState = { id: "", nickName: "Commenter Name 2", image: { - src: "https://dummyimage.com/50x50/ced4da/6c757d.jpg", + src: `${process.env.REACT_APP_API}/Image/50x50/ced4da/6c757d`, alt: "..." } }, diff --git a/src/ClientApp/src/store/reducers/ShopRelated.ts b/src/ClientApp/src/store/reducers/ShopRelated.ts index 973c2d0..5d228d0 100644 --- a/src/ClientApp/src/store/reducers/ShopRelated.ts +++ b/src/ClientApp/src/store/reducers/ShopRelated.ts @@ -39,7 +39,7 @@ const unloadedState: ShopRelatedState = { id: '', slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, badges: [ "sale", "best offer" ], title: "Shop item title", brandName: "Brand & Name", @@ -48,7 +48,7 @@ const unloadedState: ShopRelatedState = { text: "", author: { id: '', - image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." }, nickName: "Admin" }, created: (new Date).toString(), @@ -63,7 +63,7 @@ const unloadedState: ShopRelatedState = { id: '', slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, badges: [ "sale", "best offer" ], title: "Shop item title", brandName: "Brand & Name", @@ -72,7 +72,7 @@ const unloadedState: ShopRelatedState = { text: "", author: { id: '', - image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." }, nickName: "Admin" }, created: (new Date).toString(), @@ -87,7 +87,7 @@ const unloadedState: ShopRelatedState = { id: '', slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, badges: [ "sale", "best offer" ], title: "Shop item title", brandName: "Brand & Name", @@ -96,7 +96,7 @@ const unloadedState: ShopRelatedState = { text: "", author: { id: '', - image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." }, nickName: "Admin" }, created: (new Date).toString(), @@ -111,7 +111,7 @@ const unloadedState: ShopRelatedState = { id: '', slug: "shop-catalog-item", sku: "SKU-0", - image: { src: "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/450x300/dee2e6/6c757d`, alt: "..." }, badges: [ "sale", "best offer" ], title: "Shop item title", brandName: "Brand & Name", @@ -120,7 +120,7 @@ const unloadedState: ShopRelatedState = { text: "", author: { id: '', - image: { src: "https://dummyimage.com/40x40/ced4da/6c757d", alt: "..." }, + image: { src: `${process.env.REACT_APP_API}/Image/40x40/ced4da/6c757d`, alt: "..." }, nickName: "Admin" }, created: (new Date).toString(), diff --git a/src/DataProviders/Collections/ShopCatalogDataProvider.cs b/src/DataProviders/Collections/ShopCatalogDataProvider.cs index e59014f..003a625 100644 --- a/src/DataProviders/Collections/ShopCatalogDataProvider.cs +++ b/src/DataProviders/Collections/ShopCatalogDataProvider.cs @@ -15,6 +15,7 @@ namespace DataProviders.Collections (ShopDocument?, IDomainResult) GetBySlug(Guid siteId, string slug); (List?, IDomainResult) GetBySlugs(Guid siteId, List slugs); (List?, IDomainResult) GetAll(Guid siteId, int skip, int take); + (int?, IDomainResult) Count(Guid siteId); (Guid?, IDomainResult) Update(ShopDocument shopCart); IDomainResult Delete(Guid id); IDomainResult DeleteAll(Guid siteId); @@ -56,6 +57,11 @@ namespace DataProviders.Collections public (List?, IDomainResult) GetAll(Guid siteId, int skip, int take) => GetWithPredicate(x => x.SiteId == siteId, x => x, skip, take); + public (int?, IDomainResult) Count(Guid siteId) { + var (list, result) = GetWithPredicate(x => x.SiteId == siteId, x => x.Id); + return (list?.Count, result); + } + public (Guid?, IDomainResult) Update(ShopDocument shopCart) => UpdateWithPredicate(shopCart, x => x.Id == shopCart.Id); diff --git a/src/ImageProvider/Extensions/IImageProcessingContextExtensions.cs b/src/ImageProvider/Extensions/IImageProcessingContextExtensions.cs index ef15987..aaad036 100644 --- a/src/ImageProvider/Extensions/IImageProcessingContextExtensions.cs +++ b/src/ImageProvider/Extensions/IImageProcessingContextExtensions.cs @@ -15,53 +15,51 @@ namespace ImageProvider.Extensions { } } - internal static IImageProcessingContext ApplyScalingWaterMarkSimple(this IImageProcessingContext processingContext, - Font font, - string text, - Color color, - float padding) { + private static IImageProcessingContext ApplyScalingWaterMarkSimple(this IImageProcessingContext processingContext, + Font font, + string text, + Color color, + float padding) { Size imgSize = processingContext.GetCurrentSize(); float targetWidth = imgSize.Width - (padding * 2); float targetHeight = imgSize.Height - (padding * 2); - // measure the text size - FontRectangle size = TextMeasurer.Measure(text, new RendererOptions(font)); + // Measure the text size + FontRectangle size = TextMeasurer.Measure(text, new TextOptions(font)); - //find out how much we need to scale the text to fill the space (up or down) - float scalingFactor = Math.Min(imgSize.Width / size.Width, imgSize.Height / size.Height); + // Find out how much we need to scale the text to fill the space (up or down) + float scalingFactor = Math.Min(targetWidth / size.Width, targetHeight / size.Height); - //create a new font + // Create a new font Font scaledFont = new Font(font, scalingFactor * font.Size); var center = new PointF(imgSize.Width / 2, imgSize.Height / 2); - var textGraphicOptions = new TextGraphicsOptions() { - TextOptions = { - HorizontalAlignment = HorizontalAlignment.Center, - VerticalAlignment = VerticalAlignment.Center - } + var textOptions = new TextOptions(scaledFont) { + Origin = center, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center }; - return processingContext.DrawText(textGraphicOptions, text, scaledFont, color, center); + return processingContext.DrawText(textOptions, text, color); } - internal static IImageProcessingContext ApplyScalingWaterMarkWordWrap(this IImageProcessingContext processingContext, - Font font, - string text, - Color color, - float padding) { + private static IImageProcessingContext ApplyScalingWaterMarkWordWrap(this IImageProcessingContext processingContext, + Font font, + string text, + Color color, + float padding) { Size imgSize = processingContext.GetCurrentSize(); float targetWidth = imgSize.Width - (padding * 2); float targetHeight = imgSize.Height - (padding * 2); - float targetMinHeight = imgSize.Height - (padding * 3); // must be with in a margin width of the target height + float targetMinHeight = imgSize.Height - (padding * 3); // Must be with in a margin width of the target height - // now we are working i 2 dimensions at once and can't just scale because it will cause the text to + // Now we are working in 2 dimensions at once and can't just scale because it will cause the text to // reflow we need to just try multiple times - var scaledFont = font; FontRectangle s = new FontRectangle(0, 0, float.MaxValue, float.MaxValue); - float scaleFactor = (scaledFont.Size / 2); // every time we change direction we half this size + float scaleFactor = (scaledFont.Size / 2); // Every time we change direction we half this size int trapCount = (int)scaledFont.Size * 2; if (trapCount < 10) { trapCount = 10; @@ -72,7 +70,7 @@ namespace ImageProvider.Extensions { while ((s.Height > targetHeight || s.Height < targetMinHeight) && trapCount > 0) { if (s.Height > targetHeight) { if (isTooSmall) { - scaleFactor = scaleFactor / 2; + scaleFactor /= 2; } scaledFont = new Font(scaledFont, scaledFont.Size - scaleFactor); @@ -81,27 +79,26 @@ namespace ImageProvider.Extensions { if (s.Height < targetMinHeight) { if (!isTooSmall) { - scaleFactor = scaleFactor / 2; + scaleFactor /= 2; } scaledFont = new Font(scaledFont, scaledFont.Size + scaleFactor); isTooSmall = true; } trapCount--; - s = TextMeasurer.Measure(text, new RendererOptions(scaledFont) { - WrappingWidth = targetWidth + s = TextMeasurer.Measure(text, new TextOptions(scaledFont) { + WrappingLength = targetWidth }); } var center = new PointF(padding, imgSize.Height / 2); - var textGraphicOptions = new TextGraphicsOptions() { - TextOptions = { - HorizontalAlignment = HorizontalAlignment.Left, - VerticalAlignment = VerticalAlignment.Center, - WrapTextWidth = targetWidth - } + var textOptions = new TextOptions(scaledFont) { + Origin = center, + HorizontalAlignment = HorizontalAlignment.Left, + VerticalAlignment = VerticalAlignment.Center, + WrappingLength = targetWidth }; - return processingContext.DrawText(textGraphicOptions, text, scaledFont, color, center); + return processingContext.DrawText(textOptions, text, color); } } } diff --git a/src/ImageProvider/Extensions/ServiceCollectionExtensions.cs b/src/ImageProvider/Extensions/ServiceCollectionExtensions.cs index f31c6b2..489efd3 100644 --- a/src/ImageProvider/Extensions/ServiceCollectionExtensions.cs +++ b/src/ImageProvider/Extensions/ServiceCollectionExtensions.cs @@ -9,7 +9,7 @@ namespace ImageProvider.Extensions { var fontCollection = new FontCollection(); foreach (var font in Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Fonts"), "*.ttf", SearchOption.AllDirectories)) - fontCollection.Install(font); + fontCollection.Add(font); return fontCollection; }); diff --git a/src/ImageProvider/ImageProvider.cs b/src/ImageProvider/ImageProvider.cs index e6fef6e..86e7a85 100644 --- a/src/ImageProvider/ImageProvider.cs +++ b/src/ImageProvider/ImageProvider.cs @@ -2,12 +2,17 @@ using ImageProvider.Fonts; using Microsoft.Extensions.Logging; using SixLabors.Fonts; +using SixLabors.ImageSharp.Drawing.Processing; +using SixLabors.ImageSharp.Drawing; +using static System.Net.Mime.MediaTypeNames; +using ImageProvider.Extensions; namespace ImageProvider { public interface IImageProvider { (byte[]?, IDomainResult) Resize(byte[] bytes, int width, int height); (byte[]?, IDomainResult) ResizeAndWatermark(byte[] bytes, int width, int height, FontsEnum fontName, FontStylesEnum fontStyle, string text); + (byte[]?, IDomainResult) CreatePlaceholder(int width, int height, string background, string foreground); } public class ImageProvider : IImageProvider { @@ -60,5 +65,34 @@ namespace ImageProvider { return IDomainResult.Failed(); } } + + public (byte[]?, IDomainResult) CreatePlaceholder(int width, int height, string backgroundHex, string foregroundHex) { + + var font = _fontCollection.Families.Single(x => x.Name == FontsEnum.Montserrat.Name) + .CreateFont(10, FontStyle.Regular); + + using var image = new Image(width, height); + + if (!Color.TryParseHex(backgroundHex, out Color backgroundColor)) + backgroundColor = Color.Gray; + + + if (!Color.TryParseHex(foregroundHex, out Color foregroundColor)) + foregroundColor = Color.White; + + image.Mutate(ctx => { + ctx.BackgroundColor(backgroundColor); + ctx.ApplyScalingWaterMark(font, $"{width}x{height}", foregroundColor, 5, false); + //x.Fill(, new Rectangle(0, 0, width, height)); + //x.DrawText($"{width}x{height}", font, Color.Black, new PointF(10, 10)); + }); + + using var stream = new MemoryStream(); + + image.SaveAsJpeg(stream); + + + return IDomainResult.Success(stream.ToArray()); + } } } diff --git a/src/ImageProvider/ImageProvider.csproj b/src/ImageProvider/ImageProvider.csproj index 9eceb1d..7ab00b4 100644 --- a/src/ImageProvider/ImageProvider.csproj +++ b/src/ImageProvider/ImageProvider.csproj @@ -10,9 +10,9 @@ - - - + + + diff --git a/src/WeatherForecast/Controllers/ImageController.cs b/src/WeatherForecast/Controllers/ImageController.cs index 7c12400..f76d201 100644 --- a/src/WeatherForecast/Controllers/ImageController.cs +++ b/src/WeatherForecast/Controllers/ImageController.cs @@ -9,7 +9,6 @@ using DomainResults.Common; using WeatherForecast.Policies; using DomainObjects.Documents.Users; using WeatherForecast.Controllers.Abstractions; -using static System.Net.WebRequestMethods; namespace WeatherForecast.Controllers; @@ -146,6 +145,33 @@ public class ImageController : AuthorizationControllerBase { FileDownloadName = file.Name }; } + + + /// + /// Site wide + /// + /// Allowed everyone + /// + /// + /// + /// + /// + /// + /// + /// + [HttpGet("{width}x{height}/{background}/{foreground}")] + public IActionResult Get([FromRoute] int width, [FromRoute] int height, [FromRoute] string background, [FromRoute] string foreground) { + + var (file, result) = _imageService.Get(width, height, background, foreground); + + if (!result.IsSuccess || file == null) + return result.ToActionResult(); + + var stream = new MemoryStream(file.Bytes); + return new FileStreamResult(stream, file.ContentType) { + FileDownloadName = file.Name + }; + } #endregion #region Update diff --git a/src/WeatherForecast/Models/Cetegories/Requests/GetCategoryItemsLocalizedRequestModel.cs b/src/WeatherForecast/Models/Cetegories/Requests/GetCategoryItemsLocalizedRequestModel.cs index 40d7d9b..bf9006d 100644 --- a/src/WeatherForecast/Models/Cetegories/Requests/GetCategoryItemsLocalizedRequestModel.cs +++ b/src/WeatherForecast/Models/Cetegories/Requests/GetCategoryItemsLocalizedRequestModel.cs @@ -32,10 +32,10 @@ namespace WeatherForecast.Models.Cetegories.Requests { /// public IEnumerable Validate(ValidationContext validationContext) { - if (CurrentPage > 0) + if (CurrentPage < 1) yield return new ValidationResult($"{Errors.WrongOrNotManaged} {nameof(CurrentPage)}"); - if (ItemsPerPage > 0) + if (ItemsPerPage < 1) yield return new ValidationResult($"{Errors.WrongOrNotManaged} {nameof(ItemsPerPage)}"); if (Locale == Locales.Unknown) diff --git a/src/WeatherForecast/Services/ImageService.cs b/src/WeatherForecast/Services/ImageService.cs index 02a71e8..ee504f6 100644 --- a/src/WeatherForecast/Services/ImageService.cs +++ b/src/WeatherForecast/Services/ImageService.cs @@ -11,6 +11,8 @@ using Core.Abstractions; using WeatherForecast.Models.Images.Responses; using Microsoft.AspNetCore.Mvc; using DomainObjects.Documents.Users; +using Org.BouncyCastle.Bcpg.OpenPgp; +using DomainObjects.Documents.Sites; namespace WeatherForecast.Services { @@ -42,6 +44,16 @@ namespace WeatherForecast.Services { /// (GetImageResponseModel?, IDomainResult) Get([FromRoute] Guid siteId, [FromRoute] Guid? userId, [FromRoute] Guid fileId); + /// + /// + /// + /// + /// + /// + /// + /// + (GetImageResponseModel?, IDomainResult) Get(int width, int height, string background, string foreground); + /// /// /// @@ -174,6 +186,26 @@ namespace WeatherForecast.Services { } + /// + /// + /// + /// + /// + /// + /// + /// + public (GetImageResponseModel?, IDomainResult) Get(int width, int height, string background, string foreground) { + var (file, downloadResult) = _imageProvider.CreatePlaceholder(width, height, background, foreground); + if (!downloadResult.IsSuccess || file == null) + return (null, downloadResult); + + return IDomainResult.Success(new GetImageResponseModel() { + Name = "Dummy.jpg", + Bytes = file, + ContentType = "image/jpeg" + }); + } + /// /// /// diff --git a/src/WeatherForecast/Services/ShopCartItemsService.cs b/src/WeatherForecast/Services/ShopCartItemsService.cs index c6a045a..ac94afd 100644 --- a/src/WeatherForecast/Services/ShopCartItemsService.cs +++ b/src/WeatherForecast/Services/ShopCartItemsService.cs @@ -7,6 +7,7 @@ using DomainObjects.Documents; using DomainObjects.Enumerations; using WeatherForecast.Models.ShopCart.Requests; using WeatherForecast.Models.ShopCart.Responses; +using DomainObjects.Documents.Sites; namespace WeatherForecast.Services { @@ -55,7 +56,16 @@ namespace WeatherForecast.Services /// /// public (List?, IDomainResult) Get(List cartItems, GetShopCartItemsLocalizedRequestModel requestData) { - + + //var (count, getCountResult) = _shopCatalogDataProvider.Count(siteId); + //if (!getCountResult.IsSuccess || count == null) + // return (null, getCountResult); + + //var skip = (requestData.CurrentPage - 1) * requestData.ItemsPerPage; + //var take = requestData.ItemsPerPage; + + //var totalPages = (int)Math.Ceiling((decimal)count / take); + var items = new List(); foreach (var cartItem in cartItems) { var (item, result) = _shopCatalogDataProvider.Get(cartItem.Id, cartItem.Sku); diff --git a/src/WeatherForecast/Services/ShopItemsService.cs b/src/WeatherForecast/Services/ShopItemsService.cs index 830da10..c7e5832 100644 --- a/src/WeatherForecast/Services/ShopItemsService.cs +++ b/src/WeatherForecast/Services/ShopItemsService.cs @@ -65,27 +65,35 @@ namespace WeatherForecast.Services { /// public (GetShopItemsLocalizedResponseModel?, IDomainResult) Get(Guid siteId, GetShopItemsLocalizedRequestModel requestData) { try { - var (items, result) = _shopCatalogDataProvider.GetAll(siteId, (requestData.CurrentPage - 1) * requestData.ItemsPerPage, requestData.ItemsPerPage); + var (count, getCountResult) = _shopCatalogDataProvider.Count(siteId); + if (!getCountResult.IsSuccess || count == null) + return (null, getCountResult); - if (!result.IsSuccess || items == null) - return (null, result); + var skip = (requestData.CurrentPage - 1) * requestData.ItemsPerPage; + var take = requestData.ItemsPerPage; - var shopItems = new List(); - foreach (var item in items) { + var totalPages = (int)Math.Ceiling((decimal)count / take); - var (categories, getCategoryResult) = _categoryDataProvider.GetMany(siteId, item.Categories); + var (shopItems, getShopItemsResult) = _shopCatalogDataProvider.GetAll(siteId, skip, take); + if (!getShopItemsResult.IsSuccess || shopItems == null) + return (null, getShopItemsResult); + + var result = new List(); + foreach (var shopItem in shopItems) { + + var (categories, getCategoryResult) = _categoryDataProvider.GetMany(siteId, shopItem.Categories); if (!getCategoryResult.IsSuccess || categories == null) return IDomainResult.Failed(); - var (author, getAuthor) = _userDataProvider.Get(item.Author); + var (author, getAuthor) = _userDataProvider.Get(shopItem.Author); if (!getAuthor.IsSuccess || author == null) return IDomainResult.Failed(); - shopItems.Add(new GetShopItemLocalizedResponseModel(item, categories, author, requestData.Locale)); + result.Add(new GetShopItemLocalizedResponseModel(shopItem, categories, author, requestData.Locale)); } - return shopItems.Count > 0 - ? IDomainResult.Success(new GetShopItemsLocalizedResponseModel(requestData.CurrentPage, 0, shopItems)) + return result.Count > 0 + ? IDomainResult.Success(new GetShopItemsLocalizedResponseModel(requestData.CurrentPage, totalPages, result)) : IDomainResult.NotFound(); } catch (Exception ex) { diff --git a/src/WeatherForecast/WeatherForecast.csproj b/src/WeatherForecast/WeatherForecast.csproj index 8911ed4..279f5a6 100644 --- a/src/WeatherForecast/WeatherForecast.csproj +++ b/src/WeatherForecast/WeatherForecast.csproj @@ -24,11 +24,11 @@ - - - - - + + + + + diff --git a/src/docker-compose.override.yml b/src/docker-compose.override.yml index e3ce710..77b6eec 100644 --- a/src/docker-compose.override.yml +++ b/src/docker-compose.override.yml @@ -31,6 +31,14 @@ services: networks: - "my-network" + #clientapp: + # environment: + # - ASPNETCORE_ENVIRONMENT=Development + # ports: + # - "3000:3000" + # networks: + # - "my-network" + mongo: image: mongo restart: always diff --git a/src/docker-compose.yml b/src/docker-compose.yml index b6cc30d..dc5fa0e 100644 --- a/src/docker-compose.yml +++ b/src/docker-compose.yml @@ -11,4 +11,9 @@ services: build: context: . dockerfile: ReverseProxy/Dockerfile + #clientapp: + # image: ${DOCKER_REGISTRY-}clientapp + # build: + # context: . + # dockerfile: ClientApp/Dockerfile diff --git a/src/docker-compose/mongo/data/db/WiredTiger.turtle b/src/docker-compose/mongo/data/db/WiredTiger.turtle index 0f7a5bb..226b4c3 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.123211=(addr="018081e4f52354c18181e493d377368281e4a22aa0f5808080e301ffc0e3010fc0",order=123211,time=1679862041,size=81920,newest_start_durable_ts=0,oldest_start_ts=0,newest_txn=154,newest_stop_durable_ts=0,newest_stop_ts=-1,newest_stop_txn=-11,prepare=0,write_gen=370276,run_write_gen=370143)),checkpoint_backup_info=,checkpoint_lsn=(70,62976) +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.124102=(addr="018381e487d81b1f8481e4bf0e4b478581e4ba5850aa808080e301ffc0e3010fc0",order=124102,time=1680030284,size=81920,newest_start_durable_ts=0,oldest_start_ts=0,newest_txn=29,newest_stop_durable_ts=0,newest_stop_ts=-1,newest_stop_txn=-11,prepare=0,write_gen=372999,run_write_gen=372970)),checkpoint_backup_info=,checkpoint_lsn=(73,16000) diff --git a/src/docker-compose/mongo/data/db/WiredTiger.wt b/src/docker-compose/mongo/data/db/WiredTiger.wt index 63bbedd..d1d8f79 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 ad024d4..f0aa21b 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 f7c1c00..ae5546c 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/diagnostic.data/metrics.2023-03-27T17-19-07Z-00000 b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-03-27T17-19-07Z-00000 new file mode 100644 index 0000000..baeb2e1 Binary files /dev/null and b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-03-27T17-19-07Z-00000 differ diff --git a/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-03-28T08-06-31Z-00000 b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-03-28T08-06-31Z-00000 new file mode 100644 index 0000000..d100c2b Binary files /dev/null and b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-03-28T08-06-31Z-00000 differ diff --git a/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-03-28T18-55-45Z-00000 b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-03-28T18-55-45Z-00000 new file mode 100644 index 0000000..5da2a89 Binary files /dev/null and b/src/docker-compose/mongo/data/db/diagnostic.data/metrics.2023-03-28T18-55-45Z-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 03b9bf0..cbdfe7d 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 b068ede..6f5d1ce 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 b1269e7..e129422 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 64cd141..0b2c9e8 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/journal/WiredTigerLog.0000000070 b/src/docker-compose/mongo/data/db/journal/WiredTigerLog.0000000073 similarity index 99% rename from src/docker-compose/mongo/data/db/journal/WiredTigerLog.0000000070 rename to src/docker-compose/mongo/data/db/journal/WiredTigerLog.0000000073 index b7f8d62..aaacc05 100644 Binary files a/src/docker-compose/mongo/data/db/journal/WiredTigerLog.0000000070 and b/src/docker-compose/mongo/data/db/journal/WiredTigerLog.0000000073 differ diff --git a/src/docker-compose/mongo/data/db/sizeStorer.wt b/src/docker-compose/mongo/data/db/sizeStorer.wt index 715ba7d..b25e0e0 100644 Binary files a/src/docker-compose/mongo/data/db/sizeStorer.wt and b/src/docker-compose/mongo/data/db/sizeStorer.wt differ diff --git a/src/launchSettings.json b/src/launchSettings.json index 3045b6f..81f2c0a 100644 --- a/src/launchSettings.json +++ b/src/launchSettings.json @@ -4,7 +4,11 @@ "commandName": "DockerCompose", "commandVersion": "1.0", "serviceActions": { - "weatherforecast": "StartDebugging" + "mongo": "StartWithoutDebugging", + "mongo-express": "StartWithoutDebugging", + "reverseproxy": "StartWithoutDebugging", + "weatherforecast": "StartDebugging", + // "clientapp": "StartDebugging" } } }