From 0fae6259135f7e8e4be2876b97b72abe46f63ac7 Mon Sep 17 00:00:00 2001 From: behnamrhp Date: Sat, 20 May 2023 16:20:37 +0300 Subject: [PATCH] [FEAT]: add get users logic --- .env.development | 3 +- prettierrc.json => .prettierrc.json | 0 .../core/places/common/model/placesModel.ts | 33 ++++++----------- .../data/response-object/getPlacesRO.ts | 24 +++++++------ .../data/response-object/protocols.ts | 13 +++---- .../places/get-places/infra/getPlacesInfra.ts | 7 ++-- .../core/places/get-places/infra/protocols.ts | 3 ++ .../core/places/get-places/port.ts | 4 ++- .../users/common/data/model/usersModel.ts | 21 +++++++++++ .../core/users/common/entity/entity.ts | 6 ++++ .../get-users/data/repository/IGetUserRepo.ts | 5 +++ .../get-users/data/repository/getUserRepo.ts | 16 +++++++++ .../data/response-object/protocols.ts | 18 ++++++++++ .../get-users/data/response-object/usersRO.ts | 16 +++++++++ .../core/users/get-users/index.ts | 3 ++ .../users/get-users/infra/getUsersInfra.ts | 15 ++++++++ .../core/users/get-users/infra/protocols.ts | 8 +++++ .../get-users/usecase/getUsersUsecase.ts | 21 +++++++++++ .../get-places-adapter/getPlacesAdapter.ts | 9 +++-- .../adapters/get-places-adapter/protocols.ts | 3 ++ .../boundaries/http-boundary/httpBoundary.ts | 11 +++--- .../boundaries/state-management/index.ts | 3 ++ .../stateManagementProvider.ts | 6 ++++ .../stateManagementService.ts | 26 ++++++++++++++ .../state-management/swrBoundary.ts | 15 ++++++++ .../utils/components/loading/Loading.tsx | 13 +++++++ .../utils/components/loading/style.module.css | 35 +++++++++++++++++++ src/driven/utils/configs/appConfig.ts | 3 +- src/driven/utils/constants/envs.ts | 3 +- .../core/places-list/infra/PlacesList.tsx | 33 ++++++++++++++++- .../core/places-list/model/placesListModel.ts | 10 ++++++ .../core/places-list/model/protocols.ts | 6 ++++ .../core/places-list/view/PlacesListView.tsx | 12 +++++-- .../core/places-list/view/protocols.ts | 7 ++++ .../places-list/viewmodel/placesListVM.ts | 13 ++++++- .../core/places-list/viewmodel/protocols.ts | 6 ++++ 36 files changed, 369 insertions(+), 61 deletions(-) rename prettierrc.json => .prettierrc.json (100%) create mode 100644 src/business-logic/core/users/common/data/model/usersModel.ts create mode 100644 src/business-logic/core/users/common/entity/entity.ts create mode 100644 src/business-logic/core/users/get-users/data/repository/IGetUserRepo.ts create mode 100644 src/business-logic/core/users/get-users/data/repository/getUserRepo.ts create mode 100644 src/business-logic/core/users/get-users/data/response-object/protocols.ts create mode 100644 src/business-logic/core/users/get-users/data/response-object/usersRO.ts create mode 100644 src/business-logic/core/users/get-users/index.ts create mode 100644 src/business-logic/core/users/get-users/infra/getUsersInfra.ts create mode 100644 src/business-logic/core/users/get-users/infra/protocols.ts create mode 100644 src/business-logic/core/users/get-users/usecase/getUsersUsecase.ts create mode 100644 src/driven/adapters/get-places-adapter/protocols.ts create mode 100644 src/driven/boundaries/state-management/index.ts create mode 100644 src/driven/boundaries/state-management/stateManagementProvider.ts create mode 100644 src/driven/boundaries/state-management/stateManagementService.ts create mode 100644 src/driven/boundaries/state-management/swrBoundary.ts create mode 100644 src/driven/utils/components/loading/Loading.tsx create mode 100644 src/driven/utils/components/loading/style.module.css create mode 100644 src/driving/application/core/places-list/model/placesListModel.ts create mode 100644 src/driving/application/core/places-list/model/protocols.ts diff --git a/.env.development b/.env.development index 5c284d0..6d34599 100644 --- a/.env.development +++ b/.env.development @@ -1,2 +1,3 @@ VITE_API_ORIGIN = http://176.53.196.42:6001/api/v1 -VITE_API_PLACES = /place \ No newline at end of file +VITE_API_PLACES = /place +VITE_API_USERS = /profile \ No newline at end of file diff --git a/prettierrc.json b/.prettierrc.json similarity index 100% rename from prettierrc.json rename to .prettierrc.json diff --git a/src/business-logic/core/places/common/model/placesModel.ts b/src/business-logic/core/places/common/model/placesModel.ts index a5d7416..8c19d54 100644 --- a/src/business-logic/core/places/common/model/placesModel.ts +++ b/src/business-logic/core/places/common/model/placesModel.ts @@ -1,33 +1,20 @@ import Places from "../entity/placeEntity"; class PlacesModel { - private placeType: string; + private placesList: Places[]; - private name: string; + private modelTitle = "places"; - private qr: null; - - private id: string; - - private parentId: string | null; - - constructor(store: Places) { - const { id, name, parentId, placeType, qr } = store; - this.parentId = parentId; - this.id = id; - this.qr = qr; - this.name = name; - this.placeType = placeType; + constructor(data: Places[]) { + this.placesList = data; } - getData(): Places { - return { - id: this.id, - name: this.name, - parentId: this.parentId, - placeType: this.placeType, - qr: this.qr, - }; + getData(): Places[] { + return this.placesList; + } + + getTitle(): string { + return this.modelTitle; } } diff --git a/src/business-logic/core/places/get-places/data/response-object/getPlacesRO.ts b/src/business-logic/core/places/get-places/data/response-object/getPlacesRO.ts index 278bc88..8e05296 100644 --- a/src/business-logic/core/places/get-places/data/response-object/getPlacesRO.ts +++ b/src/business-logic/core/places/get-places/data/response-object/getPlacesRO.ts @@ -1,15 +1,19 @@ /* eslint-disable no-underscore-dangle */ import { GetPlacesRO, GetPlacesResponse } from "./protocols"; -const getPlacesRO = (placeResponse: GetPlacesResponse): GetPlacesRO => ({ - id: placeResponse._id, - placeType: placeResponse.place_type, - name: placeResponse.name, - parentId: placeResponse.place_type, - availableServices: placeResponse.available_services, - createdAt: placeResponse.createdAt, - updatedAt: placeResponse.updatedAt, - qr: null, -}); +const getPlacesRO = (placesResponse: GetPlacesResponse): GetPlacesRO => { + return placesResponse.map((placeResponse) => { + return { + id: placeResponse._id, + placeType: placeResponse.place_type, + name: placeResponse.name, + parentId: placeResponse.place_type, + availableServices: placeResponse.available_services, + createdAt: placeResponse.createdAt, + updatedAt: placeResponse.updatedAt, + qr: null, + }; + }); +}; export default getPlacesRO; diff --git a/src/business-logic/core/places/get-places/data/response-object/protocols.ts b/src/business-logic/core/places/get-places/data/response-object/protocols.ts index f0e39bb..f7d4565 100644 --- a/src/business-logic/core/places/get-places/data/response-object/protocols.ts +++ b/src/business-logic/core/places/get-places/data/response-object/protocols.ts @@ -8,10 +8,11 @@ export type GetPlacesResponse = { createdAt: string; updatedAt: string; available_services: string[]; -}; +}[]; -export type GetPlacesRO = Places & { - availableServices: string[]; - createdAt: string; - updatedAt: string; -}; +export type GetPlacesRO = Places[] & + { + availableServices: string[]; + createdAt: string; + updatedAt: string; + }[]; diff --git a/src/business-logic/core/places/get-places/infra/getPlacesInfra.ts b/src/business-logic/core/places/get-places/infra/getPlacesInfra.ts index fca9bb9..de08285 100644 --- a/src/business-logic/core/places/get-places/infra/getPlacesInfra.ts +++ b/src/business-logic/core/places/get-places/infra/getPlacesInfra.ts @@ -1,12 +1,9 @@ -import PlacesModel from "../../common/model/placesModel"; import getPlacesRepo from "../data/repository/GetPlacesRepo"; import IGetPlacesRepo from "../data/repository/IGetPlacesRepo"; import GettingPlacesUsecase from "../usecase/getPlaceUsecase"; -import { IgetPlacesInfra } from "./protocols"; +import { IgetPlacesInfra, getPlacesReturnType } from "./protocols"; -const getPlaces = ({ - httpHandler, -}: IgetPlacesInfra): (() => Promise) => { +const getPlaces = ({ httpHandler }: IgetPlacesInfra): getPlacesReturnType => { // get httpHandler const repository: IGetPlacesRepo = () => getPlacesRepo(httpHandler); // connet usecase and repository diff --git a/src/business-logic/core/places/get-places/infra/protocols.ts b/src/business-logic/core/places/get-places/infra/protocols.ts index c3eb25d..5278451 100644 --- a/src/business-logic/core/places/get-places/infra/protocols.ts +++ b/src/business-logic/core/places/get-places/infra/protocols.ts @@ -1,5 +1,8 @@ +import PlacesModel from "../../common/model/placesModel"; import { GetPlacesResponse } from "../data/response-object/protocols"; export interface IgetPlacesInfra { httpHandler: () => Promise; } + +export type getPlacesReturnType = () => Promise; diff --git a/src/business-logic/core/places/get-places/port.ts b/src/business-logic/core/places/get-places/port.ts index 5c3bc35..35c01de 100644 --- a/src/business-logic/core/places/get-places/port.ts +++ b/src/business-logic/core/places/get-places/port.ts @@ -1,3 +1,5 @@ -import { type IgetPlacesInfra } from "./infra/protocols"; +import { getPlacesReturnType, type IgetPlacesInfra } from "./infra/protocols"; export default IgetPlacesInfra; + +export type getPlacesReturnPort = getPlacesReturnType; diff --git a/src/business-logic/core/users/common/data/model/usersModel.ts b/src/business-logic/core/users/common/data/model/usersModel.ts new file mode 100644 index 0000000..61ec2b4 --- /dev/null +++ b/src/business-logic/core/users/common/data/model/usersModel.ts @@ -0,0 +1,21 @@ +import Users from "../../entity/entity"; + +class UsersModel { + private usersList: Users[]; + + private modelTitle = "users"; + + constructor(data: Users[]) { + this.usersList = data; + } + + getData(): Users[] { + return this.usersList; + } + + getTitle(): string { + return this.modelTitle; + } +} + +export default UsersModel; diff --git a/src/business-logic/core/users/common/entity/entity.ts b/src/business-logic/core/users/common/entity/entity.ts new file mode 100644 index 0000000..90f9f2c --- /dev/null +++ b/src/business-logic/core/users/common/entity/entity.ts @@ -0,0 +1,6 @@ +export default interface Users { + profileId: string; + firstname: string; + lastname: string; + accountId: string; +} diff --git a/src/business-logic/core/users/get-users/data/repository/IGetUserRepo.ts b/src/business-logic/core/users/get-users/data/repository/IGetUserRepo.ts new file mode 100644 index 0000000..25aeda2 --- /dev/null +++ b/src/business-logic/core/users/get-users/data/repository/IGetUserRepo.ts @@ -0,0 +1,5 @@ +import UsersModel from "../../../common/data/model/usersModel"; + +type IGetUsersRepo = () => Promise; + +export default IGetUsersRepo; diff --git a/src/business-logic/core/users/get-users/data/repository/getUserRepo.ts b/src/business-logic/core/users/get-users/data/repository/getUserRepo.ts new file mode 100644 index 0000000..acb9909 --- /dev/null +++ b/src/business-logic/core/users/get-users/data/repository/getUserRepo.ts @@ -0,0 +1,16 @@ +import UsersModel from "../../../common/data/model/usersModel"; +import getUsersResponseObject from "../response-object/usersRO"; +import { GetUsersResponse } from "../response-object/protocols"; + +const getUsersRepo = async (httpHandler: () => Promise) => { + // call httpHandler + const usersResponse = await httpHandler(); + // user response object to turn it to the data that we want + const usersData = getUsersResponseObject(usersResponse); + // make model + const usersModel = new UsersModel(usersData); + // return the model + return usersModel; +}; + +export default getUsersRepo; diff --git a/src/business-logic/core/users/get-users/data/response-object/protocols.ts b/src/business-logic/core/users/get-users/data/response-object/protocols.ts new file mode 100644 index 0000000..9a4965c --- /dev/null +++ b/src/business-logic/core/users/get-users/data/response-object/protocols.ts @@ -0,0 +1,18 @@ +export type GetUsersResponse = { + _id: string; + account_type: string; + updated_at: string; + created_at: string; + subscription_method: string; + last_login_method: string; + account_number: null | number; + balance: number; + account_id: string; + user_data: { + _id: string; + first_name: string; + last_name: string; + avatar: string; + }; + __v: number; +}[]; diff --git a/src/business-logic/core/users/get-users/data/response-object/usersRO.ts b/src/business-logic/core/users/get-users/data/response-object/usersRO.ts new file mode 100644 index 0000000..98724ee --- /dev/null +++ b/src/business-logic/core/users/get-users/data/response-object/usersRO.ts @@ -0,0 +1,16 @@ +/* eslint-disable no-underscore-dangle */ +import Users from "../../../common/entity/entity"; +import { GetUsersResponse } from "./protocols"; + +const getUsersResponseObject = (apiResponse: GetUsersResponse): Users[] => { + return apiResponse.map((userItem) => { + return { + profileId: userItem._id, + firstname: userItem.user_data.first_name, + lastname: userItem.user_data.last_name, + accountId: userItem.account_id, + }; + }); +}; + +export default getUsersResponseObject; diff --git a/src/business-logic/core/users/get-users/index.ts b/src/business-logic/core/users/get-users/index.ts new file mode 100644 index 0000000..0808670 --- /dev/null +++ b/src/business-logic/core/users/get-users/index.ts @@ -0,0 +1,3 @@ +import getUsers from "./infra/getUsersInfra"; + +export default getUsers; diff --git a/src/business-logic/core/users/get-users/infra/getUsersInfra.ts b/src/business-logic/core/users/get-users/infra/getUsersInfra.ts new file mode 100644 index 0000000..677c752 --- /dev/null +++ b/src/business-logic/core/users/get-users/infra/getUsersInfra.ts @@ -0,0 +1,15 @@ +import IGetUsersRepo from "../data/repository/IGetUserRepo"; +import getUsersRepo from "../data/repository/getUserRepo"; +import GettingUsersUsecase from "../usecase/getUsersUsecase"; +import { IgetusersInfra, getusersReturnType } from "./protocols"; + +const getUsers = ({ httpHandler }: IgetusersInfra): getusersReturnType => { + // get httpHandler + const repository: IGetUsersRepo = () => getUsersRepo(httpHandler); + // connet usecase and repository + const usecase = new GettingUsersUsecase(repository); + // return method to use + return () => usecase.execute(); +}; + +export default getUsers; diff --git a/src/business-logic/core/users/get-users/infra/protocols.ts b/src/business-logic/core/users/get-users/infra/protocols.ts new file mode 100644 index 0000000..339aee8 --- /dev/null +++ b/src/business-logic/core/users/get-users/infra/protocols.ts @@ -0,0 +1,8 @@ +import UsersModel from "../../common/data/model/usersModel"; +import { GetUsersResponse } from "../data/response-object/protocols"; + +export interface IgetusersInfra { + httpHandler: () => Promise; +} + +export type getusersReturnType = () => Promise; diff --git a/src/business-logic/core/users/get-users/usecase/getUsersUsecase.ts b/src/business-logic/core/users/get-users/usecase/getUsersUsecase.ts new file mode 100644 index 0000000..2711a3b --- /dev/null +++ b/src/business-logic/core/users/get-users/usecase/getUsersUsecase.ts @@ -0,0 +1,21 @@ +import UsersModel from "../../common/data/model/usersModel"; +import IGetUsersRepo from "../data/repository/IGetUserRepo"; + +/** + * this usecase is responsible for calling the repo and returning the users data from the repository + */ +class GettingUsersUsecase { + private repository: IGetUsersRepo; + + constructor(repository: IGetUsersRepo) { + this.repository = repository; + } + + async execute(): Promise { + // call usecase and return the repo + const usersData = await this.repository(); + return usersData; + } +} + +export default GettingUsersUsecase; diff --git a/src/driven/adapters/get-places-adapter/getPlacesAdapter.ts b/src/driven/adapters/get-places-adapter/getPlacesAdapter.ts index 051c871..1c66cee 100644 --- a/src/driven/adapters/get-places-adapter/getPlacesAdapter.ts +++ b/src/driven/adapters/get-places-adapter/getPlacesAdapter.ts @@ -3,17 +3,15 @@ import IGetPlacesPort from "~/business-logic/core/places/get-places/port"; import { HTTPPovider } from "~/driven/boundaries/http-boundary/httpBoundary"; import { HttpOptionsType } from "~/driven/boundaries/http-boundary/protocols"; import { apiUrls } from "~/driven/utils/configs/appConfig"; +import { getPlacesAdapterReturnType } from "./protocols"; -const getPlacesAdapter = async (): Promise => { +const getPlacesAdapter = (): IGetPlacesPort & getPlacesAdapterReturnType => { // url of api - const url = apiUrls.core.places; + const url = apiUrls.core.getPlaces; // make the options of request const options: HttpOptionsType = { url, method: "GET", - headers: { - "Content-Type": "application/json", - }, }; // make the httpHandler const httpProvider = new HTTPPovider(); @@ -24,6 +22,7 @@ const getPlacesAdapter = async (): Promise => { // return the method return { httpHandler, + url, }; }; diff --git a/src/driven/adapters/get-places-adapter/protocols.ts b/src/driven/adapters/get-places-adapter/protocols.ts new file mode 100644 index 0000000..4a89776 --- /dev/null +++ b/src/driven/adapters/get-places-adapter/protocols.ts @@ -0,0 +1,3 @@ +export type getPlacesAdapterReturnType = { + url: string; +}; diff --git a/src/driven/boundaries/http-boundary/httpBoundary.ts b/src/driven/boundaries/http-boundary/httpBoundary.ts index fb98886..c7f4124 100644 --- a/src/driven/boundaries/http-boundary/httpBoundary.ts +++ b/src/driven/boundaries/http-boundary/httpBoundary.ts @@ -1,14 +1,17 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios from "axios"; import { staticMessages } from "~/driven/utils/constants/staticMessages"; import { ApiGlobalResponseObject } from "~/driven/utils/protocols/serviceProtocols"; +import { HttpOptionsType } from "./protocols"; export class HTTPPovider { - async request(customOptions: AxiosRequestConfig) { - const options: AxiosRequestConfig = { + async request(customOptions: HttpOptionsType) { + const options: HttpOptionsType = { ...customOptions, headers: { ...customOptions.headers, - Authorization: `Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI4NXh0WnA5eThxVDBXVDkwUFpuUkRja3N4LWw0clVyM0tHQW5JSU9DckJNIn0.eyJleHAiOjE2ODQ1NzUyNDksImlhdCI6MTY4NDQ4ODg0OSwianRpIjoiYjI3MDUwMzYtMzMwZi00MTRkLWE2Y2QtNWRiYWUzOTRkMjczIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9kaXBhbF9kZXYiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiY2RmYzY3YzQtZGJkOC00NGVhLWI0OWEtYjQ3MjZhMzNmOTAxIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiY29tZm9ydGVjaCIsInNlc3Npb25fc3RhdGUiOiJmMzBhYzJlOS04ZTAxLTQxYjItYmI2OS0yYmMyNGEwOGRjNGUiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiZGVmYXVsdC1yb2xlcy1tYXN0ZXIiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiY29tZm9ydGVjaCI6eyJyb2xlcyI6WyJ1c2VyIiwib3BlcmF0b3IiXX0sImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsInNpZCI6ImYzMGFjMmU5LThlMDEtNDFiMi1iYjY5LTJiYzI0YTA4ZGM0ZSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoiKzc3Nzc3Nzc3Nzc3In0.tzM7W8szzcN1AK3XOtgUCGbHkmWd4bnqr-jvcwBICtNbl5Dty8RxK_ONFp6g5X8wI0pVPKx4qLvWkE7jXQcg1XDZW_H1V-ucZZ_a9POffDRZ5xSNcREnjfKhw3gvjK9YSSBeMf08abDexbVSJW4rbPxtmcO9WGdZN8C1k7O-_9VHz-3NBCq7vRYBNID--xVTga_MMv3mCORzHtUdx2D7B2d7YxBAjQs5x9JCl_eXuN_IHODc2HMww-s5akquzdEKGFSfASu30NpNZucbO9XyTMkAWuV-H9Xd73eq5o-tSd0jMOfY9G1it9xLAM2Gk4xmIuUA16aLnjY7_rmm3rOypw`, + mode: "cors", + credentials: "include", + Authorization: `Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI4NXh0WnA5eThxVDBXVDkwUFpuUkRja3N4LWw0clVyM0tHQW5JSU9DckJNIn0.eyJleHAiOjE2ODQ2Njc2MTEsImlhdCI6MTY4NDU4MTIxMSwianRpIjoiN2VlNzQ5ZTMtMjdhOC00ZTc1LWE4MTAtOTU0MGY5NDdmNjlkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9kaXBhbF9kZXYiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiY2RmYzY3YzQtZGJkOC00NGVhLWI0OWEtYjQ3MjZhMzNmOTAxIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiY29tZm9ydGVjaCIsInNlc3Npb25fc3RhdGUiOiI3YTFlZDk2OS1lNWY2LTQzZTctOThhMy05OGQ3Zjk3YWM1NDgiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiZGVmYXVsdC1yb2xlcy1tYXN0ZXIiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiY29tZm9ydGVjaCI6eyJyb2xlcyI6WyJ1c2VyIiwib3BlcmF0b3IiXX0sImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsInNpZCI6IjdhMWVkOTY5LWU1ZjYtNDNlNy05OGEzLTk4ZDdmOTdhYzU0OCIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoiKzc3Nzc3Nzc3Nzc3In0.qp1GetUEy2LOZWy6Aaiwf_0d0U8wBqXJQhhuSgIO4RkkEgUnwYZ5fFupkp1iTXZMpqWAsmbRp-C0Z8nYT8Hor6XjnE73XwAVVY0Jbx6HSxtcTBOqo2IT0SmVm6z-TFpgYnErHiFZZgsqP4KYkc12xlQH4SrpN-h-oXN4ZtwuOIG65ixt2yKC-8KTyZzfZGa_8llAtnthQBtxX00MdivFpRP-NU1KfCtJqHSTKn40RNs-Nt8Gi_x7vWv9OKD8h-IIp27oOCJZNyL4aa237cuPw9IWbdiDuUAOgxkPw30i9LIDPA70GvdpRKWgLq0-itcT_hpf2RguuALDafaqoGgoGQ`, }, }; const response = await axios>(options); diff --git a/src/driven/boundaries/state-management/index.ts b/src/driven/boundaries/state-management/index.ts new file mode 100644 index 0000000..ce3e86d --- /dev/null +++ b/src/driven/boundaries/state-management/index.ts @@ -0,0 +1,3 @@ +import StateManagementService from "./stateManagementService"; + +export default StateManagementService; diff --git a/src/driven/boundaries/state-management/stateManagementProvider.ts b/src/driven/boundaries/state-management/stateManagementProvider.ts new file mode 100644 index 0000000..f734a18 --- /dev/null +++ b/src/driven/boundaries/state-management/stateManagementProvider.ts @@ -0,0 +1,6 @@ +export default abstract class StateManagementProvider { + abstract useGetQuery( + key: string, + httpHandler: () => Promise + ): { data: DataType | undefined; isLoading: boolean; error?: string }; +} diff --git a/src/driven/boundaries/state-management/stateManagementService.ts b/src/driven/boundaries/state-management/stateManagementService.ts new file mode 100644 index 0000000..2f93b7f --- /dev/null +++ b/src/driven/boundaries/state-management/stateManagementService.ts @@ -0,0 +1,26 @@ +import StateManagementProvider from "./stateManagementProvider"; +import SwrBoundary from "./swrBoundary"; + +export default class StateManagementService implements StateManagementProvider { + private provider: StateManagementProvider; + + constructor(provider: StateManagementProvider) { + this.provider = provider; + } + + static swr() { + const stateManagement = new StateManagementService(new SwrBoundary()); + return stateManagement; + } + + useGetQuery( + key: string, + httpHandler: () => Promise + ): { + data: DataType | undefined; + isLoading: boolean; + error?: string | undefined; + } { + return this.provider.useGetQuery(key, httpHandler); + } +} diff --git a/src/driven/boundaries/state-management/swrBoundary.ts b/src/driven/boundaries/state-management/swrBoundary.ts new file mode 100644 index 0000000..fb23529 --- /dev/null +++ b/src/driven/boundaries/state-management/swrBoundary.ts @@ -0,0 +1,15 @@ +import useSwr from "swr"; +import StateManagementProvider from "./stateManagementProvider"; + +export default class SwrBoundary implements StateManagementProvider { + useGetQuery( + key: string, + httpHandler: () => Promise + ): { + data: DataType | undefined; + isLoading: boolean; + error?: string | undefined; + } { + return useSwr(key, httpHandler); + } +} diff --git a/src/driven/utils/components/loading/Loading.tsx b/src/driven/utils/components/loading/Loading.tsx new file mode 100644 index 0000000..48129bf --- /dev/null +++ b/src/driven/utils/components/loading/Loading.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import style from "./style.module.css"; + +export default function Loading() { + return ( +
+
+
+
+
+
+ ); +} diff --git a/src/driven/utils/components/loading/style.module.css b/src/driven/utils/components/loading/style.module.css new file mode 100644 index 0000000..df21453 --- /dev/null +++ b/src/driven/utils/components/loading/style.module.css @@ -0,0 +1,35 @@ +.ldsRing { + display: inline-block; + position: relative; + width: 80px; + height: 80px; +} +.ldsRing div { + box-sizing: border-box; + display: block; + position: absolute; + width: 2rem; + height: 2rem; + margin: 4px; + border: 4px solid #fff; + border-radius: 50%; + animation: ldsRing 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; + border-color: var(--color-primary-main) transparent transparent transparent; +} +.ldsRing div:nth-child(1) { + animation-delay: -0.45s; +} +.ldsRing div:nth-child(2) { + animation-delay: -0.3s; +} +.ldsRing div:nth-child(3) { + animation-delay: -0.15s; +} +@keyframes ldsRing { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/src/driven/utils/configs/appConfig.ts b/src/driven/utils/configs/appConfig.ts index 55b75c8..19697d1 100644 --- a/src/driven/utils/configs/appConfig.ts +++ b/src/driven/utils/configs/appConfig.ts @@ -25,6 +25,7 @@ export const routesData = { const baseApiUrl = ENVs.apiOrigin; export const apiUrls = { core: { - places: `${baseApiUrl}${ENVs.apiPlaces}`, + getPlaces: `${baseApiUrl}${ENVs.apiGetPlaces}`, + getUsers: `${baseApiUrl}${ENVs.apiGetUsers}`, }, }; diff --git a/src/driven/utils/constants/envs.ts b/src/driven/utils/constants/envs.ts index f39ae58..2d5b6eb 100644 --- a/src/driven/utils/constants/envs.ts +++ b/src/driven/utils/constants/envs.ts @@ -1,4 +1,5 @@ export const ENVs = { apiOrigin: process.env.VITE_API_ORIGIN, - apiPlaces: process.env.VITE_API_PLACES, + apiGetPlaces: process.env.VITE_API_PLACES, + apiGetUsers: process.env.VITE_API_USERS, }; diff --git a/src/driving/application/core/places-list/infra/PlacesList.tsx b/src/driving/application/core/places-list/infra/PlacesList.tsx index b586eb0..b832635 100644 --- a/src/driving/application/core/places-list/infra/PlacesList.tsx +++ b/src/driving/application/core/places-list/infra/PlacesList.tsx @@ -1,11 +1,42 @@ import React from "react"; +import getPlaces from "~/business-logic/core/places/get-places"; +import getPlacesAdapter from "~/driven/adapters/get-places-adapter/getPlacesAdapter"; +import StateManagementService from "~/driven/boundaries/state-management"; +import PlacesModel from "~/business-logic/core/places/common/model/placesModel"; import PlacesListView from "../view/PlacesListView"; import usePlacesListVM from "../viewmodel/placesListVM"; +import placesListModel from "../model/placesListModel"; + +const prepareTheLogicForModel = () => { + const gettingPlacesDrivenAdapter = getPlacesAdapter(); + const { url } = gettingPlacesDrivenAdapter; + const getingPlacesLogic = getPlaces(gettingPlacesDrivenAdapter); + return { getingPlacesLogic, url }; +}; + +const prepareStateManagementForVM = ( + apiUrl: string, + placesModel: () => Promise +) => { + const stateManagement = StateManagementService.swr(); + + const useGetPlacesList = () => + stateManagement.useGetQuery(apiUrl, placesModel); + + return useGetPlacesList; +}; export default function PlacessList() { - const { selectedRowId, setSelectedRowId } = usePlacesListVM(); + const { getingPlacesLogic, url } = prepareTheLogicForModel(); + const placesModel = async () => await placesListModel(getingPlacesLogic); + + const useGetPlacesList = prepareStateManagementForVM(url, placesModel); + const { selectedRowId, setSelectedRowId, placesData } = usePlacesListVM({ + useGetPlacesList, + }); return ( diff --git a/src/driving/application/core/places-list/model/placesListModel.ts b/src/driving/application/core/places-list/model/placesListModel.ts new file mode 100644 index 0000000..717ffda --- /dev/null +++ b/src/driving/application/core/places-list/model/placesListModel.ts @@ -0,0 +1,10 @@ +import { getPlacesModel } from "./protocols"; + +const placesListModel: getPlacesModel = async (getPlaces) => { + // get the method for handling the logic + const places = await getPlaces(); + return places; + // handling the errors +}; + +export default placesListModel; diff --git a/src/driving/application/core/places-list/model/protocols.ts b/src/driving/application/core/places-list/model/protocols.ts new file mode 100644 index 0000000..9646a51 --- /dev/null +++ b/src/driving/application/core/places-list/model/protocols.ts @@ -0,0 +1,6 @@ +import PlacesModel from "~/business-logic/core/places/common/model/placesModel"; +import { getPlacesReturnPort } from "~/business-logic/core/places/get-places/port"; + +export type getPlacesModel = ( + getPlaces: getPlacesReturnPort +) => Promise; diff --git a/src/driving/application/core/places-list/view/PlacesListView.tsx b/src/driving/application/core/places-list/view/PlacesListView.tsx index 495cb37..cccddfb 100644 --- a/src/driving/application/core/places-list/view/PlacesListView.tsx +++ b/src/driving/application/core/places-list/view/PlacesListView.tsx @@ -1,11 +1,12 @@ import React from "react"; import { staticMessages } from "~/driven/utils/constants/staticMessages"; +import Loading from "~/driven/utils/components/loading/Loading"; import TableRow from "../../common/table-row"; import { IPlacesListProps } from "./protocols"; export default function UsersListView(props: IPlacesListProps) { - const { selectedRowId, setSelectedRowId } = props; - + const { selectedRowId, setSelectedRowId, placesList } = props; + console.log(placesList.data); const rows = () => { const placesdata = [ { @@ -46,6 +47,13 @@ export default function UsersListView(props: IPlacesListProps) { }); }; + if (placesList.isLoading) + return ( +
+ +
+ ); + return ( diff --git a/src/driving/application/core/places-list/view/protocols.ts b/src/driving/application/core/places-list/view/protocols.ts index d4b4e7f..03be97e 100644 --- a/src/driving/application/core/places-list/view/protocols.ts +++ b/src/driving/application/core/places-list/view/protocols.ts @@ -1,4 +1,11 @@ +import PlacesModel from "~/business-logic/core/places/common/model/placesModel"; + export interface IPlacesListProps { + placesList: { + data: PlacesModel | undefined; + isLoading: boolean; + error?: string | undefined; + }; selectedRowId: string; setSelectedRowId: React.Dispatch>; } diff --git a/src/driving/application/core/places-list/viewmodel/placesListVM.ts b/src/driving/application/core/places-list/viewmodel/placesListVM.ts index 391d5f6..2a70d54 100644 --- a/src/driving/application/core/places-list/viewmodel/placesListVM.ts +++ b/src/driving/application/core/places-list/viewmodel/placesListVM.ts @@ -1,12 +1,23 @@ import { useState } from "react"; +import PlacesModel from "~/business-logic/core/places/common/model/placesModel"; import { placesListReturnType } from "./protocols"; -const usePlacesListVM = (): placesListReturnType => { +interface IPlacesListVM { + useGetPlacesList: () => { + data: PlacesModel | undefined; + isLoading: boolean; + error?: string | undefined; + }; +} +const usePlacesListVM = (dependencies: IPlacesListVM): placesListReturnType => { + const { useGetPlacesList } = dependencies; + const placesData = useGetPlacesList(); const [selectedRowId, setSelectedRowId] = useState(""); return { selectedRowId, setSelectedRowId, + placesData, }; }; diff --git a/src/driving/application/core/places-list/viewmodel/protocols.ts b/src/driving/application/core/places-list/viewmodel/protocols.ts index 2cffdf0..33694de 100644 --- a/src/driving/application/core/places-list/viewmodel/protocols.ts +++ b/src/driving/application/core/places-list/viewmodel/protocols.ts @@ -1,6 +1,12 @@ import React from "react"; +import PlacesModel from "~/business-logic/core/places/common/model/placesModel"; export type placesListReturnType = { selectedRowId: string; setSelectedRowId: React.Dispatch>; + placesData: { + data: PlacesModel | undefined; + isLoading: boolean; + error?: string | undefined; + }; };