├── .env-example ├── .eslintrc.json ├── .gitignore ├── .husky ├── commit-msg └── pre-commit ├── .prettierignore ├── .prettierrc ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── commitlint.config.js ├── docker-compose.yaml ├── jest-mongodb-config.js ├── jest.config.js ├── package-lock.json ├── package.json ├── postman └── Notion_Clone_API.postman_collection.json ├── src ├── application │ ├── errors │ │ ├── EmailInUseError.ts │ │ ├── ForbiddenError.ts │ │ ├── InvalidPasswordError.ts │ │ ├── InvalidTokenError.ts │ │ ├── InvalidUserError.ts │ │ ├── PageNotFoundError.ts │ │ ├── UnauthorizedError.ts │ │ ├── UserNotFoundError.ts │ │ └── WorkspaceNotFoundError.ts │ ├── interfaces │ │ ├── cryptography │ │ │ ├── HashCompare.ts │ │ │ ├── HashGenerator.ts │ │ │ ├── JWTGenerator.ts │ │ │ └── JWTVerifier.ts │ │ ├── repositories │ │ │ ├── pages │ │ │ │ ├── addToFavoriteRepository.ts │ │ │ │ ├── createPageRepository.ts │ │ │ │ ├── deletePageRepository.ts │ │ │ │ ├── deletePagesByWorkspaceIdRepository.ts │ │ │ │ ├── getPageByIdRepository.ts │ │ │ │ ├── getPageContentByPageIdRepository.ts │ │ │ │ ├── getPageIdsByPathRepository.ts │ │ │ │ ├── getPageSettingsByPageIdRepository.ts │ │ │ │ ├── removeFromFavoriteRepository.ts │ │ │ │ ├── updatePageContentByPageIdRepository.ts │ │ │ │ ├── updatePageCoverByPageIdRepository.ts │ │ │ │ ├── updatePageIconByPageIdRepository.ts │ │ │ │ ├── updatePagePathByPageIdRepository.ts │ │ │ │ ├── updatePageSettingsByPageIdRepository.ts │ │ │ │ └── updatePageTitleByPageIdRepository.ts │ │ │ ├── tokens │ │ │ │ ├── createTokenRepository.ts │ │ │ │ ├── deleteTokenRepository.ts │ │ │ │ └── getTokenRepository.ts │ │ │ ├── users │ │ │ │ ├── addPageIdToFavoritesByWorkspaceIdRepository.ts │ │ │ │ ├── addWorkspaceByUserIdRepository.ts │ │ │ │ ├── createUserRepository.ts │ │ │ │ ├── deleteUserRepository.ts │ │ │ │ ├── getFavoritesByWorkspaceIdRepository.ts │ │ │ │ ├── getUserByIdRepository.ts │ │ │ │ ├── getWorkspacesByUserIdRepository.ts │ │ │ │ ├── loadUserByEmailRepository.ts │ │ │ │ ├── removePageIdFromFavoritesByWorkspaceIdRepository.ts │ │ │ │ ├── removeWorkspaceByUserIdRepository.ts │ │ │ │ ├── updateUserProfilePictureRepository.ts │ │ │ │ ├── updateUserRepository.ts │ │ │ │ └── updateUserWorkspaceMetaDataByWorkspaceIdRepository.ts │ │ │ └── workspaces │ │ │ │ ├── addMemberByWorkspaceIdRepository.ts │ │ │ │ ├── addPageRepository.ts │ │ │ │ ├── createWorkspaceRepository.ts │ │ │ │ ├── deleteWorkspaceRepository.ts │ │ │ │ ├── getAllMembersByWorkspaceIdRepository.ts │ │ │ │ ├── getAllRootPagesRepository.ts │ │ │ │ ├── getChildrensByPageReferenceRepsoitory.ts │ │ │ │ ├── getWorkspaceByIdRepository.ts │ │ │ │ ├── removeMemberByWorkspaceIdRepository.ts │ │ │ │ ├── removePageByPageIdRepository.ts │ │ │ │ ├── updateWorkspacePagesMetaDataByPageIdRepository.ts │ │ │ │ └── updateWorkspaceRepository.ts │ │ └── use-cases │ │ │ ├── UseCase.ts │ │ │ ├── pages │ │ │ ├── addToFavoriteInterface.ts │ │ │ ├── authorizationInterface.ts │ │ │ ├── createPageInterface.ts │ │ │ ├── deletePageInterface.ts │ │ │ ├── deletePagesByWorkspaceIdInterface.ts │ │ │ ├── getPageByIdInterface.ts │ │ │ ├── getPageContentByPageIdInterface.ts │ │ │ ├── getPageIdsByPathInterface.ts │ │ │ ├── getPageSettingsByPageIdInterface.ts │ │ │ ├── removeFromFavoriteInterface.ts │ │ │ ├── updatePageContentByPageIdInterface.ts │ │ │ ├── updatePageCoverByPageIdInterface.ts │ │ │ ├── updatePageIconByPageIdInterface.ts │ │ │ ├── updatePagePathByPageIdInterface.ts │ │ │ ├── updatePageSettingsByPageIdInterface.ts │ │ │ └── updatePageTitleByPageIdInterface.ts │ │ │ ├── users │ │ │ ├── AddPageIdToFavoritesByWorkspaceIdInterface.ts │ │ │ ├── AddWorkspaceByUserIdInterface.ts │ │ │ ├── AuthenticateInterface.ts │ │ │ ├── DeleteUserInterface.ts │ │ │ ├── GetAccessTokenInterface.ts │ │ │ ├── GetFavoritesByWorkspaceIdInterface.ts │ │ │ ├── GetUserByIdInterface.ts │ │ │ ├── GetWorkspacesByUserIdInterface.ts │ │ │ ├── RemovePageIdFromFavoritesByWorkspaceIdInterface.ts │ │ │ ├── RemoveWorkspaceByUserIdInterface.ts │ │ │ ├── SignInInterface.ts │ │ │ ├── SignOutInterface.ts │ │ │ ├── SignUpInterface.ts │ │ │ ├── UpdateUserInterface.ts │ │ │ ├── UpdateUserProfilePictureInterface.ts │ │ │ └── UpdateUserWorkspaceMetaDataByWorkspaceIdInterface.ts │ │ │ └── workspaces │ │ │ ├── AddMemberByWorkspaceIdInterface.ts │ │ │ ├── AddPageInterface.ts │ │ │ ├── CreateWorkspaceInterface.ts │ │ │ ├── DeleteWorkspaceInterface.ts │ │ │ ├── GetAllMembersByWorkspaceIdInterface.ts │ │ │ ├── GetAllRootPagesInterface.ts │ │ │ ├── GetChildrensByPageReferenceInterface.ts │ │ │ ├── GetWorkspaceByIdInterface.ts │ │ │ ├── RemoveMemberByWorkspaceIdInterface.ts │ │ │ ├── RemovePageByPageIdInterface.ts │ │ │ ├── UpdateWorkspaceInterface.ts │ │ │ └── UpdateWorkspacePagesMetaDataByPageIdInterface.ts │ └── use-cases │ │ ├── pages │ │ ├── AddToFavorite.ts │ │ ├── Authorization.ts │ │ ├── CreatePage.ts │ │ ├── DeletePage.ts │ │ ├── DeletePagesByWorkspaceId.ts │ │ ├── GetPageById.ts │ │ ├── GetPageContentByPageId.ts │ │ ├── GetPageIdsByPath.ts │ │ ├── GetPageSettingsByPageId.ts │ │ ├── RemoveFromFavorite.ts │ │ ├── UpdatePageContentByPageId.ts │ │ ├── UpdatePageCoverByPageId.ts │ │ ├── UpdatePageIconByPageId.ts │ │ ├── UpdatePagePathByPageId.ts │ │ ├── UpdatePageSettingsByPageId.ts │ │ └── UpdatePageTitleByPageId.ts │ │ ├── users │ │ ├── AddPageIdToFavoritesByWorkspaceId.ts │ │ ├── AddWorkspaceByUserId.ts │ │ ├── Authenticate.ts │ │ ├── DeleteUser.ts │ │ ├── GetAccessToken.ts │ │ ├── GetFavoritesByWorkspaceId.ts │ │ ├── GetUserById.ts │ │ ├── GetWorkspacesByUserId.ts │ │ ├── RemovePageIdFromFavoritesByWorkspaceId.ts │ │ ├── RemoveWorkspaceByUserId.ts │ │ ├── SignIn.ts │ │ ├── SignOut.ts │ │ ├── SignUp.ts │ │ ├── UpdateUser.ts │ │ ├── UpdateUserProfilePicture.ts │ │ └── UpdateUserWorkspaceMetaDataByWorkspaceId.ts │ │ └── workspaces │ │ ├── AddMemberByWorkspaceId.ts │ │ ├── AddPage.ts │ │ ├── CreateWorkspace.ts │ │ ├── DeleteWorkspace.ts │ │ ├── GetAllMembersByWorkspaceId.ts │ │ ├── GetAllRootPages.ts │ │ ├── GetChildrensByPageReference.ts │ │ ├── GetWorkspaceById.ts │ │ ├── RemoveMemberByWorkspaceId.ts │ │ ├── RemovePageByPageId.ts │ │ ├── UpdateWorkspace.ts │ │ └── UpdateWorkspacePagesMetaDataByPageId.ts ├── domain │ └── entities │ │ ├── Page.ts │ │ ├── User.ts │ │ └── Workspace.ts ├── infrastructure │ ├── cryptography │ │ ├── BcryptAdapter.ts │ │ └── JWTAdapter.ts │ ├── db │ │ └── mongodb │ │ │ ├── helpers │ │ │ ├── db-connection.ts │ │ │ └── mapper.ts │ │ │ └── repositories │ │ │ ├── PageRepository.ts │ │ │ ├── TokenRepository.ts │ │ │ ├── UserRepository.ts │ │ │ └── WorkspaceRepository.ts │ ├── http │ │ ├── controllers │ │ │ ├── BaseController.ts │ │ │ ├── pages │ │ │ │ ├── AddToFavoriteController.ts │ │ │ │ ├── CreatePageController.ts │ │ │ │ ├── DeletePageController.ts │ │ │ │ ├── DeletePagesByWorkspaceIdController.ts │ │ │ │ ├── GetPageByIdController.ts │ │ │ │ ├── GetPageContentByPageIdController.ts │ │ │ │ ├── GetPageSettingsByPageIdController.ts │ │ │ │ ├── RemoveFromFavoriteController.ts │ │ │ │ ├── UpdatePageContentByPageIdController.ts │ │ │ │ ├── UpdatePageCoverByPageIdController.ts │ │ │ │ ├── UpdatePageIconByPageIdController.ts │ │ │ │ ├── UpdatePageSettingsByPageIdController.ts │ │ │ │ └── UpdatePageTitleByPageIdController.ts │ │ │ ├── users │ │ │ │ ├── AddPageIdToFavoritesByWorkspaceIdController.ts │ │ │ │ ├── AddWorkspaceByUserIdController.ts │ │ │ │ ├── DeleteUserController.ts │ │ │ │ ├── GetAccessTokenController.ts │ │ │ │ ├── GetFavoritesByWorkspaceIdController.ts │ │ │ │ ├── GetUserByIdController.ts │ │ │ │ ├── GetWorkspacesByUserIdController.ts │ │ │ │ ├── RemovePageIdFromFavoritesByWorkspaceIdController.ts │ │ │ │ ├── RemoveWorkspaceByUserIdController.ts │ │ │ │ ├── SignInController.ts │ │ │ │ ├── SignOutController.ts │ │ │ │ ├── SignUpController.ts │ │ │ │ ├── UpdateUserController.ts │ │ │ │ └── UpdateUserProfilePictureController.ts │ │ │ └── workspaces │ │ │ │ ├── AddMemberByWorkspaceIdController.ts │ │ │ │ ├── AddPageController.ts │ │ │ │ ├── CreateWorkspaceController.ts │ │ │ │ ├── DeleteWorkspaceController.ts │ │ │ │ ├── GetAllMembersByWorkspaceIdController.ts │ │ │ │ ├── GetAllRootPagesController.ts │ │ │ │ ├── GetChildrensByPageReferenceController.ts │ │ │ │ ├── GetWorkspaceByIdController.ts │ │ │ │ ├── RemoveMemberByWorkspaceIdController.ts │ │ │ │ ├── RemovePageByPageIdController.ts │ │ │ │ └── UpdateWorkspaceController.ts │ │ ├── errors │ │ │ ├── AuthTokenNotProvidedError.ts │ │ │ ├── InvalidAuthTokenError.ts │ │ │ ├── PageNotFoundError.ts │ │ │ ├── PermissionError.ts │ │ │ └── ServerError.ts │ │ ├── helpers │ │ │ └── http.ts │ │ ├── interfaces │ │ │ ├── HttpRequest.ts │ │ │ ├── HttpResponse.ts │ │ │ └── Validation.ts │ │ ├── middlewares │ │ │ ├── BaseMiddleware.ts │ │ │ ├── authentication │ │ │ │ └── AuthMiddleware.ts │ │ │ └── authorization │ │ │ │ └── AuthorizationMiddleware.ts │ │ └── validations │ │ │ ├── AJVInstance.ts │ │ │ └── PayloadValidator.ts │ └── util │ │ └── getPageContent.ts └── main │ ├── adapters │ ├── express-middleware-adapter.ts │ ├── express-route-adapter.ts │ ├── express-route-remove-cookie-adapter.ts │ └── express-route-set-cookie-adapter.ts │ ├── config │ ├── app.ts │ ├── custom-modules.d.ts │ ├── env.ts │ ├── middlewares.ts │ └── routes.ts │ ├── factories │ ├── controllers │ │ ├── pages │ │ │ ├── add-to-favorite │ │ │ │ └── controller-factory.ts │ │ │ ├── create-page │ │ │ │ ├── controller-factory.ts │ │ │ │ └── validation-factory.ts │ │ │ ├── delete-page │ │ │ │ └── controller-factory.ts │ │ │ ├── delete-pages-by-workspace-id │ │ │ │ └── controller-factory.ts │ │ │ ├── get-page-by-id │ │ │ │ └── controller-factory.ts │ │ │ ├── get-page-content-by-page-id │ │ │ │ └── controller-factory.ts │ │ │ ├── get-page-settings-by-page-id │ │ │ │ └── controller-factory.ts │ │ │ ├── remove-from-favorite │ │ │ │ └── controller-factory.ts │ │ │ ├── update-page-content-by-page-id │ │ │ │ ├── controller-factory.ts │ │ │ │ └── validation-factory.ts │ │ │ ├── update-page-cover-by-page-id │ │ │ │ ├── controller-factory.ts │ │ │ │ └── validation-factory.ts │ │ │ ├── update-page-icon-by-page-id │ │ │ │ ├── controller-factory.ts │ │ │ │ └── validation-factory.ts │ │ │ ├── update-page-settings-by-page-id │ │ │ │ ├── controller-factory.ts │ │ │ │ └── validation-factory.ts │ │ │ └── update-page-title-by-page-id │ │ │ │ ├── controller-factory.ts │ │ │ │ └── validation-factory.ts │ │ ├── users │ │ │ ├── add-page-id-to-favorites-by-workspace-id │ │ │ │ └── controller-factory.ts │ │ │ ├── add-workspace-by-user-id │ │ │ │ └── controller-factory.ts │ │ │ ├── delete-user │ │ │ │ └── controller-factory.ts │ │ │ ├── get-access-token │ │ │ │ └── controller-factory.ts │ │ │ ├── get-favorites-by-workspace-id │ │ │ │ └── controller-factory.ts │ │ │ ├── get-user-by-id │ │ │ │ └── controller-factory.ts │ │ │ ├── get-workspaces-by-user-id │ │ │ │ └── controller-factory.ts │ │ │ ├── remove-page-id-from-favorites-by-workspace-id │ │ │ │ └── controller-factory.ts │ │ │ ├── remove-workspace-by-user-id │ │ │ │ └── controller-factory.ts │ │ │ ├── sign-in │ │ │ │ ├── controller-factory.ts │ │ │ │ └── validation-factory.ts │ │ │ ├── sign-out │ │ │ │ └── controller-factory.ts │ │ │ ├── sign-up │ │ │ │ ├── controller-factory.ts │ │ │ │ └── validation-factory.ts │ │ │ ├── update-user-profile-picture │ │ │ │ ├── controller-factory.ts │ │ │ │ └── validation-factory.ts │ │ │ └── update-user │ │ │ │ ├── controller-factory.ts │ │ │ │ └── validation-factory.ts │ │ └── workspaces │ │ │ ├── add-member-by-workspace-id │ │ │ └── controller-factory.ts │ │ │ ├── add-page │ │ │ ├── controller-factory.ts │ │ │ └── validation-factory.ts │ │ │ ├── create-workspace │ │ │ ├── controller-factory.ts │ │ │ └── validation-factory.ts │ │ │ ├── delete-workspace │ │ │ └── controller-factory.ts │ │ │ ├── get-all-members-by-workspace-id │ │ │ └── controller-factory.ts │ │ │ ├── get-all-root-pages │ │ │ └── controller-factory.ts │ │ │ ├── get-childrens-by-page-reference │ │ │ └── controller-factory.ts │ │ │ ├── get-workspace-by-id │ │ │ └── controller-factory.ts │ │ │ ├── remove-member-by-workspace-id │ │ │ └── controller-factory.ts │ │ │ ├── remove-page-by-page-id │ │ │ └── controller-factory.ts │ │ │ └── update-workspace │ │ │ ├── controller-factory.ts │ │ │ └── validation-factory.ts │ ├── middlewares │ │ ├── auth-middleware-factory.ts │ │ └── authorization-middleware-factory.ts │ └── use-cases │ │ ├── pages │ │ ├── add-to-favorite-factory.ts │ │ ├── authorization-factory.ts │ │ ├── create-page-factory.ts │ │ ├── delete-page-factory.ts │ │ ├── delete-pages-by-workspace-id-factory.ts │ │ ├── get-page-by-id-factory.ts │ │ ├── get-page-content-by-page-id-factory.ts │ │ ├── get-page-ids-by-path.ts │ │ ├── get-page-settings-by-page-id-factory.ts │ │ ├── remove-from-favorite-factory.ts │ │ ├── update-page-content-by-page-id-factory.ts │ │ ├── update-page-cover-by-page-id-factory.ts │ │ ├── update-page-icon-by-page-id-factory.ts │ │ ├── update-page-path-by-page-id.ts │ │ ├── update-page-settings-by-page-id-factory.ts │ │ └── update-page-title-by-page-id-factory.ts │ │ ├── users │ │ ├── add-page-id-to-favorites-by-workspace-id-factory.ts │ │ ├── add-workspace-by-user-id-factory.ts │ │ ├── authenticate-factory.ts │ │ ├── delete-user-factory.ts │ │ ├── get-access-token-factory.ts │ │ ├── get-favorites-by-workspace-id-factory.ts │ │ ├── get-user-by-id-factory.ts │ │ ├── get-workspaces-by-user-id-factory.ts │ │ ├── remove-page-id-from-favorites-by-workspace-id-factory.ts │ │ ├── remove-workspace-by-user-id-factory.ts │ │ ├── sign-in-factory.ts │ │ ├── sign-out-factory.ts │ │ ├── sign-up-factory.ts │ │ ├── update-user-factory.ts │ │ ├── update-user-profile-picture-factory.ts │ │ └── update-user-workspace-meta-data-by-workspace-id-factory.ts │ │ └── workspaces │ │ ├── add-member-by-workspace-id-factory.ts │ │ ├── add-page-factory.ts │ │ ├── create-workspace-factory.ts │ │ ├── delete-workspace-factory.ts │ │ ├── get-all-members-by-workspace-id-factory.ts │ │ ├── get-all-root-pages-factory.ts │ │ ├── get-childrens-by-page-reference-factory.ts │ │ ├── get-workspace-by-id-factory.ts │ │ ├── remove-member-by-workspace-id-factory.ts │ │ ├── remove-page-by-page-id-factory.ts │ │ ├── update-workspace-factory.ts │ │ └── update-workspace-pages-meta-data-by-page-id-factory.ts │ ├── middlewares │ ├── auth-middleware.ts │ ├── authorization-middleware.ts │ ├── body-parser.ts │ ├── content-type.ts │ └── cors.ts │ ├── routes │ ├── page-routes.ts │ ├── user-routes.ts │ └── workspace-routes.ts │ ├── schemas │ ├── add-page-schema.ts │ ├── create-page-schema.ts │ ├── create-workspace-schema.ts │ ├── sign-in-schema.ts │ ├── sign-up-schema.ts │ ├── update-page-content-schema.ts │ ├── update-page-cover-schema.ts │ ├── update-page-icon-schema.ts │ ├── update-page-settings-schema.ts │ ├── update-page-title-schema.ts │ ├── update-user-profile-picture-schema.ts │ ├── update-user-schema.ts │ └── update-workspace-schema.ts │ └── server.ts ├── tests ├── application │ ├── mocks │ │ ├── pages │ │ │ └── use-cases.ts │ │ ├── users │ │ │ └── use-cases.ts │ │ └── workspaces │ │ │ └── use-cases.ts │ └── use-cases │ │ ├── pages │ │ ├── AddToFavorite.spec.ts │ │ ├── Authorization.spec.ts │ │ ├── CreatePage.spec.ts │ │ ├── DeletePage.spec.ts │ │ ├── DeletePagesByWorkspaceId.spec.ts │ │ ├── GetPageById.spec.ts │ │ ├── GetPageContentByPageId.spec.ts │ │ ├── GetPageIdsByPath.spec.ts │ │ ├── GetPageSettingsByPageId.spec.ts │ │ ├── RemoveFromFavorite.spec.ts │ │ ├── UpdatePageContentByPageId.spec.ts │ │ ├── UpdatePageCoverByPageId.spec.ts │ │ ├── UpdatePageIconByPageId.spec.ts │ │ ├── UpdatePagePathByPageId.spec.ts │ │ ├── UpdatePageSettingsByPageId.spec.ts │ │ └── UpdatePageTitleByPageId.spec.ts │ │ ├── users │ │ ├── AddPageIdToFavoritesByWorkspaceId.spec.ts │ │ ├── AddWorkspaceByUserId.spec.ts │ │ ├── Authenticate.spec.ts │ │ ├── DeleteUser.spec.ts │ │ ├── GetAccessToken.spec.ts │ │ ├── GetFavoritesByWorkspaceId.spec.ts │ │ ├── GetUserById.spec.ts │ │ ├── GetWorkspacesByUserId.spec.ts │ │ ├── RemovePageIdFromFavoritesByWorkspaceId.spec.ts │ │ ├── RemoveWorkspaceByUserId.spec.ts │ │ ├── SignIn.spec.ts │ │ ├── SignOut.spec.ts │ │ ├── SignUp.spec.ts │ │ ├── UpdateUser.spec.ts │ │ ├── UpdateUserProfilePicture.spec.ts │ │ └── UpdateUserWorkspaceMetaDataByWorkspaceId.spec.ts │ │ └── workspaces │ │ ├── AddMemberByWorkspaceId.spec.ts │ │ ├── AddPage.spec.ts │ │ ├── CreateWorkspace.spec.ts │ │ ├── DeleteWorkspace.spec.ts │ │ ├── GetAllMembersByWorkspaceId.spec.ts │ │ ├── GetAllRootPages.spec.ts │ │ ├── GetChildrensByPageReference.spec.ts │ │ ├── GetWorkspaceById.spec.ts │ │ ├── RemoveMemberByWorkspaceId.spec.ts │ │ ├── RemovePageByPageId.spec.ts │ │ └── UpdateWorkspace.spec.ts ├── domain │ ├── mock-page.ts │ ├── mock-user.ts │ └── mock-workspace.ts ├── infrastructure │ ├── db │ │ └── mongodb │ │ │ ├── helpers │ │ │ └── db-connection.spec.ts │ │ │ └── repositories │ │ │ ├── PageRepository.spec.ts │ │ │ ├── TokenRepository.spec.ts │ │ │ ├── UserRepository.spec.ts │ │ │ └── WorkspaceRepository.spec.ts │ ├── http │ │ ├── controllers │ │ │ ├── BaseController.spec.ts │ │ │ ├── pages │ │ │ │ ├── AddToFavoriteController.spec.ts │ │ │ │ ├── CreatePageController.spec.ts │ │ │ │ ├── DeletePageController.spec.ts │ │ │ │ ├── DeletePagesByWorkspaceIdController.spec.ts │ │ │ │ ├── GetPageByIdController.spec.ts │ │ │ │ ├── GetPageContentByPageIdController.spec.ts │ │ │ │ ├── GetPageSettingsByPageIdController.spec.ts │ │ │ │ ├── RemoveFromFavoriteController.spec.ts │ │ │ │ ├── UpdatePageContentByPageIdController.spec.ts │ │ │ │ ├── UpdatePageCoverByPageIdController.spec.ts │ │ │ │ ├── UpdatePageIconByPageIdController.spec.ts │ │ │ │ ├── UpdatePageSettingsByPageIdController.spec.ts │ │ │ │ └── UpdatePageTitleByPageIdController.spec.ts │ │ │ ├── users │ │ │ │ ├── AddPageIdToFavoritesByWorkspaceIdController.spec.ts │ │ │ │ ├── AddWorkspaceByUserIdController.spec.ts │ │ │ │ ├── DeleteUserController.spec.ts │ │ │ │ ├── GetAccessTokenController.spec.ts │ │ │ │ ├── GetFavoritesByWorkspaceIdController.spec.ts │ │ │ │ ├── GetUserByIdController.spec.ts │ │ │ │ ├── GetWorkspacesByUserIdController.spec.ts │ │ │ │ ├── RemovePageIdFromFavoritesByWorkspaceIdController.spec.ts │ │ │ │ ├── RemoveWorkspaceByUserIdController.spec.ts │ │ │ │ ├── SignInController.spec.ts │ │ │ │ ├── SignOutController.spec.ts │ │ │ │ ├── SignUpController.spec.ts │ │ │ │ ├── UpdateUserController.spec.ts │ │ │ │ └── UpdateUserProfilePictureController.spec.ts │ │ │ └── workspaces │ │ │ │ ├── AddMemberByWorkspaceIdController.spec.ts │ │ │ │ ├── AddPageController.spec.ts │ │ │ │ ├── CreateWorkspaceController.spec.ts │ │ │ │ ├── DeleteWorkspaceController.spec.ts │ │ │ │ ├── GetAllMembersByWorkspaceIdController.spec.ts │ │ │ │ ├── GetAllRootPagesController.spec.ts │ │ │ │ ├── GetChildrensByPageReferenceController.spec.ts │ │ │ │ ├── GetWorkspaceByIdController.spec.ts │ │ │ │ ├── RemoveMemberByWorkspaceIdController.spec.ts │ │ │ │ ├── RemovePageByPageIdController.spec.ts │ │ │ │ └── UpdateWorkspaceController.spec.ts │ │ ├── middlewares │ │ │ ├── BaseMiddleWare.spec.ts │ │ │ ├── authentication │ │ │ │ └── AuthMiddleware.spec.ts │ │ │ └── authorization │ │ │ │ └── AuthorizationMiddleware.spec.ts │ │ └── validations │ │ │ └── PayloadValidator.spec.ts │ └── mocks │ │ ├── controllers.ts │ │ ├── middlewares.ts │ │ ├── pages │ │ └── repositories.ts │ │ ├── tokens │ │ └── repositories.ts │ │ ├── users │ │ ├── cryptography.ts │ │ └── repositories.ts │ │ ├── validators.ts │ │ └── workspaces │ │ └── repositories.ts └── main │ └── routes │ ├── pageRoutes.spec.ts │ ├── userRoutes.spec.ts │ └── workspaceRoutes.spec.ts ├── tsconfig-build.json └── tsconfig.json /.env-example: -------------------------------------------------------------------------------- 1 | REFRESH_TOKEN_SECRET="123456" 2 | ACCESS_TOKEN_SECRET="123456" 3 | MONGO_URL="" 4 | NODE_ENV="production" 5 | PORT=5000 -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "@typescript-eslint/parser", 3 | "plugins": ["@typescript-eslint", "prettier"], 4 | "extends": [ 5 | "airbnb-base", 6 | "plugin:@typescript-eslint/recommended", 7 | "plugin:prettier/recommended" 8 | ], 9 | "rules": { 10 | "prettier/prettier": "error", 11 | "@typescript-eslint/no-namespace": "off", 12 | "import/prefer-default-export": "off", 13 | "no-useless-constructor": "off", 14 | "consistent-return": "off", 15 | "class-methods-use-this": "off", 16 | "import/no-extraneous-dependencies": "off", 17 | "@typescript-eslint/no-non-null-assertion": "off" 18 | }, 19 | "parserOptions": { 20 | "ecmaVersion": 8, 21 | "sourceType": "module" 22 | }, 23 | "env": { 24 | "es6": true, 25 | "node": true, 26 | "browser": true, 27 | "jest": true 28 | }, 29 | "settings": { 30 | "import/resolver": { 31 | "typescript": {} 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | .vscode 3 | /dist 4 | /coverage 5 | globalConfig.json 6 | .env -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx --no -- commitlint --edit "$1" 5 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx lint-staged -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | tsconfig.json -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 80, 3 | "singleQuote": true, 4 | "trailingComma": "es5", 5 | "tabWidth": 2, 6 | "semi": true, 7 | "bracketSpacing": true, 8 | "arrowParens": "avoid" 9 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Shreyas Manolkar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | module.exports = {extends: ['@commitlint/config-conventional']} 4 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | services: 3 | mongodb: 4 | image: mongo 5 | container_name: mongodb 6 | ports: 7 | - "27017:27017" 8 | volumes: 9 | - mongodb_data:/data/db 10 | volumes: 11 | mongodb_data: -------------------------------------------------------------------------------- /jest-mongodb-config.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | module.exports = { 4 | mongodbMemoryServerOptions: { 5 | binary: { 6 | version: '5.2.0', 7 | skipMD5: true, 8 | }, 9 | autoStart: false, 10 | instance: {}, 11 | }, 12 | }; -------------------------------------------------------------------------------- /src/application/errors/EmailInUseError.ts: -------------------------------------------------------------------------------- 1 | export class EmailInUseError extends Error { 2 | constructor() { 3 | super('Email is already in use'); 4 | this.name = 'EmailInUseError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/application/errors/ForbiddenError.ts: -------------------------------------------------------------------------------- 1 | export class ForbiddenError extends Error { 2 | constructor() { 3 | super('Forbidden'); 4 | this.name = 'ForbiddenError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/application/errors/InvalidPasswordError.ts: -------------------------------------------------------------------------------- 1 | export class InvalidPasswordError extends Error { 2 | constructor() { 3 | super('Invalid Password'); 4 | this.name = 'InvalidPasswordError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/application/errors/InvalidTokenError.ts: -------------------------------------------------------------------------------- 1 | export class InvalidTokenError extends Error { 2 | constructor() { 3 | super('Token was not found'); 4 | this.name = 'InvalidTokenError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/application/errors/InvalidUserError.ts: -------------------------------------------------------------------------------- 1 | export class InvalidUserError extends Error { 2 | constructor() { 3 | super('Invalid User'); 4 | this.name = 'InvalidUserError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/application/errors/PageNotFoundError.ts: -------------------------------------------------------------------------------- 1 | export class PageNotFoundError extends Error { 2 | constructor() { 3 | super('The Page was not found'); 4 | this.name = 'PageNotFoundError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/application/errors/UnauthorizedError.ts: -------------------------------------------------------------------------------- 1 | export class UnauthorizedError extends Error { 2 | constructor() { 3 | super('Unauthorized'); 4 | this.name = 'UnauthorizedError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/application/errors/UserNotFoundError.ts: -------------------------------------------------------------------------------- 1 | export class UserNotFoundError extends Error { 2 | constructor() { 3 | super('The User was not found'); 4 | this.name = 'UserNotFoundError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/application/errors/WorkspaceNotFoundError.ts: -------------------------------------------------------------------------------- 1 | export class WorkspaceNotFoundError extends Error { 2 | constructor() { 3 | super('The Workspace was not found'); 4 | this.name = 'WorkspaceNotFoundError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/application/interfaces/cryptography/HashCompare.ts: -------------------------------------------------------------------------------- 1 | export interface HashComparer { 2 | compare(plaintext: string, hash: string): Promise | boolean; 3 | } 4 | -------------------------------------------------------------------------------- /src/application/interfaces/cryptography/HashGenerator.ts: -------------------------------------------------------------------------------- 1 | export interface HashGenerator { 2 | hash(data: string): Promise | string; 3 | } 4 | -------------------------------------------------------------------------------- /src/application/interfaces/cryptography/JWTGenerator.ts: -------------------------------------------------------------------------------- 1 | export interface JWTGenerator { 2 | generateAccessToken(payload: string): Promise; 3 | generateRefreshToken(payload: string): Promise; 4 | } 5 | -------------------------------------------------------------------------------- /src/application/interfaces/cryptography/JWTVerifier.ts: -------------------------------------------------------------------------------- 1 | export interface JWTVerifier { 2 | verifyAccessToken(jwt: string): Promise; 3 | verifyRefreshToken(jwt: string): Promise; 4 | } 5 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/addToFavoriteRepository.ts: -------------------------------------------------------------------------------- 1 | import { Page } from '@domain/entities/Page'; 2 | 3 | export namespace AddToFavoriteRepository { 4 | export type Request = { 5 | pageId: string; 6 | userId: string; 7 | }; 8 | export type Response = Page; 9 | } 10 | 11 | export interface AddToFavoriteRepository { 12 | addToFavorite( 13 | params: AddToFavoriteRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/createPageRepository.ts: -------------------------------------------------------------------------------- 1 | import { PageProps } from '@domain/entities/Page'; 2 | 3 | export namespace CreatePageRepository { 4 | export type Request = Omit< 5 | PageProps, 6 | 'id' | 'createdAt' | 'updatedAt' | 'reference' 7 | >; 8 | export type Response = string; 9 | } 10 | 11 | export interface CreatePageRepository { 12 | createPage( 13 | pageData: CreatePageRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/deletePageRepository.ts: -------------------------------------------------------------------------------- 1 | export namespace DeletePageRepository { 2 | export type Request = string; 3 | export type Response = void; 4 | } 5 | 6 | export interface DeletePageRepository { 7 | deletePage( 8 | pageId: DeletePageRepository.Request 9 | ): Promise; 10 | } 11 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/deletePagesByWorkspaceIdRepository.ts: -------------------------------------------------------------------------------- 1 | export namespace DeletePagesByWorkspaceIdRepository { 2 | export type Request = string; 3 | export type Response = void; 4 | } 5 | 6 | export interface DeletePagesByWorkspaceIdRepository { 7 | deletePagesByWorkspaceId( 8 | workspaceId: DeletePagesByWorkspaceIdRepository.Request 9 | ): Promise; 10 | } 11 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/getPageByIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { Page } from '@domain/entities/Page'; 2 | 3 | export namespace GetPageByIdRepository { 4 | export type Request = string; 5 | export type Response = Page | null; 6 | } 7 | 8 | export interface GetPageByIdRepository { 9 | getPageById( 10 | pageId: GetPageByIdRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/getPageContentByPageIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { ContentType } from '@domain/entities/Page'; 2 | 3 | export namespace GetPageContentByPageIdRepository { 4 | export type Request = string; 5 | export type Response = ContentType | null; 6 | } 7 | 8 | export interface GetPageContentByPageIdRepository { 9 | getPageContentByPageId( 10 | pageId: GetPageContentByPageIdRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/getPageIdsByPathRepository.ts: -------------------------------------------------------------------------------- 1 | export namespace GetPageIdsByPathRepository { 2 | export type Request = string; 3 | export type Response = string[] | [] | null; 4 | } 5 | 6 | export interface GetPageIdsByPathRepository { 7 | getPageIdsByPath( 8 | path: GetPageIdsByPathRepository.Request 9 | ): Promise; 10 | } 11 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/getPageSettingsByPageIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { PageSettingsType } from '@domain/entities/Page'; 2 | 3 | export namespace GetPageSettingsByPageIdRepository { 4 | export type Request = string; 5 | export type Response = PageSettingsType | null; 6 | } 7 | 8 | export interface GetPageSettingsByPageIdRepository { 9 | getPageSettingsByPageId( 10 | pageId: GetPageSettingsByPageIdRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/removeFromFavoriteRepository.ts: -------------------------------------------------------------------------------- 1 | import { Page } from '@domain/entities/Page'; 2 | 3 | export namespace RemoveFromFavoriteRepository { 4 | export type Request = { 5 | pageId: string; 6 | userId: string; 7 | }; 8 | export type Response = Page; 9 | } 10 | 11 | export interface RemoveFromFavoriteRepository { 12 | removeFromFavorite( 13 | params: RemoveFromFavoriteRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/updatePageContentByPageIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { ContentType, Page } from '@domain/entities/Page'; 2 | 3 | export namespace UpdatePageContentByPageIdRepository { 4 | export type Request = { 5 | pageId: string; 6 | content: ContentType; 7 | }; 8 | export type Response = Page; 9 | } 10 | 11 | export interface UpdatePageContentByPageIdRepository { 12 | updatePageContentByPageId( 13 | params: UpdatePageContentByPageIdRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/updatePageCoverByPageIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { Page } from '@domain/entities/Page'; 2 | 3 | export namespace UpdatePageCoverByPageIdRepository { 4 | export type Request = { 5 | pageId: string; 6 | url: string; 7 | verticalPosition: number; 8 | }; 9 | export type Response = Page; 10 | } 11 | 12 | export interface UpdatePageCoverByPageIdRepository { 13 | updatePageCoverByPageId( 14 | params: UpdatePageCoverByPageIdRepository.Request 15 | ): Promise; 16 | } 17 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/updatePageIconByPageIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { Page } from '@domain/entities/Page'; 2 | 3 | export namespace UpdatePageIconByPageIdRepository { 4 | export type Request = { 5 | pageId: string; 6 | icon: string; 7 | }; 8 | export type Response = Page; 9 | } 10 | 11 | export interface UpdatePageIconByPageIdRepository { 12 | updatePageIconByPageId( 13 | params: UpdatePageIconByPageIdRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/updatePagePathByPageIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { Page } from '@domain/entities/Page'; 2 | 3 | export namespace UpdatePagePathByPageIdRepository { 4 | export type Request = { 5 | pageId: string; 6 | path: string; 7 | }; 8 | export type Response = Page; 9 | } 10 | 11 | export interface UpdatePagePathByPageIdRepository { 12 | updatePagePathByPageId( 13 | params: UpdatePagePathByPageIdRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/updatePageSettingsByPageIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { Page, PageSettingsType } from '@domain/entities/Page'; 2 | 3 | export namespace UpdatePageSettingsByPageIdRepository { 4 | export type Request = { 5 | pageId: string; 6 | pageSettings: PageSettingsType; 7 | }; 8 | export type Response = Page; 9 | } 10 | 11 | export interface UpdatePageSettingsByPageIdRepository { 12 | updatePageSettingsByPageId( 13 | params: UpdatePageSettingsByPageIdRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/pages/updatePageTitleByPageIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { Page } from '@domain/entities/Page'; 2 | 3 | export namespace UpdatePageTitleByPageIdRepository { 4 | export type Request = { 5 | pageId: string; 6 | title: string; 7 | }; 8 | export type Response = Page; 9 | } 10 | 11 | export interface UpdatePageTitleByPageIdRepository { 12 | updatePageTitleByPageId( 13 | params: UpdatePageTitleByPageIdRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/tokens/createTokenRepository.ts: -------------------------------------------------------------------------------- 1 | export namespace CreateTokenRepository { 2 | export type Request = string; 3 | export type Response = string; 4 | } 5 | 6 | export interface CreateTokenRepository { 7 | createToken( 8 | token: CreateTokenRepository.Request 9 | ): Promise; 10 | } 11 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/tokens/deleteTokenRepository.ts: -------------------------------------------------------------------------------- 1 | export namespace DeleteTokenRepository { 2 | export type Request = string; 3 | export type Response = void; 4 | } 5 | 6 | export interface DeleteTokenRepository { 7 | deleteToken( 8 | token: DeleteTokenRepository.Request 9 | ): Promise; 10 | } 11 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/tokens/getTokenRepository.ts: -------------------------------------------------------------------------------- 1 | export namespace GetTokenRepository { 2 | export type Request = string; 3 | export type Response = { 4 | _id: string; 5 | token: string; 6 | createdAt: Date; 7 | } | null; 8 | } 9 | 10 | export interface GetTokenRepository { 11 | getToken( 12 | token: GetTokenRepository.Request 13 | ): Promise; 14 | } 15 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/addPageIdToFavoritesByWorkspaceIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { User } from '@domain/entities/User'; 2 | 3 | export namespace AddPageIdToFavoritesByWorkspaceIdRepository { 4 | export type Request = { 5 | userId: string; 6 | workspaceId: string; 7 | pageId: string; 8 | }; 9 | export type Response = User; 10 | } 11 | 12 | export interface AddPageIdToFavoritesByWorkspaceIdRepository { 13 | addPageIdToFavoritesByWorkspaceId( 14 | params: AddPageIdToFavoritesByWorkspaceIdRepository.Request 15 | ): Promise; 16 | } 17 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/addWorkspaceByUserIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { User } from '@domain/entities/User'; 2 | 3 | export namespace AddWorkspaceByUserIdRepository { 4 | export type Request = { 5 | userId: string; 6 | workspaceId: string; 7 | workspaceName: string; 8 | workspaceIcon: string; 9 | }; 10 | export type Response = User; 11 | } 12 | 13 | export interface AddWorkspaceByUserIdRepository { 14 | addWorkspaceByUserId( 15 | params: AddWorkspaceByUserIdRepository.Request 16 | ): Promise; 17 | } 18 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/createUserRepository.ts: -------------------------------------------------------------------------------- 1 | import { UserProps } from '@domain/entities/User'; 2 | 3 | export namespace CreateUserRepository { 4 | export type Request = Omit; 5 | export type Response = string; 6 | } 7 | 8 | export interface CreateUserRepository { 9 | createUser( 10 | userData: CreateUserRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/deleteUserRepository.ts: -------------------------------------------------------------------------------- 1 | export namespace DeleteUserRepository { 2 | export type Request = string; 3 | export type Response = void; 4 | } 5 | 6 | export interface DeleteUserRepository { 7 | deleteUser( 8 | userId: DeleteUserRepository.Request 9 | ): Promise; 10 | } 11 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/getFavoritesByWorkspaceIdRepository.ts: -------------------------------------------------------------------------------- 1 | export namespace GetFavoritesByWorkspaceIdRepository { 2 | export type Request = { 3 | userId: string; 4 | workspaceId: string; 5 | }; 6 | export type Response = string[] | null; 7 | } 8 | 9 | export interface GetFavoritesByWorkspaceIdRepository { 10 | getFavoritesByWorkspaceId( 11 | params: GetFavoritesByWorkspaceIdRepository.Request 12 | ): Promise; 13 | } 14 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/getUserByIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { User } from '@domain/entities/User'; 2 | 3 | export namespace GetUserByIdRepository { 4 | export type Request = string; 5 | export type Response = User | null; 6 | } 7 | 8 | export interface GetUserByIdRepository { 9 | getUserById( 10 | userId: GetUserByIdRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/getWorkspacesByUserIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceType } from '@domain/entities/User'; 2 | 3 | export namespace GetWorkspacesByUserIdRepository { 4 | export type Request = string; 5 | export type Response = WorkspaceType[] | null; 6 | } 7 | 8 | export interface GetWorkspacesByUserIdRepository { 9 | getWorkspacesByUserId( 10 | userId: GetWorkspacesByUserIdRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/loadUserByEmailRepository.ts: -------------------------------------------------------------------------------- 1 | import { User } from '@domain/entities/User'; 2 | 3 | export namespace LoadUserByEmailRepository { 4 | export type Request = string; 5 | export type Response = User | null; 6 | } 7 | 8 | export interface LoadUserByEmailRepository { 9 | loadUserByEmail( 10 | email: LoadUserByEmailRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/removePageIdFromFavoritesByWorkspaceIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { User } from '@domain/entities/User'; 2 | 3 | export namespace RemovePageIdFromFavoritesByWorkspaceIdRepository { 4 | export type Request = { 5 | userId: string; 6 | workspaceId: string; 7 | pageId: string; 8 | }; 9 | export type Response = User; 10 | } 11 | 12 | export interface RemovePageIdFromFavoritesByWorkspaceIdRepository { 13 | removePageIdFromFavoritesByWorkspaceId( 14 | params: RemovePageIdFromFavoritesByWorkspaceIdRepository.Request 15 | ): Promise; 16 | } 17 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/removeWorkspaceByUserIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { User } from '@domain/entities/User'; 2 | 3 | export namespace RemoveWorkspaceByUserIdRepository { 4 | export type Request = { 5 | userId: string; 6 | workspaceId: string; 7 | }; 8 | export type Response = User; 9 | } 10 | 11 | export interface RemoveWorkspaceByUserIdRepository { 12 | removeWorkspaceByUserId( 13 | params: RemoveWorkspaceByUserIdRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/updateUserProfilePictureRepository.ts: -------------------------------------------------------------------------------- 1 | import { User } from '@domain/entities/User'; 2 | 3 | export namespace UpdateUserProfilePictureRepository { 4 | export type Request = { userId: string; url: string }; 5 | export type Response = User; 6 | } 7 | 8 | export interface UpdateUserProfilePictureRepository { 9 | updateUserProfilePicture( 10 | params: UpdateUserProfilePictureRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/updateUserRepository.ts: -------------------------------------------------------------------------------- 1 | import { User, UserProps } from '@domain/entities/User'; 2 | 3 | export namespace UpdateUserRepository { 4 | export type Request = { 5 | userId: string; 6 | userData: Partial< 7 | Omit< 8 | UserProps, 9 | 'id' | 'createdAt' | 'updatedAt' | 'profilePicture' | 'workspaces' 10 | > 11 | >; 12 | }; 13 | export type Response = User; 14 | } 15 | 16 | export interface UpdateUserRepository { 17 | updateUser( 18 | params: UpdateUserRepository.Request 19 | ): Promise; 20 | } 21 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/users/updateUserWorkspaceMetaDataByWorkspaceIdRepository.ts: -------------------------------------------------------------------------------- 1 | export type updatedWorkspaceDataType = { 2 | workspaceName?: string; 3 | workspaceIcon?: string; 4 | }; 5 | 6 | export namespace UpdateUserWorkspaceMetaDataByWorkspaceIdRepository { 7 | export type Request = { 8 | userId: string; 9 | workspaceId: string; 10 | workspaceData: updatedWorkspaceDataType; 11 | }; 12 | export type Response = void; 13 | } 14 | 15 | export interface UpdateUserWorkspaceMetaDataByWorkspaceIdRepository { 16 | updateUserWorkspaceMetaDataByWorkspaceId( 17 | params: UpdateUserWorkspaceMetaDataByWorkspaceIdRepository.Request 18 | ): Promise; 19 | } 20 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/addMemberByWorkspaceIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { Workspace } from '@domain/entities/Workspace'; 2 | 3 | export namespace AddMemberByWorkspaceIdRepository { 4 | export type Request = { 5 | workspaceId: string; 6 | memberId: string; 7 | }; 8 | export type Response = Workspace; 9 | } 10 | 11 | export interface AddMemberByWorkspaceIdRepository { 12 | addMemberByWorkspaceId( 13 | params: AddMemberByWorkspaceIdRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/addPageRepository.ts: -------------------------------------------------------------------------------- 1 | import { PageType, Workspace } from '@domain/entities/Workspace'; 2 | 3 | export namespace AddPageRepository { 4 | export type Request = { 5 | workspaceId: string; 6 | pageData: PageType; 7 | }; 8 | export type Response = Workspace; 9 | } 10 | 11 | export interface AddPageRepository { 12 | addPage( 13 | params: AddPageRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/createWorkspaceRepository.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceProps } from '@domain/entities/Workspace'; 2 | 3 | export namespace CreateWorkspaceRepository { 4 | export type Request = Omit; 5 | export type Response = string; 6 | } 7 | 8 | export interface CreateWorkspaceRepository { 9 | createWorkspace( 10 | workspaceData: CreateWorkspaceRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/deleteWorkspaceRepository.ts: -------------------------------------------------------------------------------- 1 | export namespace DeleteWorkspaceRepository { 2 | export type Request = string; 3 | export type Response = void; 4 | } 5 | 6 | export interface DeleteWorkspaceRepository { 7 | deleteWorkspace( 8 | workspaceId: DeleteWorkspaceRepository.Request 9 | ): Promise; 10 | } 11 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/getAllMembersByWorkspaceIdRepository.ts: -------------------------------------------------------------------------------- 1 | export namespace GetAllMembersByWorkspaceIdRepository { 2 | export type Request = string; 3 | export type Response = string[] | null; 4 | } 5 | 6 | export interface GetAllMembersByWorkspaceIdRepository { 7 | getAllMembersByWorkspaceId( 8 | workspaceId: GetAllMembersByWorkspaceIdRepository.Request 9 | ): Promise; 10 | } 11 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/getAllRootPagesRepository.ts: -------------------------------------------------------------------------------- 1 | import { PageType } from '@domain/entities/Workspace'; 2 | 3 | export namespace GetAllRootPagesRepository { 4 | export type Request = string; 5 | export type Response = PageType[] | null; 6 | } 7 | 8 | export interface GetAllRootPagesRepository { 9 | getAllRootPages( 10 | workspaceId: GetAllRootPagesRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/getChildrensByPageReferenceRepsoitory.ts: -------------------------------------------------------------------------------- 1 | import { PageType } from '@domain/entities/Workspace'; 2 | 3 | export namespace GetChildrensByPageReferenceRepository { 4 | export type Request = { workspaceId: string; pageReference: string }; 5 | export type Response = PageType[] | null; 6 | } 7 | 8 | export interface GetChildrensByPageReferenceRepository { 9 | getChildrensByPageId( 10 | params: GetChildrensByPageReferenceRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/getWorkspaceByIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { Workspace } from '@domain/entities/Workspace'; 2 | 3 | export namespace GetWorkspaceByIdRepository { 4 | export type Request = string; 5 | export type Response = Workspace | null; 6 | } 7 | 8 | export interface GetWorkspaceByIdRepository { 9 | getWorkspaceById( 10 | workspaceId: GetWorkspaceByIdRepository.Request 11 | ): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/removeMemberByWorkspaceIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { Workspace } from '@domain/entities/Workspace'; 2 | 3 | export namespace RemoveMemberByWorkspaceIdRepository { 4 | export type Request = { 5 | workspaceId: string; 6 | memberId: string; 7 | }; 8 | export type Response = Workspace; 9 | } 10 | 11 | export interface RemoveMemberByWorkspaceIdRepository { 12 | removeMemberByWorkspaceId( 13 | params: RemoveMemberByWorkspaceIdRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/removePageByPageIdRepository.ts: -------------------------------------------------------------------------------- 1 | import { Workspace } from '@domain/entities/Workspace'; 2 | 3 | export namespace RemovePageByPageIdRepository { 4 | export type Request = { 5 | workspaceId: string; 6 | pageId: string; 7 | }; 8 | export type Response = Workspace; 9 | } 10 | 11 | export interface RemovePageByPageIdRepository { 12 | removePageByPageId( 13 | params: RemovePageByPageIdRepository.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/updateWorkspacePagesMetaDataByPageIdRepository.ts: -------------------------------------------------------------------------------- 1 | export type updatedPagesDataType = { 2 | title?: string; 3 | icon?: string; 4 | reference?: string; 5 | path?: string; 6 | }; 7 | 8 | export namespace UpdateWorkspacePagesMetaDataByPageIdRepository { 9 | export type Request = { 10 | workspaceId: string; 11 | pageId: string; 12 | pageData: updatedPagesDataType; 13 | }; 14 | export type Response = void; 15 | } 16 | 17 | export interface UpdateWorkspacePagesMetaDataByPageIdRepository { 18 | updateWorkspacePagesMetaDataByPageId( 19 | params: UpdateWorkspacePagesMetaDataByPageIdRepository.Request 20 | ): Promise; 21 | } 22 | -------------------------------------------------------------------------------- /src/application/interfaces/repositories/workspaces/updateWorkspaceRepository.ts: -------------------------------------------------------------------------------- 1 | import { Workspace, WorkspaceProps } from '@domain/entities/Workspace'; 2 | 3 | export namespace UpdateWorkspaceRepository { 4 | export type Request = { 5 | workspaceId: string; 6 | workspaceData: Partial< 7 | Omit 8 | >; 9 | }; 10 | export type Response = Workspace; 11 | } 12 | 13 | export interface UpdateWorkspaceRepository { 14 | updateWorkspace( 15 | params: UpdateWorkspaceRepository.Request 16 | ): Promise; 17 | } 18 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/UseCase.ts: -------------------------------------------------------------------------------- 1 | export interface UseCase { 2 | execute(request: TRequest): Promise; 3 | } 4 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/addToFavoriteInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | 4 | export namespace AddToFavoriteInterface { 5 | export type Request = { 6 | pageId: string; 7 | userId: string; 8 | }; 9 | export type Response = void | PageNotFoundError; 10 | } 11 | 12 | export interface AddToFavoriteInterface 13 | extends UseCase< 14 | AddToFavoriteInterface.Request, 15 | AddToFavoriteInterface.Response 16 | > { 17 | execute( 18 | params: AddToFavoriteInterface.Request 19 | ): Promise; 20 | } 21 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/authorizationInterface.ts: -------------------------------------------------------------------------------- 1 | import { ForbiddenError } from '@application/errors/ForbiddenError'; 2 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 3 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 4 | 5 | export namespace AuthorizationInterface { 6 | export type Request = { 7 | userId: string; 8 | pageId: string; 9 | }; 10 | export type Response = string | PageNotFoundError | ForbiddenError; 11 | } 12 | 13 | export interface AuthorizationInterface 14 | extends UseCase< 15 | AuthorizationInterface.Request, 16 | AuthorizationInterface.Response 17 | > { 18 | execute( 19 | params: AuthorizationInterface.Request 20 | ): Promise; 21 | } 22 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/createPageInterface.ts: -------------------------------------------------------------------------------- 1 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 2 | import { PageProps } from '@domain/entities/Page'; 3 | 4 | export namespace CreatePageInterface { 5 | export type Request = Omit< 6 | PageProps, 7 | 'id' | 'createdAt' | 'updatedAt' | 'reference' 8 | >; 9 | export type Response = string; 10 | } 11 | 12 | export interface CreatePageInterface 13 | extends UseCase { 14 | execute( 15 | pageData: CreatePageInterface.Request 16 | ): Promise; 17 | } 18 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/deletePageInterface.ts: -------------------------------------------------------------------------------- 1 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 2 | 3 | export namespace DeletePageInterface { 4 | export type Request = string; 5 | export type Response = void; 6 | } 7 | 8 | export interface DeletePageInterface 9 | extends UseCase { 10 | execute( 11 | pageId: DeletePageInterface.Request 12 | ): Promise; 13 | } 14 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/deletePagesByWorkspaceIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 2 | 3 | export namespace DeletePagesByWorkspaceIdInterface { 4 | export type Request = string; 5 | export type Response = void; 6 | } 7 | 8 | export interface DeletePagesByWorkspaceIdInterface 9 | extends UseCase< 10 | DeletePagesByWorkspaceIdInterface.Request, 11 | DeletePagesByWorkspaceIdInterface.Response 12 | > { 13 | execute( 14 | workspaceId: DeletePagesByWorkspaceIdInterface.Request 15 | ): Promise; 16 | } 17 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/getPageByIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { Page } from '@domain/entities/Page'; 4 | 5 | export namespace GetPageByIdInterface { 6 | export type Request = string; 7 | export type Response = Page | PageNotFoundError; 8 | } 9 | 10 | export interface GetPageByIdInterface 11 | extends UseCase { 12 | execute( 13 | pageId: GetPageByIdInterface.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/getPageContentByPageIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { ContentType } from '@domain/entities/Page'; 4 | 5 | export namespace GetPageContentByPageIdInterface { 6 | export type Request = string; 7 | export type Response = ContentType | PageNotFoundError; 8 | } 9 | 10 | export interface GetPageContentByPageIdInterface 11 | extends UseCase< 12 | GetPageContentByPageIdInterface.Request, 13 | GetPageContentByPageIdInterface.Response 14 | > { 15 | execute( 16 | pageId: GetPageContentByPageIdInterface.Request 17 | ): Promise; 18 | } 19 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/getPageIdsByPathInterface.ts: -------------------------------------------------------------------------------- 1 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 2 | 3 | export namespace GetPageIdsByPathInterface { 4 | export type Request = string; 5 | export type Response = string[] | []; 6 | } 7 | 8 | export interface GetPageIdsByPathInterface 9 | extends UseCase< 10 | GetPageIdsByPathInterface.Request, 11 | GetPageIdsByPathInterface.Response 12 | > { 13 | execute( 14 | path: GetPageIdsByPathInterface.Request 15 | ): Promise; 16 | } 17 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/getPageSettingsByPageIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { PageSettingsType } from '@domain/entities/Page'; 4 | 5 | export namespace GetPageSettingsByPageIdInterface { 6 | export type Request = string; 7 | export type Response = PageSettingsType | PageNotFoundError; 8 | } 9 | 10 | export interface GetPageSettingsByPageIdInterface 11 | extends UseCase< 12 | GetPageSettingsByPageIdInterface.Request, 13 | GetPageSettingsByPageIdInterface.Response 14 | > { 15 | execute( 16 | pageId: GetPageSettingsByPageIdInterface.Request 17 | ): Promise; 18 | } 19 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/removeFromFavoriteInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | 4 | export namespace RemoveFromFavoriteInterface { 5 | export type Request = { 6 | pageId: string; 7 | userId: string; 8 | }; 9 | export type Response = void | PageNotFoundError; 10 | } 11 | 12 | export interface RemoveFromFavoriteInterface 13 | extends UseCase< 14 | RemoveFromFavoriteInterface.Request, 15 | RemoveFromFavoriteInterface.Response 16 | > { 17 | execute( 18 | params: RemoveFromFavoriteInterface.Request 19 | ): Promise; 20 | } 21 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/updatePageContentByPageIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { ContentType, Page } from '@domain/entities/Page'; 4 | 5 | export namespace UpdatePageContentByPageIdInterface { 6 | export type pageIdType = string; 7 | export type contentType = ContentType; 8 | 9 | export type Request = { 10 | pageId: pageIdType; 11 | content: contentType; 12 | }; 13 | export type Response = Page | PageNotFoundError; 14 | } 15 | 16 | export interface UpdatePageContentByPageIdInterface 17 | extends UseCase< 18 | UpdatePageContentByPageIdInterface.Request, 19 | UpdatePageContentByPageIdInterface.Response 20 | > { 21 | execute( 22 | params: UpdatePageContentByPageIdInterface.Request 23 | ): Promise; 24 | } 25 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/updatePageCoverByPageIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { Page } from '@domain/entities/Page'; 4 | 5 | export namespace UpdatePageCoverByPageIdInterface { 6 | export type Request = { 7 | pageId: string; 8 | url: string; 9 | verticalPosition: number; 10 | }; 11 | export type Response = Page | PageNotFoundError; 12 | } 13 | 14 | export interface UpdatePageCoverByPageIdInterface 15 | extends UseCase< 16 | UpdatePageCoverByPageIdInterface.Request, 17 | UpdatePageCoverByPageIdInterface.Response 18 | > { 19 | execute( 20 | params: UpdatePageCoverByPageIdInterface.Request 21 | ): Promise; 22 | } 23 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/updatePageIconByPageIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { Page } from '@domain/entities/Page'; 4 | 5 | export namespace UpdatePageIconByPageIdInterface { 6 | export type Request = { 7 | pageId: string; 8 | icon: string; 9 | }; 10 | export type Response = Page | PageNotFoundError; 11 | } 12 | 13 | export interface UpdatePageIconByPageIdInterface 14 | extends UseCase< 15 | UpdatePageIconByPageIdInterface.Request, 16 | UpdatePageIconByPageIdInterface.Response 17 | > { 18 | execute( 19 | params: UpdatePageIconByPageIdInterface.Request 20 | ): Promise; 21 | } 22 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/updatePagePathByPageIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { Page } from '@domain/entities/Page'; 4 | 5 | export namespace UpdatePagePathByPageIdInterface { 6 | export type Request = { 7 | pageId: string; 8 | path: string; 9 | }; 10 | export type Response = Page | PageNotFoundError; 11 | } 12 | 13 | export interface UpdatePagePathByPageIdInterface 14 | extends UseCase< 15 | UpdatePagePathByPageIdInterface.Request, 16 | UpdatePagePathByPageIdInterface.Response 17 | > { 18 | execute( 19 | params: UpdatePagePathByPageIdInterface.Request 20 | ): Promise; 21 | } 22 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/updatePageSettingsByPageIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { Page, PageSettingsType } from '@domain/entities/Page'; 4 | 5 | export namespace UpdatePageSettingsByPageIdInterface { 6 | export type pageIdType = string; 7 | export type pageSettingsType = PageSettingsType; 8 | 9 | export type Request = { 10 | pageId: pageIdType; 11 | settings: PageSettingsType; 12 | }; 13 | export type Response = Page | PageNotFoundError; 14 | } 15 | 16 | export interface UpdatePageSettingsByPageIdInterface 17 | extends UseCase< 18 | UpdatePageSettingsByPageIdInterface.Request, 19 | UpdatePageSettingsByPageIdInterface.Response 20 | > { 21 | execute( 22 | params: UpdatePageSettingsByPageIdInterface.Request 23 | ): Promise; 24 | } 25 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/pages/updatePageTitleByPageIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { Page } from '@domain/entities/Page'; 4 | 5 | export namespace UpdatePageTitleByPageIdInterface { 6 | export type Request = { 7 | pageId: string; 8 | title: string; 9 | }; 10 | export type Response = Page | PageNotFoundError; 11 | } 12 | 13 | export interface UpdatePageTitleByPageIdInterface 14 | extends UseCase< 15 | UpdatePageTitleByPageIdInterface.Request, 16 | UpdatePageTitleByPageIdInterface.Response 17 | > { 18 | execute( 19 | params: UpdatePageTitleByPageIdInterface.Request 20 | ): Promise; 21 | } 22 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/AddPageIdToFavoritesByWorkspaceIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | 4 | export namespace AddPageIdToFavoritesByWorkspaceIdInterface { 5 | export type Request = { 6 | userId: string; 7 | workspaceId: string; 8 | pageId: string; 9 | }; 10 | export type Response = void | WorkspaceNotFoundError; 11 | } 12 | 13 | export interface AddPageIdToFavoritesByWorkspaceIdInterface 14 | extends UseCase< 15 | AddPageIdToFavoritesByWorkspaceIdInterface.Request, 16 | AddPageIdToFavoritesByWorkspaceIdInterface.Response 17 | > { 18 | execute( 19 | params: AddPageIdToFavoritesByWorkspaceIdInterface.Request 20 | ): Promise; 21 | } 22 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/AddWorkspaceByUserIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { UserNotFoundError } from '@application/errors/UserNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | 4 | export namespace AddWorkspaceByUserIdInterface { 5 | export type Request = { 6 | userId: string; 7 | workspaceId: string; 8 | workspaceName: string; 9 | workspaceIcon: string; 10 | }; 11 | export type Response = void | UserNotFoundError; 12 | } 13 | 14 | export interface AddWorkspaceByUserIdInterface 15 | extends UseCase< 16 | AddWorkspaceByUserIdInterface.Request, 17 | AddWorkspaceByUserIdInterface.Response 18 | > { 19 | execute( 20 | params: AddWorkspaceByUserIdInterface.Request 21 | ): Promise; 22 | } 23 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/AuthenticateInterface.ts: -------------------------------------------------------------------------------- 1 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 2 | import { ForbiddenError } from '@application/errors/ForbiddenError'; 3 | 4 | export namespace AuthenticateInterface { 5 | export type Request = string; 6 | export type Response = string | ForbiddenError; 7 | } 8 | 9 | export interface AuthenticateInterface 10 | extends UseCase< 11 | AuthenticateInterface.Request, 12 | AuthenticateInterface.Response 13 | > { 14 | execute( 15 | authenticationToken: AuthenticateInterface.Request 16 | ): Promise; 17 | } 18 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/DeleteUserInterface.ts: -------------------------------------------------------------------------------- 1 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 2 | 3 | export namespace DeleteUserInterface { 4 | export type Request = string; 5 | export type Response = void; 6 | } 7 | 8 | export interface DeleteUserInterface 9 | extends UseCase { 10 | execute( 11 | userId: DeleteUserInterface.Request 12 | ): Promise; 13 | } 14 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/GetAccessTokenInterface.ts: -------------------------------------------------------------------------------- 1 | import { ForbiddenError } from '@application/errors/ForbiddenError'; 2 | import { InvalidTokenError } from '@application/errors/InvalidTokenError'; 3 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 4 | 5 | export namespace GetAccessTokenInterface { 6 | export type Request = string; 7 | export type Response = 8 | | { accessToken: string } 9 | | InvalidTokenError 10 | | ForbiddenError; 11 | } 12 | 13 | export interface GetAccessTokenInterface 14 | extends UseCase< 15 | GetAccessTokenInterface.Request, 16 | GetAccessTokenInterface.Response 17 | > { 18 | execute( 19 | token: GetAccessTokenInterface.Request 20 | ): Promise; 21 | } 22 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/GetFavoritesByWorkspaceIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | 4 | export namespace GetFavoritesByWorkspaceIdInterface { 5 | export type Request = { 6 | userId: string; 7 | workspaceId: string; 8 | }; 9 | export type Response = string[] | WorkspaceNotFoundError; 10 | } 11 | 12 | export interface GetFavoritesByWorkspaceIdInterface 13 | extends UseCase< 14 | GetFavoritesByWorkspaceIdInterface.Request, 15 | GetFavoritesByWorkspaceIdInterface.Response 16 | > { 17 | execute( 18 | params: GetFavoritesByWorkspaceIdInterface.Request 19 | ): Promise; 20 | } 21 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/GetUserByIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { UserNotFoundError } from '@application/errors/UserNotFoundError'; 2 | import { User } from '@domain/entities/User'; 3 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 4 | 5 | export namespace GetUserByIdInterface { 6 | export type Request = string; 7 | export type Response = User | UserNotFoundError; 8 | } 9 | 10 | export interface GetUserByIdInterface 11 | extends UseCase { 12 | execute( 13 | userId: GetUserByIdInterface.Request 14 | ): Promise; 15 | } 16 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/GetWorkspacesByUserIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceType } from '@domain/entities/User'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | 4 | export namespace GetWorkspacesByUserIdInterface { 5 | export type Request = string; 6 | export type Response = WorkspaceType[]; 7 | } 8 | 9 | export interface GetWorkspacesByUserIdInterface 10 | extends UseCase< 11 | GetWorkspacesByUserIdInterface.Request, 12 | GetWorkspacesByUserIdInterface.Response 13 | > { 14 | execute( 15 | userId: GetWorkspacesByUserIdInterface.Request 16 | ): Promise; 17 | } 18 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/RemovePageIdFromFavoritesByWorkspaceIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | 4 | export namespace RemovePageIdFromFavoritesByWorkspaceIdInterface { 5 | export type Request = { 6 | userId: string; 7 | workspaceId: string; 8 | pageId: string; 9 | }; 10 | export type Response = void | WorkspaceNotFoundError; 11 | } 12 | 13 | export interface RemovePageIdFromFavoritesByWorkspaceIdInterface 14 | extends UseCase< 15 | RemovePageIdFromFavoritesByWorkspaceIdInterface.Request, 16 | RemovePageIdFromFavoritesByWorkspaceIdInterface.Response 17 | > { 18 | execute( 19 | params: RemovePageIdFromFavoritesByWorkspaceIdInterface.Request 20 | ): Promise; 21 | } 22 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/RemoveWorkspaceByUserIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 2 | 3 | export namespace RemoveWorkspaceByUserIdInterface { 4 | export type Request = { 5 | userId: string; 6 | workspaceId: string; 7 | }; 8 | export type Response = void; 9 | } 10 | 11 | export interface RemoveWorkspaceByUserIdInterface 12 | extends UseCase< 13 | RemoveWorkspaceByUserIdInterface.Request, 14 | RemoveWorkspaceByUserIdInterface.Response 15 | > { 16 | execute( 17 | params: RemoveWorkspaceByUserIdInterface.Request 18 | ): Promise; 19 | } 20 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/SignInInterface.ts: -------------------------------------------------------------------------------- 1 | import { InvalidPasswordError } from '@application/errors/InvalidPasswordError'; 2 | import { InvalidUserError } from '@application/errors/InvalidUserError'; 3 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 4 | 5 | export namespace SignInInterface { 6 | export type Request = { email: string; password: string }; 7 | export type Response = 8 | | { accessToken: string; refreshToken: string } 9 | | InvalidUserError 10 | | InvalidPasswordError; 11 | } 12 | 13 | export interface SignInInterface 14 | extends UseCase { 15 | execute( 16 | credentials: SignInInterface.Request 17 | ): Promise; 18 | } 19 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/SignOutInterface.ts: -------------------------------------------------------------------------------- 1 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 2 | 3 | export namespace SignOutInterface { 4 | export type Request = string; 5 | export type Response = void; 6 | } 7 | 8 | export interface SignOutInterface 9 | extends UseCase { 10 | execute(token: SignOutInterface.Request): Promise; 11 | } 12 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/SignUpInterface.ts: -------------------------------------------------------------------------------- 1 | import { EmailInUseError } from '@application/errors/EmailInUseError'; 2 | import { UserProps } from '@domain/entities/User'; 3 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 4 | 5 | export namespace SignUpInterface { 6 | export type Request = Omit; 7 | export type Response = string | EmailInUseError; 8 | } 9 | 10 | export interface SignUpInterface 11 | extends UseCase { 12 | execute(userData: SignUpInterface.Request): Promise; 13 | } 14 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/UpdateUserInterface.ts: -------------------------------------------------------------------------------- 1 | import { UserNotFoundError } from '@application/errors/UserNotFoundError'; 2 | import { User, UserProps } from '@domain/entities/User'; 3 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 4 | 5 | export namespace UpdateUserInterface { 6 | export type UserIdType = string; 7 | export type UserDataType = Partial< 8 | Omit 9 | >; 10 | 11 | export type Request = { 12 | userId: UserIdType; 13 | userData: UserDataType; 14 | }; 15 | export type Response = User | UserNotFoundError; 16 | } 17 | 18 | export interface UpdateUserInterface 19 | extends UseCase { 20 | execute( 21 | params: UpdateUserInterface.Request 22 | ): Promise; 23 | } 24 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/UpdateUserProfilePictureInterface.ts: -------------------------------------------------------------------------------- 1 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 2 | 3 | export namespace UpdateUserProfilePictureInterface { 4 | export type Request = { 5 | userId: string; 6 | url: string; 7 | }; 8 | export type Response = void; 9 | } 10 | 11 | export interface UpdateUserProfilePictureInterface 12 | extends UseCase< 13 | UpdateUserProfilePictureInterface.Request, 14 | UpdateUserProfilePictureInterface.Response 15 | > { 16 | execute( 17 | params: UpdateUserProfilePictureInterface.Request 18 | ): Promise; 19 | } 20 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/users/UpdateUserWorkspaceMetaDataByWorkspaceIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { UserNotFoundError } from '@application/errors/UserNotFoundError'; 2 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 3 | import { updatedWorkspaceDataType } from '@application/interfaces/repositories/users/updateUserWorkspaceMetaDataByWorkspaceIdRepository'; 4 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 5 | 6 | export namespace UpdateUserWorkspaceMetaDataByWorkspaceIdInterface { 7 | export type Request = { 8 | userId: string; 9 | workspaceId: string; 10 | workspaceData: updatedWorkspaceDataType; 11 | }; 12 | export type Response = void | UserNotFoundError | WorkspaceNotFoundError; 13 | } 14 | 15 | export interface UpdateUserWorkspaceMetaDataByWorkspaceIdInterface 16 | extends UseCase< 17 | UpdateUserWorkspaceMetaDataByWorkspaceIdInterface.Request, 18 | UpdateUserWorkspaceMetaDataByWorkspaceIdInterface.Response 19 | > { 20 | execute( 21 | params: UpdateUserWorkspaceMetaDataByWorkspaceIdInterface.Request 22 | ): Promise; 23 | } 24 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/AddMemberByWorkspaceIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | 4 | export namespace AddMemberByWorkspaceIdInterface { 5 | export type Request = { 6 | workspaceId: string; 7 | memberId: string; 8 | }; 9 | export type Response = void | WorkspaceNotFoundError; 10 | } 11 | 12 | export interface AddMemberByWorkspaceIdInterface 13 | extends UseCase< 14 | AddMemberByWorkspaceIdInterface.Request, 15 | AddMemberByWorkspaceIdInterface.Response 16 | > { 17 | execute( 18 | params: AddMemberByWorkspaceIdInterface.Request 19 | ): Promise; 20 | } 21 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/AddPageInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { PageType, Workspace } from '@domain/entities/Workspace'; 4 | 5 | export namespace AddPageInterface { 6 | export type Request = { 7 | workspaceId: string; 8 | pageData: PageType; 9 | }; 10 | export type Response = Workspace | WorkspaceNotFoundError; 11 | } 12 | 13 | export interface AddPageInterface 14 | extends UseCase { 15 | execute(params: AddPageInterface.Request): Promise; 16 | } 17 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/CreateWorkspaceInterface.ts: -------------------------------------------------------------------------------- 1 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 2 | import { WorkspaceProps } from '@domain/entities/Workspace'; 3 | 4 | export namespace CreateWorkspaceInterface { 5 | export type Request = Omit; 6 | export type Response = string; 7 | } 8 | 9 | export interface CreateWorkspaceInterface 10 | extends UseCase< 11 | CreateWorkspaceInterface.Request, 12 | CreateWorkspaceInterface.Response 13 | > { 14 | execute( 15 | workspaceData: CreateWorkspaceInterface.Request 16 | ): Promise; 17 | } 18 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/DeleteWorkspaceInterface.ts: -------------------------------------------------------------------------------- 1 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 2 | 3 | export namespace DeleteWorkspaceInterface { 4 | export type Request = string; 5 | export type Response = void; 6 | } 7 | 8 | export interface DeleteWorkspaceInterface 9 | extends UseCase< 10 | DeleteWorkspaceInterface.Request, 11 | DeleteWorkspaceInterface.Response 12 | > { 13 | execute( 14 | workspaceId: DeleteWorkspaceInterface.Request 15 | ): Promise; 16 | } 17 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/GetAllMembersByWorkspaceIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | 4 | export namespace GetAllMembersByWorkspaceIdInterface { 5 | export type Request = string; 6 | export type Response = string[] | WorkspaceNotFoundError | null; 7 | } 8 | 9 | export interface GetAllMembersByWorkspaceIdInterface 10 | extends UseCase< 11 | GetAllMembersByWorkspaceIdInterface.Request, 12 | GetAllMembersByWorkspaceIdInterface.Response 13 | > { 14 | execute( 15 | params: GetAllMembersByWorkspaceIdInterface.Request 16 | ): Promise; 17 | } 18 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/GetAllRootPagesInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { PageType } from '@domain/entities/Workspace'; 4 | 5 | export namespace GetAllRootPagesInterface { 6 | export type Request = string; 7 | export type Response = PageType[] | WorkspaceNotFoundError | null; 8 | } 9 | 10 | export interface GetAllRootPagesInterface 11 | extends UseCase< 12 | GetAllRootPagesInterface.Request, 13 | GetAllRootPagesInterface.Response 14 | > { 15 | execute( 16 | params: GetAllRootPagesInterface.Request 17 | ): Promise; 18 | } 19 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/GetChildrensByPageReferenceInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { PageType } from '@domain/entities/Workspace'; 4 | 5 | export namespace GetChildrensByPageReferenceInterface { 6 | export type Request = { 7 | workspaceId: string; 8 | pageReference: string; 9 | }; 10 | export type Response = PageType[] | null | WorkspaceNotFoundError; 11 | } 12 | 13 | export interface GetChildrensByPageReferenceInterface 14 | extends UseCase< 15 | GetChildrensByPageReferenceInterface.Request, 16 | GetChildrensByPageReferenceInterface.Response 17 | > { 18 | execute( 19 | params: GetChildrensByPageReferenceInterface.Request 20 | ): Promise; 21 | } 22 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/GetWorkspaceByIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { Workspace } from '@domain/entities/Workspace'; 4 | 5 | export namespace GetWorkspaceByIdInterface { 6 | export type Request = string; 7 | export type Response = Workspace | WorkspaceNotFoundError; 8 | } 9 | 10 | export interface GetWorkspaceByIdInterface 11 | extends UseCase< 12 | GetWorkspaceByIdInterface.Request, 13 | GetWorkspaceByIdInterface.Response 14 | > { 15 | execute( 16 | workspaceId: GetWorkspaceByIdInterface.Request 17 | ): Promise; 18 | } 19 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/RemoveMemberByWorkspaceIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | 4 | export namespace RemoveMemberByWorkspaceIdInterface { 5 | export type Request = { 6 | workspaceId: string; 7 | memberId: string; 8 | }; 9 | export type Response = void | WorkspaceNotFoundError; 10 | } 11 | 12 | export interface RemoveMemberByWorkspaceIdInterface 13 | extends UseCase< 14 | RemoveMemberByWorkspaceIdInterface.Request, 15 | RemoveMemberByWorkspaceIdInterface.Response 16 | > { 17 | execute( 18 | params: RemoveMemberByWorkspaceIdInterface.Request 19 | ): Promise; 20 | } 21 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/RemovePageByPageIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | 4 | export namespace RemovePageByPageIdInterface { 5 | export type Request = { 6 | workspaceId: string; 7 | pageId: string; 8 | }; 9 | export type Response = void | WorkspaceNotFoundError; 10 | } 11 | 12 | export interface RemovePageByPageIdInterface 13 | extends UseCase< 14 | RemovePageByPageIdInterface.Request, 15 | RemovePageByPageIdInterface.Response 16 | > { 17 | execute( 18 | params: RemovePageByPageIdInterface.Request 19 | ): Promise; 20 | } 21 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/UpdateWorkspaceInterface.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 3 | import { Workspace, WorkspaceProps } from '@domain/entities/Workspace'; 4 | 5 | export namespace UpdateWorkspaceInterface { 6 | export type WorkspaceIdType = string; 7 | export type WorkspaceDataType = Partial< 8 | Omit 9 | >; 10 | 11 | export type Request = { 12 | workspaceId: WorkspaceIdType; 13 | workspaceData: WorkspaceDataType; 14 | }; 15 | export type Response = Workspace | WorkspaceNotFoundError; 16 | } 17 | 18 | export interface UpdateWorkspaceInterface 19 | extends UseCase< 20 | UpdateWorkspaceInterface.Request, 21 | UpdateWorkspaceInterface.Response 22 | > { 23 | execute( 24 | params: UpdateWorkspaceInterface.Request 25 | ): Promise; 26 | } 27 | -------------------------------------------------------------------------------- /src/application/interfaces/use-cases/workspaces/UpdateWorkspacePagesMetaDataByPageIdInterface.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 3 | import { updatedPagesDataType } from '@application/interfaces/repositories/workspaces/updateWorkspacePagesMetaDataByPageIdRepository'; 4 | import { UseCase } from '@application/interfaces/use-cases/UseCase'; 5 | 6 | export namespace UpdateWorkspacePagesMetaDataByPageIdInterface { 7 | export type Request = { 8 | workspaceId: string; 9 | pageId: string; 10 | pageData: updatedPagesDataType; 11 | }; 12 | export type Response = void | WorkspaceNotFoundError | PageNotFoundError; 13 | } 14 | 15 | export interface UpdateWorkspacePagesMetaDataByPageIdInterface 16 | extends UseCase< 17 | UpdateWorkspacePagesMetaDataByPageIdInterface.Request, 18 | UpdateWorkspacePagesMetaDataByPageIdInterface.Response 19 | > { 20 | execute( 21 | params: UpdateWorkspacePagesMetaDataByPageIdInterface.Request 22 | ): Promise; 23 | } 24 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/AddToFavorite.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { AddToFavoriteRepository } from '@application/interfaces/repositories/pages/addToFavoriteRepository'; 3 | import { GetPageByIdRepository } from '@application/interfaces/repositories/pages/getPageByIdRepository'; 4 | import { AddToFavoriteInterface } from '@application/interfaces/use-cases/pages/addToFavoriteInterface'; 5 | 6 | export class AddToFavorite implements AddToFavoriteInterface { 7 | constructor( 8 | private readonly getPageByIdRepository: GetPageByIdRepository, 9 | private readonly addToFavoriteRepository: AddToFavoriteRepository 10 | ) {} 11 | 12 | async execute( 13 | params: AddToFavoriteInterface.Request 14 | ): Promise { 15 | const { pageId, userId } = params; 16 | 17 | const page = await this.getPageByIdRepository.getPageById(pageId); 18 | 19 | if (!page) { 20 | return new PageNotFoundError(); 21 | } 22 | 23 | await this.addToFavoriteRepository.addToFavorite({ 24 | pageId, 25 | userId, 26 | }); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/CreatePage.ts: -------------------------------------------------------------------------------- 1 | import { CreatePageRepository } from '@application/interfaces/repositories/pages/createPageRepository'; 2 | import { CreatePageInterface } from '@application/interfaces/use-cases/pages/createPageInterface'; 3 | 4 | export class CreatePage implements CreatePageInterface { 5 | constructor(private readonly createPageRepository: CreatePageRepository) {} 6 | 7 | async execute( 8 | pageData: CreatePageInterface.Request 9 | ): Promise { 10 | return this.createPageRepository.createPage(pageData); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/DeletePage.ts: -------------------------------------------------------------------------------- 1 | import { DeletePageRepository } from '@application/interfaces/repositories/pages/deletePageRepository'; 2 | import { DeletePageInterface } from '@application/interfaces/use-cases/pages/deletePageInterface'; 3 | 4 | export class DeletePage implements DeletePageInterface { 5 | constructor(private readonly deletePageRepository: DeletePageRepository) {} 6 | 7 | async execute( 8 | pageId: DeletePageInterface.Request 9 | ): Promise { 10 | await this.deletePageRepository.deletePage(pageId); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/DeletePagesByWorkspaceId.ts: -------------------------------------------------------------------------------- 1 | import { DeletePagesByWorkspaceIdRepository } from '@application/interfaces/repositories/pages/deletePagesByWorkspaceIdRepository'; 2 | import { DeletePagesByWorkspaceIdInterface } from '@application/interfaces/use-cases/pages/deletePagesByWorkspaceIdInterface'; 3 | 4 | export class DeletePagesByWorkspaceId 5 | implements DeletePagesByWorkspaceIdInterface 6 | { 7 | constructor( 8 | private readonly deletePagesByWorkspaceIdRepository: DeletePagesByWorkspaceIdRepository 9 | ) {} 10 | 11 | async execute( 12 | workspaceId: DeletePagesByWorkspaceIdInterface.Request 13 | ): Promise { 14 | await this.deletePagesByWorkspaceIdRepository.deletePagesByWorkspaceId( 15 | workspaceId 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/GetPageById.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { GetPageByIdRepository } from '@application/interfaces/repositories/pages/getPageByIdRepository'; 3 | import { GetPageByIdInterface } from '@application/interfaces/use-cases/pages/getPageByIdInterface'; 4 | 5 | export class GetPageById implements GetPageByIdInterface { 6 | constructor(private readonly getPageByIdRepository: GetPageByIdRepository) {} 7 | 8 | async execute( 9 | pageId: GetPageByIdInterface.Request 10 | ): Promise { 11 | const page = await this.getPageByIdRepository.getPageById(pageId); 12 | 13 | if (!page) { 14 | return new PageNotFoundError(); 15 | } 16 | 17 | return page; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/GetPageContentByPageId.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { GetPageContentByPageIdRepository } from '@application/interfaces/repositories/pages/getPageContentByPageIdRepository'; 3 | import { GetPageContentByPageIdInterface } from '@application/interfaces/use-cases/pages/getPageContentByPageIdInterface'; 4 | 5 | export class GetPageContentByPageId implements GetPageContentByPageIdInterface { 6 | constructor( 7 | private readonly getPageContentByPageIdRepository: GetPageContentByPageIdRepository 8 | ) {} 9 | 10 | async execute( 11 | pageId: GetPageContentByPageIdInterface.Request 12 | ): Promise { 13 | const pageContent = 14 | await this.getPageContentByPageIdRepository.getPageContentByPageId( 15 | pageId 16 | ); 17 | 18 | if (!pageContent) { 19 | return new PageNotFoundError(); 20 | } 21 | 22 | return pageContent; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/GetPageIdsByPath.ts: -------------------------------------------------------------------------------- 1 | import { GetPageIdsByPathRepository } from '@application/interfaces/repositories/pages/getPageIdsByPathRepository'; 2 | import { GetPageIdsByPathInterface } from '@application/interfaces/use-cases/pages/getPageIdsByPathInterface'; 3 | 4 | export class GetPageIdsByPath implements GetPageIdsByPathInterface { 5 | constructor( 6 | private readonly getPageIdsByPathRepository: GetPageIdsByPathRepository 7 | ) {} 8 | 9 | async execute( 10 | path: GetPageIdsByPathInterface.Request 11 | ): Promise { 12 | const workspaces = await this.getPageIdsByPathRepository.getPageIdsByPath( 13 | path 14 | ); 15 | 16 | return workspaces!; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/GetPageSettingsByPageId.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { GetPageSettingsByPageIdRepository } from '@application/interfaces/repositories/pages/getPageSettingsByPageIdRepository'; 3 | import { GetPageSettingsByPageIdInterface } from '@application/interfaces/use-cases/pages/getPageSettingsByPageIdInterface'; 4 | 5 | export class GetPageSettingsByPageId 6 | implements GetPageSettingsByPageIdInterface 7 | { 8 | constructor( 9 | private readonly getPageSettingsByPageIdRepository: GetPageSettingsByPageIdRepository 10 | ) {} 11 | 12 | async execute( 13 | pageId: GetPageSettingsByPageIdInterface.Request 14 | ): Promise { 15 | const pageSettings = 16 | await this.getPageSettingsByPageIdRepository.getPageSettingsByPageId( 17 | pageId 18 | ); 19 | 20 | if (!pageSettings) { 21 | return new PageNotFoundError(); 22 | } 23 | 24 | return pageSettings; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/RemoveFromFavorite.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { GetPageByIdRepository } from '@application/interfaces/repositories/pages/getPageByIdRepository'; 3 | import { RemoveFromFavoriteRepository } from '@application/interfaces/repositories/pages/removeFromFavoriteRepository'; 4 | import { RemoveFromFavoriteInterface } from '@application/interfaces/use-cases/pages/removeFromFavoriteInterface'; 5 | 6 | export class RemoveFromFavorite implements RemoveFromFavoriteInterface { 7 | constructor( 8 | private readonly getPageByIdRepository: GetPageByIdRepository, 9 | private readonly removeFromFavoriteRepository: RemoveFromFavoriteRepository 10 | ) {} 11 | 12 | async execute( 13 | params: RemoveFromFavoriteInterface.Request 14 | ): Promise { 15 | const { pageId, userId } = params; 16 | 17 | const page = await this.getPageByIdRepository.getPageById(pageId); 18 | 19 | if (!page) { 20 | return new PageNotFoundError(); 21 | } 22 | 23 | await this.removeFromFavoriteRepository.removeFromFavorite({ 24 | pageId, 25 | userId, 26 | }); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/UpdatePageContentByPageId.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { GetPageByIdRepository } from '@application/interfaces/repositories/pages/getPageByIdRepository'; 3 | import { UpdatePageContentByPageIdRepository } from '@application/interfaces/repositories/pages/updatePageContentByPageIdRepository'; 4 | import { UpdatePageContentByPageIdInterface } from '@application/interfaces/use-cases/pages/updatePageContentByPageIdInterface'; 5 | 6 | export class UpdatePageContentByPageId 7 | implements UpdatePageContentByPageIdInterface 8 | { 9 | constructor( 10 | private readonly getPageByIdRepository: GetPageByIdRepository, 11 | private readonly updatePageContentByPageIdRepository: UpdatePageContentByPageIdRepository 12 | ) {} 13 | 14 | async execute( 15 | params: UpdatePageContentByPageIdInterface.Request 16 | ): Promise { 17 | const { pageId, content } = params; 18 | 19 | const page = await this.getPageByIdRepository.getPageById(pageId); 20 | 21 | if (!page) { 22 | return new PageNotFoundError(); 23 | } 24 | 25 | const updated = 26 | await this.updatePageContentByPageIdRepository.updatePageContentByPageId({ 27 | pageId, 28 | content, 29 | }); 30 | 31 | return updated; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/UpdatePageCoverByPageId.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { GetPageByIdRepository } from '@application/interfaces/repositories/pages/getPageByIdRepository'; 3 | import { UpdatePageCoverByPageIdRepository } from '@application/interfaces/repositories/pages/updatePageCoverByPageIdRepository'; 4 | import { UpdatePageCoverByPageIdInterface } from '@application/interfaces/use-cases/pages/updatePageCoverByPageIdInterface'; 5 | 6 | export class UpdatePageCoverByPageId 7 | implements UpdatePageCoverByPageIdInterface 8 | { 9 | constructor( 10 | private readonly getPageByIdRepository: GetPageByIdRepository, 11 | private readonly updatePageCoverByPageIdRepository: UpdatePageCoverByPageIdRepository 12 | ) {} 13 | 14 | async execute( 15 | params: UpdatePageCoverByPageIdInterface.Request 16 | ): Promise { 17 | const { pageId, url, verticalPosition } = params; 18 | 19 | const page = await this.getPageByIdRepository.getPageById(pageId); 20 | 21 | if (!page) { 22 | return new PageNotFoundError(); 23 | } 24 | 25 | const updated = 26 | await this.updatePageCoverByPageIdRepository.updatePageCoverByPageId({ 27 | pageId, 28 | url, 29 | verticalPosition, 30 | }); 31 | 32 | return updated; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/UpdatePageIconByPageId.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { GetPageByIdRepository } from '@application/interfaces/repositories/pages/getPageByIdRepository'; 3 | import { UpdatePageIconByPageIdRepository } from '@application/interfaces/repositories/pages/updatePageIconByPageIdRepository'; 4 | import { UpdatePageIconByPageIdInterface } from '@application/interfaces/use-cases/pages/updatePageIconByPageIdInterface'; 5 | 6 | export class UpdatePageIconByPageId implements UpdatePageIconByPageIdInterface { 7 | constructor( 8 | private readonly getPageByIdRepository: GetPageByIdRepository, 9 | private readonly updatePageIconByPageIdRepository: UpdatePageIconByPageIdRepository 10 | ) {} 11 | 12 | async execute( 13 | params: UpdatePageIconByPageIdInterface.Request 14 | ): Promise { 15 | const { pageId, icon } = params; 16 | 17 | const page = await this.getPageByIdRepository.getPageById(pageId); 18 | 19 | if (!page) { 20 | return new PageNotFoundError(); 21 | } 22 | 23 | const updated = 24 | await this.updatePageIconByPageIdRepository.updatePageIconByPageId({ 25 | pageId, 26 | icon, 27 | }); 28 | 29 | return updated; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/UpdatePagePathByPageId.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { GetPageByIdRepository } from '@application/interfaces/repositories/pages/getPageByIdRepository'; 3 | import { UpdatePagePathByPageIdRepository } from '@application/interfaces/repositories/pages/updatePagePathByPageIdRepository'; 4 | import { UpdatePagePathByPageIdInterface } from '@application/interfaces/use-cases/pages/updatePagePathByPageIdInterface'; 5 | 6 | export class UpdatePagePathByPageId implements UpdatePagePathByPageIdInterface { 7 | constructor( 8 | private readonly getPageByIdRepository: GetPageByIdRepository, 9 | private readonly updatePagePathByPageIdRepository: UpdatePagePathByPageIdRepository 10 | ) {} 11 | 12 | async execute( 13 | params: UpdatePagePathByPageIdInterface.Request 14 | ): Promise { 15 | const { pageId, path } = params; 16 | 17 | const page = await this.getPageByIdRepository.getPageById(pageId); 18 | 19 | if (!page) { 20 | return new PageNotFoundError(); 21 | } 22 | 23 | const updated = 24 | await this.updatePagePathByPageIdRepository.updatePagePathByPageId({ 25 | pageId, 26 | path, 27 | }); 28 | 29 | return updated; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/application/use-cases/pages/UpdatePageTitleByPageId.ts: -------------------------------------------------------------------------------- 1 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 2 | import { GetPageByIdRepository } from '@application/interfaces/repositories/pages/getPageByIdRepository'; 3 | import { UpdatePageTitleByPageIdRepository } from '@application/interfaces/repositories/pages/updatePageTitleByPageIdRepository'; 4 | import { UpdatePageTitleByPageIdInterface } from '@application/interfaces/use-cases/pages/updatePageTitleByPageIdInterface'; 5 | 6 | export class UpdatePageTitleByPageId 7 | implements UpdatePageTitleByPageIdInterface 8 | { 9 | constructor( 10 | private readonly getPageByIdRepository: GetPageByIdRepository, 11 | private readonly updatePageTitleByPageIdRepository: UpdatePageTitleByPageIdRepository 12 | ) {} 13 | 14 | async execute( 15 | params: UpdatePageTitleByPageIdInterface.Request 16 | ): Promise { 17 | const { pageId, title } = params; 18 | 19 | const page = await this.getPageByIdRepository.getPageById(pageId); 20 | 21 | if (!page) { 22 | return new PageNotFoundError(); 23 | } 24 | 25 | const updated = 26 | await this.updatePageTitleByPageIdRepository.updatePageTitleByPageId({ 27 | pageId, 28 | title, 29 | }); 30 | 31 | return updated; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/application/use-cases/users/AddWorkspaceByUserId.ts: -------------------------------------------------------------------------------- 1 | import { UserNotFoundError } from '@application/errors/UserNotFoundError'; 2 | import { AddWorkspaceByUserIdRepository } from '@application/interfaces/repositories/users/addWorkspaceByUserIdRepository'; 3 | import { GetUserByIdRepository } from '@application/interfaces/repositories/users/getUserByIdRepository'; 4 | import { AddWorkspaceByUserIdInterface } from '@application/interfaces/use-cases/users/AddWorkspaceByUserIdInterface'; 5 | 6 | export class AddWorkspaceByUserId implements AddWorkspaceByUserIdInterface { 7 | constructor( 8 | private readonly getUserByIdRepository: GetUserByIdRepository, 9 | private readonly addWorkspaceByUserIdRepository: AddWorkspaceByUserIdRepository 10 | ) {} 11 | 12 | async execute( 13 | params: AddWorkspaceByUserIdInterface.Request 14 | ): Promise { 15 | const { userId, workspaceId, workspaceName, workspaceIcon } = params; 16 | 17 | const user = await this.getUserByIdRepository.getUserById(userId); 18 | 19 | if (!user) { 20 | return new UserNotFoundError(); 21 | } 22 | 23 | await this.addWorkspaceByUserIdRepository.addWorkspaceByUserId({ 24 | userId, 25 | workspaceId, 26 | workspaceName, 27 | workspaceIcon, 28 | }); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/application/use-cases/users/Authenticate.ts: -------------------------------------------------------------------------------- 1 | import { ForbiddenError } from '@application/errors/ForbiddenError'; 2 | import { JWTVerifier } from '@application/interfaces/cryptography/JWTVerifier'; 3 | import { AuthenticateInterface } from '@application/interfaces/use-cases/users/AuthenticateInterface'; 4 | 5 | export class Authenticate implements AuthenticateInterface { 6 | constructor(private readonly jwtVerifier: JWTVerifier) {} 7 | 8 | async execute( 9 | authenticationToken: AuthenticateInterface.Request 10 | ): Promise { 11 | const decodedToken = await this.jwtVerifier.verifyAccessToken( 12 | authenticationToken 13 | ); 14 | 15 | if (!decodedToken) { 16 | return new ForbiddenError(); 17 | } 18 | 19 | const decodedTokenString = JSON.stringify(decodedToken); 20 | 21 | const decodedTokenObject = JSON.parse(decodedTokenString); 22 | 23 | return decodedTokenObject.userId; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/application/use-cases/users/DeleteUser.ts: -------------------------------------------------------------------------------- 1 | import { DeleteUserRepository } from '@application/interfaces/repositories/users/deleteUserRepository'; 2 | import { DeleteUserInterface } from '@application/interfaces/use-cases/users/DeleteUserInterface'; 3 | 4 | export class DeleteUser implements DeleteUserInterface { 5 | constructor(private readonly deleteUserRepository: DeleteUserRepository) {} 6 | 7 | async execute( 8 | userId: DeleteUserInterface.Request 9 | ): Promise { 10 | await this.deleteUserRepository.deleteUser(userId); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/application/use-cases/users/GetUserById.ts: -------------------------------------------------------------------------------- 1 | import { UserNotFoundError } from '@application/errors/UserNotFoundError'; 2 | import { GetUserByIdRepository } from '@application/interfaces/repositories/users/getUserByIdRepository'; 3 | import { GetUserByIdInterface } from '@application/interfaces/use-cases/users/GetUserByIdInterface'; 4 | 5 | export class GetUserById implements GetUserByIdInterface { 6 | constructor(private readonly getUserByIdRepository: GetUserByIdRepository) {} 7 | 8 | async execute( 9 | userId: GetUserByIdInterface.Request 10 | ): Promise { 11 | const user = await this.getUserByIdRepository.getUserById(userId); 12 | if (!user) { 13 | return new UserNotFoundError(); 14 | } 15 | return user; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/application/use-cases/users/GetWorkspacesByUserId.ts: -------------------------------------------------------------------------------- 1 | import { GetWorkspacesByUserIdRepository } from '@application/interfaces/repositories/users/getWorkspacesByUserIdRepository'; 2 | import { GetWorkspacesByUserIdInterface } from '@application/interfaces/use-cases/users/GetWorkspacesByUserIdInterface'; 3 | 4 | export class GetWorkspacesByUserId implements GetWorkspacesByUserIdInterface { 5 | constructor( 6 | private readonly getWorkspacesByUserIdRepository: GetWorkspacesByUserIdRepository 7 | ) {} 8 | 9 | async execute( 10 | userId: GetWorkspacesByUserIdInterface.Request 11 | ): Promise { 12 | const workspaces = 13 | await this.getWorkspacesByUserIdRepository.getWorkspacesByUserId(userId); 14 | 15 | return workspaces!; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/application/use-cases/users/RemoveWorkspaceByUserId.ts: -------------------------------------------------------------------------------- 1 | import { RemoveWorkspaceByUserIdRepository } from '@application/interfaces/repositories/users/removeWorkspaceByUserIdRepository'; 2 | import { RemoveWorkspaceByUserIdInterface } from '@application/interfaces/use-cases/users/RemoveWorkspaceByUserIdInterface'; 3 | 4 | export class RemoveWorkspaceByUserId 5 | implements RemoveWorkspaceByUserIdInterface 6 | { 7 | constructor( 8 | private readonly removeWorkspaceByUserIdRepository: RemoveWorkspaceByUserIdRepository 9 | ) {} 10 | 11 | async execute( 12 | params: RemoveWorkspaceByUserIdInterface.Request 13 | ): Promise { 14 | const { userId, workspaceId } = params; 15 | 16 | await this.removeWorkspaceByUserIdRepository.removeWorkspaceByUserId({ 17 | userId, 18 | workspaceId, 19 | }); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/application/use-cases/users/SignOut.ts: -------------------------------------------------------------------------------- 1 | import { DeleteTokenRepository } from '@application/interfaces/repositories/tokens/deleteTokenRepository'; 2 | import { SignOutInterface } from '@application/interfaces/use-cases/users/SignOutInterface'; 3 | 4 | export class SignOut implements SignOutInterface { 5 | constructor(private readonly deleteTokenRepository: DeleteTokenRepository) {} 6 | 7 | async execute( 8 | token: SignOutInterface.Request 9 | ): Promise { 10 | await this.deleteTokenRepository.deleteToken(token); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/application/use-cases/users/UpdateUser.ts: -------------------------------------------------------------------------------- 1 | import { UserNotFoundError } from '@application/errors/UserNotFoundError'; 2 | import { GetUserByIdRepository } from '@application/interfaces/repositories/users/getUserByIdRepository'; 3 | import { UpdateUserRepository } from '@application/interfaces/repositories/users/updateUserRepository'; 4 | import { UpdateUserInterface } from '@application/interfaces/use-cases/users/UpdateUserInterface'; 5 | 6 | export class UpdateUser implements UpdateUserInterface { 7 | constructor( 8 | private readonly getUserByIdRepository: GetUserByIdRepository, 9 | private readonly updateUserRepository: UpdateUserRepository 10 | ) {} 11 | 12 | async execute( 13 | params: UpdateUserInterface.Request 14 | ): Promise { 15 | const { userId, userData } = params; 16 | const user = await this.getUserByIdRepository.getUserById(userId); 17 | 18 | if (!user) { 19 | return new UserNotFoundError(); 20 | } 21 | 22 | const updated = await this.updateUserRepository.updateUser({ 23 | userId, 24 | userData, 25 | }); 26 | 27 | return updated; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/application/use-cases/users/UpdateUserProfilePicture.ts: -------------------------------------------------------------------------------- 1 | import { UpdateUserProfilePictureRepository } from '@application/interfaces/repositories/users/updateUserProfilePictureRepository'; 2 | import { UpdateUserProfilePictureInterface } from '@application/interfaces/use-cases/users/UpdateUserProfilePictureInterface'; 3 | 4 | export class UpdateUserProfilePicture 5 | implements UpdateUserProfilePictureInterface 6 | { 7 | constructor( 8 | private readonly updateUserProfilePictureRepository: UpdateUserProfilePictureRepository 9 | ) {} 10 | 11 | async execute( 12 | params: UpdateUserProfilePictureInterface.Request 13 | ): Promise { 14 | const { userId, url } = params; 15 | 16 | await this.updateUserProfilePictureRepository.updateUserProfilePicture({ 17 | userId, 18 | url, 19 | }); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/application/use-cases/workspaces/AddMemberByWorkspaceId.ts: -------------------------------------------------------------------------------- 1 | import { AddMemberByWorkspaceIdInterface } from '@application/interfaces/use-cases/workspaces/AddMemberByWorkspaceIdInterface'; 2 | import { GetWorkspaceByIdRepository } from '@application/interfaces/repositories/workspaces/getWorkspaceByIdRepository'; 3 | import { AddMemberByWorkspaceIdRepository } from '@application/interfaces/repositories/workspaces/addMemberByWorkspaceIdRepository'; 4 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 5 | 6 | export class AddMemberByWorkspaceId implements AddMemberByWorkspaceIdInterface { 7 | constructor( 8 | private readonly getWorkspaceByIdRepository: GetWorkspaceByIdRepository, 9 | private readonly addMemberByWorkspaceIdRepository: AddMemberByWorkspaceIdRepository 10 | ) {} 11 | 12 | async execute( 13 | params: AddMemberByWorkspaceIdInterface.Request 14 | ): Promise { 15 | const { workspaceId, memberId } = params; 16 | 17 | const workspace = await this.getWorkspaceByIdRepository.getWorkspaceById( 18 | workspaceId 19 | ); 20 | 21 | if (!workspace) { 22 | return new WorkspaceNotFoundError(); 23 | } 24 | 25 | await this.addMemberByWorkspaceIdRepository.addMemberByWorkspaceId({ 26 | workspaceId, 27 | memberId, 28 | }); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/application/use-cases/workspaces/AddPage.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { AddPageRepository } from '@application/interfaces/repositories/workspaces/addPageRepository'; 3 | import { GetWorkspaceByIdRepository } from '@application/interfaces/repositories/workspaces/getWorkspaceByIdRepository'; 4 | import { AddPageInterface } from '@application/interfaces/use-cases/workspaces/AddPageInterface'; 5 | 6 | export class AddPage implements AddPageInterface { 7 | constructor( 8 | private readonly getWorkspaceByIdRepository: GetWorkspaceByIdRepository, 9 | private readonly addPageRepository: AddPageRepository 10 | ) {} 11 | 12 | async execute( 13 | params: AddPageInterface.Request 14 | ): Promise { 15 | const { workspaceId, pageData } = params; 16 | 17 | const workspace = await this.getWorkspaceByIdRepository.getWorkspaceById( 18 | workspaceId 19 | ); 20 | 21 | if (!workspace) { 22 | return new WorkspaceNotFoundError(); 23 | } 24 | 25 | const updated = await this.addPageRepository.addPage({ 26 | workspaceId, 27 | pageData, 28 | }); 29 | 30 | return updated; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/application/use-cases/workspaces/CreateWorkspace.ts: -------------------------------------------------------------------------------- 1 | import { CreateWorkspaceRepository } from '@application/interfaces/repositories/workspaces/createWorkspaceRepository'; 2 | import { CreateWorkspaceInterface } from '@application/interfaces/use-cases/workspaces/CreateWorkspaceInterface'; 3 | 4 | export class CreateWorkspace implements CreateWorkspaceInterface { 5 | constructor( 6 | private readonly createWorkspaceRepository: CreateWorkspaceRepository 7 | ) {} 8 | 9 | async execute( 10 | workspaceData: CreateWorkspaceInterface.Request 11 | ): Promise { 12 | return this.createWorkspaceRepository.createWorkspace(workspaceData); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/application/use-cases/workspaces/DeleteWorkspace.ts: -------------------------------------------------------------------------------- 1 | import { DeleteWorkspaceRepository } from '@application/interfaces/repositories/workspaces/deleteWorkspaceRepository'; 2 | import { DeleteWorkspaceInterface } from '@application/interfaces/use-cases/workspaces/DeleteWorkspaceInterface'; 3 | 4 | export class DeleteWorkspace implements DeleteWorkspaceInterface { 5 | constructor( 6 | private readonly deleteWorkspaceRepository: DeleteWorkspaceRepository 7 | ) {} 8 | 9 | async execute( 10 | workspaceId: DeleteWorkspaceRepository.Request 11 | ): Promise { 12 | await this.deleteWorkspaceRepository.deleteWorkspace(workspaceId); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/application/use-cases/workspaces/GetAllMembersByWorkspaceId.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { GetAllMembersByWorkspaceIdRepository } from '@application/interfaces/repositories/workspaces/getAllMembersByWorkspaceIdRepository'; 3 | import { GetWorkspaceByIdRepository } from '@application/interfaces/repositories/workspaces/getWorkspaceByIdRepository'; 4 | import { GetAllMembersByWorkspaceIdInterface } from '@application/interfaces/use-cases/workspaces/GetAllMembersByWorkspaceIdInterface'; 5 | 6 | export class GetAllMembersByWorkspaceId 7 | implements GetAllMembersByWorkspaceIdInterface 8 | { 9 | constructor( 10 | private readonly getWorkspaceByIdRepository: GetWorkspaceByIdRepository, 11 | private readonly getAllMembersByWorkspaceIdRepository: GetAllMembersByWorkspaceIdRepository 12 | ) {} 13 | 14 | async execute( 15 | workspaceId: GetAllMembersByWorkspaceIdInterface.Request 16 | ): Promise { 17 | const workspace = await this.getWorkspaceByIdRepository.getWorkspaceById( 18 | workspaceId 19 | ); 20 | 21 | if (!workspace) { 22 | return new WorkspaceNotFoundError(); 23 | } 24 | 25 | return this.getAllMembersByWorkspaceIdRepository.getAllMembersByWorkspaceId( 26 | workspaceId 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/application/use-cases/workspaces/GetAllRootPages.ts: -------------------------------------------------------------------------------- 1 | import { GetWorkspaceByIdRepository } from '@application/interfaces/repositories/workspaces/getWorkspaceByIdRepository'; 2 | import { GetAllRootPagesInterface } from '@application/interfaces/use-cases/workspaces/GetAllRootPagesInterface'; 3 | import { GetAllRootPagesRepository } from '@application/interfaces/repositories/workspaces/getAllRootPagesRepository'; 4 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 5 | 6 | export class GetAllRootPages implements GetAllRootPagesInterface { 7 | constructor( 8 | private readonly getWorkspaceByIdRepository: GetWorkspaceByIdRepository, 9 | private readonly getAllRootPagesRepository: GetAllRootPagesRepository 10 | ) {} 11 | 12 | async execute( 13 | workspaceId: GetAllRootPagesInterface.Request 14 | ): Promise { 15 | const workspace = await this.getWorkspaceByIdRepository.getWorkspaceById( 16 | workspaceId 17 | ); 18 | 19 | if (!workspace) { 20 | return new WorkspaceNotFoundError(); 21 | } 22 | 23 | return this.getAllRootPagesRepository.getAllRootPages(workspaceId); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/application/use-cases/workspaces/GetWorkspaceById.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { GetWorkspaceByIdRepository } from '@application/interfaces/repositories/workspaces/getWorkspaceByIdRepository'; 3 | import { GetWorkspaceByIdInterface } from '@application/interfaces/use-cases/workspaces/GetWorkspaceByIdInterface'; 4 | 5 | export class GetWorkspaceById implements GetWorkspaceByIdInterface { 6 | constructor( 7 | private readonly getWorkspaceByIdRepository: GetWorkspaceByIdRepository 8 | ) {} 9 | 10 | async execute( 11 | workspaceId: GetWorkspaceByIdInterface.Request 12 | ): Promise { 13 | const workspace = await this.getWorkspaceByIdRepository.getWorkspaceById( 14 | workspaceId 15 | ); 16 | 17 | if (!workspace) { 18 | return new WorkspaceNotFoundError(); 19 | } 20 | 21 | return workspace; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/application/use-cases/workspaces/RemovePageByPageId.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { GetWorkspaceByIdRepository } from '@application/interfaces/repositories/workspaces/getWorkspaceByIdRepository'; 3 | import { RemovePageByPageIdRepository } from '@application/interfaces/repositories/workspaces/removePageByPageIdRepository'; 4 | import { RemovePageByPageIdInterface } from '@application/interfaces/use-cases/workspaces/RemovePageByPageIdInterface'; 5 | 6 | export class RemovePageByPageId implements RemovePageByPageIdInterface { 7 | constructor( 8 | private readonly getWorkspaceByIdRepository: GetWorkspaceByIdRepository, 9 | private readonly removePageByPageIdRepository: RemovePageByPageIdRepository 10 | ) {} 11 | 12 | async execute( 13 | params: RemovePageByPageIdInterface.Request 14 | ): Promise { 15 | const { workspaceId, pageId } = params; 16 | 17 | const workspace = await this.getWorkspaceByIdRepository.getWorkspaceById( 18 | workspaceId 19 | ); 20 | 21 | if (!workspace) { 22 | return new WorkspaceNotFoundError(); 23 | } 24 | 25 | await this.removePageByPageIdRepository.removePageByPageId({ 26 | workspaceId, 27 | pageId, 28 | }); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/application/use-cases/workspaces/UpdateWorkspace.ts: -------------------------------------------------------------------------------- 1 | import { WorkspaceNotFoundError } from '@application/errors/WorkspaceNotFoundError'; 2 | import { GetWorkspaceByIdRepository } from '@application/interfaces/repositories/workspaces/getWorkspaceByIdRepository'; 3 | import { UpdateWorkspaceRepository } from '@application/interfaces/repositories/workspaces/updateWorkspaceRepository'; 4 | import { UpdateWorkspaceInterface } from '@application/interfaces/use-cases/workspaces/UpdateWorkspaceInterface'; 5 | 6 | export class UpdateWorkspace implements UpdateWorkspaceInterface { 7 | constructor( 8 | private readonly getWorkspaceByIdRepository: GetWorkspaceByIdRepository, 9 | private readonly updateWorkspaceRepository: UpdateWorkspaceRepository 10 | ) {} 11 | 12 | async execute( 13 | params: UpdateWorkspaceInterface.Request 14 | ): Promise { 15 | const { workspaceId, workspaceData } = params; 16 | const workspace = await this.getWorkspaceByIdRepository.getWorkspaceById( 17 | workspaceId 18 | ); 19 | 20 | if (!workspace) { 21 | return new WorkspaceNotFoundError(); 22 | } 23 | 24 | return this.updateWorkspaceRepository.updateWorkspace({ 25 | workspaceId, 26 | workspaceData, 27 | }); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/domain/entities/Workspace.ts: -------------------------------------------------------------------------------- 1 | export type PageType = { 2 | id: string; 3 | reference: string; 4 | path: string | null; 5 | icon: string; 6 | title: string; 7 | createdAt: Date; 8 | }; 9 | 10 | export type WorkspaceProps = { 11 | id: string; 12 | name: string; 13 | icon: string; 14 | members: string[]; 15 | pages: PageType[]; 16 | createdAt: Date; 17 | updatedAt?: Date; 18 | }; 19 | 20 | export class Workspace { 21 | public readonly id: string; 22 | 23 | public readonly name: string; 24 | 25 | public readonly icon: string; 26 | 27 | public readonly members: string[]; 28 | 29 | public readonly pages: PageType[]; 30 | 31 | public readonly createdAt: Date; 32 | 33 | public readonly updatedAt?: Date; 34 | 35 | constructor(props: WorkspaceProps) { 36 | this.id = props.id; 37 | this.name = props.name; 38 | this.icon = props.icon; 39 | this.members = props.members; 40 | this.pages = props.pages; 41 | this.createdAt = props.createdAt; 42 | this.updatedAt = props.updatedAt; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/infrastructure/cryptography/BcryptAdapter.ts: -------------------------------------------------------------------------------- 1 | import bcrypt from 'bcrypt'; 2 | import { HashGenerator } from '@application/interfaces/cryptography/HashGenerator'; 3 | import { HashComparer } from '@application/interfaces/cryptography/HashCompare'; 4 | 5 | export class BcryptAdapter implements HashGenerator, HashComparer { 6 | constructor(private readonly salt: number) {} 7 | 8 | async hash(value: string): Promise { 9 | return bcrypt.hash(value, this.salt); 10 | } 11 | 12 | async compare(plaintext: string, hash: string): Promise { 13 | return bcrypt.compare(plaintext, hash); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/infrastructure/cryptography/JWTAdapter.ts: -------------------------------------------------------------------------------- 1 | import jwt from 'jsonwebtoken'; 2 | import { JWTVerifier } from '@application/interfaces/cryptography/JWTVerifier'; 3 | import { JWTGenerator } from '@application/interfaces/cryptography/JWTGenerator'; 4 | 5 | export class JWTAdapter implements JWTGenerator, JWTVerifier { 6 | constructor( 7 | private readonly accessTokenSecret: string, 8 | private readonly refreshTokenSecret: string 9 | ) {} 10 | 11 | async generateAccessToken(payload: string): Promise { 12 | return jwt.sign({ userId: payload }, this.accessTokenSecret, { 13 | expiresIn: '15m', 14 | }); 15 | } 16 | 17 | async generateRefreshToken(payload: string): Promise { 18 | return jwt.sign({ userId: payload }, this.refreshTokenSecret); 19 | } 20 | 21 | async verifyAccessToken(token: string): Promise { 22 | try { 23 | return jwt.verify(token, this.accessTokenSecret) as string; 24 | } catch (error) { 25 | return null; 26 | } 27 | } 28 | 29 | async verifyRefreshToken(token: string): Promise { 30 | try { 31 | return jwt.verify(token, this.refreshTokenSecret) as string; 32 | } catch (error) { 33 | return null; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/infrastructure/db/mongodb/helpers/db-connection.ts: -------------------------------------------------------------------------------- 1 | import { Collection, MongoClient } from 'mongodb'; 2 | 3 | class DbConnection { 4 | private url?: string; 5 | 6 | private client?: MongoClient; 7 | 8 | async connect(url: string): Promise { 9 | this.url = url; 10 | this.client = new MongoClient(url); 11 | await this.client.connect(); 12 | } 13 | 14 | async disconnect(): Promise { 15 | await this.client?.close(); 16 | this.client = undefined; 17 | } 18 | 19 | async getCollection(name: string): Promise { 20 | if (!this.client && this.url) { 21 | await this.connect(this.url); 22 | } 23 | 24 | const db = this.client?.db(); 25 | if (!db) { 26 | throw new Error('MongoDB client is not connected'); 27 | } 28 | 29 | return db.collection(name); 30 | } 31 | } 32 | 33 | export default new DbConnection(); 34 | -------------------------------------------------------------------------------- /src/infrastructure/db/mongodb/helpers/mapper.ts: -------------------------------------------------------------------------------- 1 | import { ObjectId } from 'mongodb'; 2 | 3 | export const isValidObjectId = (id: string): boolean => ObjectId.isValid(id); 4 | 5 | export const objectIdToString = (objectId: ObjectId): string => { 6 | return objectId.toHexString(); 7 | }; 8 | 9 | export const stringToObjectId = (string: string): ObjectId => { 10 | return new ObjectId(string); 11 | }; 12 | 13 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 14 | export const mapDocument = (document: any): any => { 15 | const { _id: objectId, ...rest } = document; 16 | const id = objectIdToString(objectId); 17 | return { ...rest, id }; 18 | }; 19 | 20 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 21 | export const mapCollection = (collection: any[]): any[] => { 22 | return collection.map(document => mapDocument(document)); 23 | }; 24 | -------------------------------------------------------------------------------- /src/infrastructure/http/controllers/BaseController.ts: -------------------------------------------------------------------------------- 1 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 2 | import { HttpResponse } from '@infrastructure/http/interfaces/HttpResponse'; 3 | import { Validation } from '@infrastructure/http/interfaces/Validation'; 4 | import { badRequest, serverError } from '@infrastructure/http/helpers/http'; 5 | 6 | export abstract class BaseController { 7 | constructor(private readonly validation?: Validation) {} 8 | 9 | abstract execute(httpRequest: HttpRequest): Promise; 10 | 11 | async handle(httpRequest: HttpRequest): Promise { 12 | try { 13 | const error = this.validation?.validate(httpRequest); 14 | if (error) { 15 | return badRequest(error); 16 | } 17 | return await this.execute(httpRequest); 18 | } catch (error) { 19 | return serverError(error); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/infrastructure/http/controllers/pages/GetPageByIdController.ts: -------------------------------------------------------------------------------- 1 | import { GetPageByIdInterface } from '@application/interfaces/use-cases/pages/getPageByIdInterface'; 2 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 3 | import { HttpResponse } from '@infrastructure/http/interfaces/HttpResponse'; 4 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 5 | import { PageNotFoundError } from '@application/errors/PageNotFoundError'; 6 | import { notFound, ok } from '@infrastructure/http/helpers/http'; 7 | 8 | export namespace GetPageByIdController { 9 | export type Request = HttpRequest; 10 | export type Response = HttpResponse; 11 | } 12 | 13 | export class GetPageByIdController extends BaseController { 14 | constructor(private readonly getPageById: GetPageByIdInterface) { 15 | super(); 16 | } 17 | 18 | async execute( 19 | httpRequest: GetPageByIdController.Request 20 | ): Promise { 21 | const { pageId } = httpRequest.params!; 22 | const pageOrError = await this.getPageById.execute(pageId); 23 | 24 | if (pageOrError instanceof PageNotFoundError) { 25 | return notFound(pageOrError); 26 | } 27 | 28 | return ok(pageOrError); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/infrastructure/http/controllers/users/GetUserByIdController.ts: -------------------------------------------------------------------------------- 1 | import { GetUserByIdInterface } from '@application/interfaces/use-cases/users/GetUserByIdInterface'; 2 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 3 | import { HttpResponse } from '@infrastructure/http/interfaces/HttpResponse'; 4 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 5 | import { ok } from '@infrastructure/http/helpers/http'; 6 | 7 | export namespace GetUserByIdController { 8 | export type Request = HttpRequest; 9 | export type Response = HttpResponse; 10 | } 11 | 12 | export class GetUserByIdController extends BaseController { 13 | constructor(private readonly getUserById: GetUserByIdInterface) { 14 | super(); 15 | } 16 | 17 | async execute( 18 | httpRequest: GetUserByIdController.Request 19 | ): Promise { 20 | const { userId } = httpRequest.params!; 21 | const response = await this.getUserById.execute(userId); 22 | return ok(response); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/infrastructure/http/controllers/users/GetWorkspacesByUserIdController.ts: -------------------------------------------------------------------------------- 1 | import { GetWorkspacesByUserIdInterface } from '@application/interfaces/use-cases/users/GetWorkspacesByUserIdInterface'; 2 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 3 | import { HttpResponse } from '@infrastructure/http/interfaces/HttpResponse'; 4 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 5 | import { ok } from '@infrastructure/http/helpers/http'; 6 | 7 | export namespace GetWorkspacesByUserIdController { 8 | export type Request = HttpRequest; 9 | export type Response = HttpResponse; 10 | } 11 | 12 | export class GetWorkspacesByUserIdController extends BaseController { 13 | constructor( 14 | private readonly getWorkspacesByUserId: GetWorkspacesByUserIdInterface 15 | ) { 16 | super(); 17 | } 18 | 19 | async execute( 20 | httpRequest: GetWorkspacesByUserIdController.Request 21 | ): Promise { 22 | const { userId } = await httpRequest.params!; 23 | const response = await this.getWorkspacesByUserId.execute(userId); 24 | return ok(response); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/infrastructure/http/controllers/users/SignOutController.ts: -------------------------------------------------------------------------------- 1 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 2 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 3 | import { SignOutInterface } from '@application/interfaces/use-cases/users/SignOutInterface'; 4 | import { HttpResponse } from '@infrastructure/http/interfaces/HttpResponse'; 5 | import { ok } from '@infrastructure/http/helpers/http'; 6 | 7 | export namespace SignOutController { 8 | export type Request = HttpRequest; 9 | export type Response = HttpResponse<{ message: string }>; 10 | } 11 | 12 | export class SignOutController extends BaseController { 13 | constructor(private readonly signOut: SignOutInterface) { 14 | super(); 15 | } 16 | 17 | async execute( 18 | httpRequest: SignOutController.Request 19 | ): Promise { 20 | const { cookie } = httpRequest.headers; 21 | const tokenParts = cookie.split('='); 22 | const token = tokenParts[1]; 23 | 24 | await this.signOut.execute(token); 25 | 26 | const refreshCookie = { 27 | token: '', 28 | }; 29 | 30 | return ok( 31 | { 32 | message: 'signed out successfully', 33 | }, 34 | refreshCookie 35 | ); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/infrastructure/http/errors/AuthTokenNotProvidedError.ts: -------------------------------------------------------------------------------- 1 | export class AuthTokenNotProvidedError extends Error { 2 | constructor() { 3 | super('Authentication token not provided'); 4 | this.name = 'AuthTokenNotProvidedError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/infrastructure/http/errors/InvalidAuthTokenError.ts: -------------------------------------------------------------------------------- 1 | export class InvalidAuthTokenError extends Error { 2 | constructor() { 3 | super('Invalid authentication token'); 4 | this.name = 'InvalidAuthTokenError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/infrastructure/http/errors/PageNotFoundError.ts: -------------------------------------------------------------------------------- 1 | export class PageNotFoundError extends Error { 2 | constructor() { 3 | super('Page Not Found Error'); 4 | this.name = 'PageNotFoundError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/infrastructure/http/errors/PermissionError.ts: -------------------------------------------------------------------------------- 1 | export class PermissionError extends Error { 2 | constructor() { 3 | super('Permission denied'); 4 | this.name = 'PermissionError'; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/infrastructure/http/errors/ServerError.ts: -------------------------------------------------------------------------------- 1 | export class ServerError extends Error { 2 | constructor(stack?: string) { 3 | super('Internal server error'); 4 | this.name = 'ServerError'; 5 | this.stack = stack; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/infrastructure/http/interfaces/HttpRequest.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 2 | export type HttpRequest = { 3 | body?: TBody; 4 | params?: TParams; 5 | headers?: THeaders; 6 | userId?: string; 7 | workspaceId?: string; 8 | }; 9 | -------------------------------------------------------------------------------- /src/infrastructure/http/interfaces/HttpResponse.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 2 | export type HttpResponse = { 3 | statusCode: number; 4 | body?: T; 5 | headers?: { token: string }; 6 | }; 7 | -------------------------------------------------------------------------------- /src/infrastructure/http/interfaces/Validation.ts: -------------------------------------------------------------------------------- 1 | export interface Validation { 2 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 3 | validate: (input: any) => Error | null; 4 | } 5 | -------------------------------------------------------------------------------- /src/infrastructure/http/middlewares/BaseMiddleware.ts: -------------------------------------------------------------------------------- 1 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 2 | import { HttpResponse } from '@infrastructure/http/interfaces/HttpResponse'; 3 | import { serverError } from '@infrastructure/http/helpers/http'; 4 | 5 | export abstract class BaseMiddleware { 6 | abstract execute(httpRequest: HttpRequest): Promise; 7 | 8 | async handle(httpRequest: HttpRequest): Promise { 9 | try { 10 | return await this.execute(httpRequest); 11 | } catch (error) { 12 | return serverError(error); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/infrastructure/http/validations/AJVInstance.ts: -------------------------------------------------------------------------------- 1 | import Ajv from 'ajv'; 2 | import addFormats from 'ajv-formats'; 3 | 4 | const ajvInstance = new Ajv({ allErrors: true }); 5 | addFormats(ajvInstance); 6 | 7 | export default ajvInstance; 8 | -------------------------------------------------------------------------------- /src/infrastructure/http/validations/PayloadValidator.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { Validation } from '@infrastructure/http/interfaces/Validation'; 3 | import ajvInstance from '@infrastructure/http/validations/AJVInstance'; 4 | 5 | export class PayloadValidator implements Validation { 6 | constructor(private readonly schema: any, private readonly segment: string) {} 7 | 8 | validate(request: any): Error | null { 9 | const input = request[this.segment]; 10 | 11 | const validator = ajvInstance.compile(this.schema); 12 | 13 | const isValid = validator(input); 14 | if (!isValid) { 15 | const { errors }: any = validator; 16 | const { instancePath, message } = errors[0]; 17 | 18 | return new Error(`${instancePath} ${message}`); 19 | } 20 | 21 | return null; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/adapters/express-middleware-adapter.ts: -------------------------------------------------------------------------------- 1 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 2 | import { BaseMiddleware } from '@infrastructure/http/middlewares/BaseMiddleware'; 3 | import { NextFunction, Request, Response } from 'express'; 4 | 5 | export const expressMiddlewareAdapter = 6 | (middleware: BaseMiddleware) => 7 | async (req: Request, res: Response, next: NextFunction) => { 8 | const httpRequest: HttpRequest = { 9 | body: req.body, 10 | params: req.params, 11 | headers: req.headers, 12 | userId: req.userId, 13 | }; 14 | 15 | const httpResponse = await middleware.handle(httpRequest); 16 | if (httpResponse.statusCode === 200) { 17 | Object.assign(req, httpResponse.body); 18 | next(); 19 | } else { 20 | res.status(httpResponse.statusCode).json({ 21 | error: httpResponse.body?.message, 22 | }); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/main/adapters/express-route-adapter.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 3 | import { Request, Response } from 'express'; 4 | 5 | export const expressRouteAdapter = 6 | (controller: BaseController) => async (req: Request, res: Response) => { 7 | const httpRequest: HttpRequest = { 8 | body: req.body, 9 | params: req.params, 10 | headers: req.headers, 11 | userId: req.userId, 12 | workspaceId: req.workspaceId, 13 | }; 14 | 15 | const httpResponse = await controller.handle(httpRequest); 16 | 17 | if (httpResponse.statusCode >= 200 && httpResponse.statusCode <= 299) { 18 | res.status(httpResponse.statusCode).json(httpResponse.body); 19 | } else { 20 | res.status(httpResponse.statusCode).json({ 21 | error: httpResponse.body?.message, 22 | }); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/main/adapters/express-route-remove-cookie-adapter.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 3 | import { Request, Response } from 'express'; 4 | 5 | export const expressRouteRemoveCookieAdapter = 6 | (controller: BaseController) => async (req: Request, res: Response) => { 7 | const httpRequest: HttpRequest = { 8 | body: req.body, 9 | params: req.params, 10 | headers: req.headers, 11 | userId: req.userId, 12 | }; 13 | 14 | const httpResponse = await controller.handle(httpRequest); 15 | const refreshToken = httpResponse.headers?.token; 16 | 17 | if (httpResponse.statusCode >= 200 && httpResponse.statusCode <= 299) { 18 | res 19 | .status(httpResponse.statusCode) 20 | .cookie('token_v1', refreshToken, { 21 | sameSite: 'strict', 22 | path: '/', 23 | httpOnly: true, 24 | expires: new Date(0), 25 | }) 26 | .json(httpResponse.body); 27 | } else { 28 | res.status(httpResponse.statusCode).json({ 29 | error: httpResponse.body?.message, 30 | }); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /src/main/adapters/express-route-set-cookie-adapter.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 3 | import { Request, Response } from 'express'; 4 | 5 | export const expressRouteSetCookieAdapter = 6 | (controller: BaseController) => async (req: Request, res: Response) => { 7 | const httpRequest: HttpRequest = { 8 | body: req.body, 9 | params: req.params, 10 | headers: req.headers, 11 | userId: req.userId, 12 | }; 13 | 14 | const httpResponse = await controller.handle(httpRequest); 15 | const refreshToken = httpResponse.headers?.token; 16 | 17 | if (httpResponse.statusCode >= 200 && httpResponse.statusCode <= 299) { 18 | res 19 | .status(httpResponse.statusCode) 20 | .cookie('token_v1', refreshToken, { 21 | sameSite: 'strict', 22 | path: '/', 23 | httpOnly: true, 24 | expires: new Date(new Date().getTime() + 31536000000), 25 | }) 26 | .json(httpResponse.body); 27 | } else { 28 | res.status(httpResponse.statusCode).json({ 29 | error: httpResponse.body?.message, 30 | }); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /src/main/config/app.ts: -------------------------------------------------------------------------------- 1 | import express, { Express } from 'express'; 2 | import setupMiddlewares from '@main/config/middlewares'; 3 | import setupRoutes from '@main/config/routes'; 4 | 5 | export default (): Express => { 6 | const app = express(); 7 | setupMiddlewares(app); 8 | setupRoutes(app); 9 | return app; 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/config/custom-modules.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/prefer-namespace-keyword */ 2 | /* eslint-disable no-unused-vars */ 3 | declare module Express { 4 | interface Request { 5 | userId?: string; 6 | workspaceId?: string; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/config/env.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/no-var-requires 2 | require('dotenv').config(); 3 | 4 | export default { 5 | port: process.env.PORT || 5000, 6 | nodeEnv: process.env.NODE_ENV, 7 | mongoUrl: process.env.MONGO_URL || 'mongodb://172.17.0.1:27017/notion', 8 | accessTokenSecret: process.env.ACCESS_TOKEN_SECRET || 'accesstokensecret', 9 | refreshTokenSecret: process.env.REFRESH_TOKEN_SECRET || 'refereshtokensecret', 10 | bcryptSalt: 10, 11 | }; 12 | -------------------------------------------------------------------------------- /src/main/config/middlewares.ts: -------------------------------------------------------------------------------- 1 | import { Express } from 'express'; 2 | import { bodyParser } from '@main/middlewares/body-parser'; 3 | import { cors } from '@main/middlewares/cors'; 4 | import { contentType } from '@main/middlewares/content-type'; 5 | 6 | export default (app: Express): void => { 7 | app.use(bodyParser); 8 | app.use(cors({ origin: 'http://localhost:3000', credentials: true })); 9 | app.use(contentType); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/config/routes.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import express, { Express, Router } from 'express'; 3 | import userRoutes from '@main/routes/user-routes'; 4 | import workspaceRoutes from '@main/routes/workspace-routes'; 5 | import pageRoutes from '@main/routes/page-routes'; 6 | import env from '@main/config/env'; 7 | 8 | export default (app: Express): void => { 9 | const router = Router(); 10 | 11 | app.use('/v1', router); 12 | userRoutes(router); 13 | workspaceRoutes(router); 14 | pageRoutes(router); 15 | 16 | if (env.nodeEnv === 'production') { 17 | // eslint-disable-next-line no-underscore-dangle 18 | const __dirname = path.resolve('../'); 19 | const staticPath = path.join(__dirname, 'notion-browser-client/build'); 20 | app.use(express.static(staticPath)); 21 | 22 | app.get('*', (req, res) => { 23 | res.type('html'); 24 | res.sendFile( 25 | path.resolve(__dirname, 'notion-browser-client', 'build', 'index.html') 26 | ); 27 | }); 28 | } else { 29 | app.get('/test', (req, res) => { 30 | res.status(200).json({ message: 'ok' }); 31 | }); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/add-to-favorite/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { AddToFavoriteController } from '@infrastructure/http/controllers/pages/AddToFavoriteController'; 3 | import { makeAddToFavorite } from '@main/factories/use-cases/pages/add-to-favorite-factory'; 4 | import { makeGetPageById } from '@main/factories/use-cases/pages/get-page-by-id-factory'; 5 | import { makeAddPageIdToFavoritesByWorkspaceId } from '@main/factories/use-cases/users/add-page-id-to-favorites-by-workspace-id-factory'; 6 | 7 | export const makeAddToFavoriteController = (): BaseController => { 8 | const getPageByIdUseCase = makeGetPageById(); 9 | const addToFavotireUseCase = makeAddToFavorite(); 10 | const addPageIdToFavoritesByWorkspaceIdUseCase = 11 | makeAddPageIdToFavoritesByWorkspaceId(); 12 | 13 | return new AddToFavoriteController( 14 | getPageByIdUseCase, 15 | addToFavotireUseCase, 16 | addPageIdToFavoritesByWorkspaceIdUseCase 17 | ); 18 | }; 19 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/create-page/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { makeCreatePageValidation } from '@main/factories/controllers/pages/create-page/validation-factory'; 3 | import { makeCreatePage } from '@main/factories/use-cases/pages/create-page-factory'; 4 | import { CreatePageController } from '@infrastructure/http/controllers/pages/CreatePageController'; 5 | import { makeGetPageById } from '@main/factories/use-cases/pages/get-page-by-id-factory'; 6 | import { makeAddPage } from '@main/factories/use-cases/workspaces/add-page-factory'; 7 | import { makeAddPageIdToFavoritesByWorkspaceId } from '@main/factories/use-cases/users/add-page-id-to-favorites-by-workspace-id-factory'; 8 | 9 | export const makeCreatePageController = (): BaseController => { 10 | const validation = makeCreatePageValidation(); 11 | const createPageUseCase = makeCreatePage(); 12 | const getPageByIdUseCase = makeGetPageById(); 13 | const addPageUseCase = makeAddPage(); 14 | const addPageIdToFavoritesByWorkspaceIdUseCase = 15 | makeAddPageIdToFavoritesByWorkspaceId(); 16 | 17 | return new CreatePageController( 18 | validation, 19 | createPageUseCase, 20 | getPageByIdUseCase, 21 | addPageUseCase, 22 | addPageIdToFavoritesByWorkspaceIdUseCase 23 | ); 24 | }; 25 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/create-page/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { createPageSchema } from '@main/schemas/create-page-schema'; 3 | 4 | export const makeCreatePageValidation = (): PayloadValidator => { 5 | const schema = createPageSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/delete-pages-by-workspace-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { DeletePagesByWorkspaceIdController } from '@infrastructure/http/controllers/pages/DeletePagesByWorkspaceIdController'; 3 | import { makeDeletePagesByWorkspaceId } from '@main/factories/use-cases/pages/delete-pages-by-workspace-id-factory'; 4 | import { makeGetWorkspaceById } from '@main/factories/use-cases/workspaces/get-workspace-by-id-factory'; 5 | 6 | export const makeDeletePagesByWorkspaceIdController = (): BaseController => { 7 | const getWorkspaceByIdUseCase = makeGetWorkspaceById(); 8 | const deletePagesByWorkspaceIdUseCase = makeDeletePagesByWorkspaceId(); 9 | 10 | return new DeletePagesByWorkspaceIdController( 11 | getWorkspaceByIdUseCase, 12 | deletePagesByWorkspaceIdUseCase 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/get-page-by-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { GetPageByIdController } from '@infrastructure/http/controllers/pages/GetPageByIdController'; 3 | import { makeGetPageById } from '@main/factories/use-cases/pages/get-page-by-id-factory'; 4 | 5 | export const makeGetPageByIdController = (): BaseController => { 6 | const getPageByIdUseCase = makeGetPageById(); 7 | 8 | return new GetPageByIdController(getPageByIdUseCase); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/get-page-content-by-page-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { GetPageContentByPageIdController } from '@infrastructure/http/controllers/pages/GetPageContentByPageIdController'; 3 | import { makeGetPageById } from '@main/factories/use-cases/pages/get-page-by-id-factory'; 4 | import { makeGetPageContentByPageId } from '@main/factories/use-cases/pages/get-page-content-by-page-id-factory'; 5 | 6 | export const makeGetPageContentByPageIdController = (): BaseController => { 7 | const getPageByIdUseCase = makeGetPageById(); 8 | const getPageContentByPageIdUseCase = makeGetPageContentByPageId(); 9 | 10 | return new GetPageContentByPageIdController( 11 | getPageByIdUseCase, 12 | getPageContentByPageIdUseCase 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/get-page-settings-by-page-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { GetPageSettingsByPageIdController } from '@infrastructure/http/controllers/pages/GetPageSettingsByPageIdController'; 3 | import { makeGetPageById } from '@main/factories/use-cases/pages/get-page-by-id-factory'; 4 | import { makeGetPageSettingsByPageId } from '@main/factories/use-cases/pages/get-page-settings-by-page-id-factory'; 5 | 6 | export const makeGetPageSettingsByPageIdController = (): BaseController => { 7 | const getPageByIdUseCase = makeGetPageById(); 8 | const getPageSettingsByPageIdUseCase = makeGetPageSettingsByPageId(); 9 | 10 | return new GetPageSettingsByPageIdController( 11 | getPageByIdUseCase, 12 | getPageSettingsByPageIdUseCase 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/remove-from-favorite/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { RemoveFromFavoriteController } from '@infrastructure/http/controllers/pages/RemoveFromFavoriteController'; 3 | import { makeGetPageById } from '@main/factories/use-cases/pages/get-page-by-id-factory'; 4 | import { makeRemoveFromFavorite } from '@main/factories/use-cases/pages/remove-from-favorite-factory'; 5 | import { makeRemovePageIdFromFavoritesByWorkspaceId } from '@main/factories/use-cases/users/remove-page-id-from-favorites-by-workspace-id-factory'; 6 | 7 | export const makeRemoveFromFavoriteController = (): BaseController => { 8 | const getPageByIdUseCase = makeGetPageById(); 9 | const removeFromFavoriteUseCase = makeRemoveFromFavorite(); 10 | const removePageIdFromFavoritesByWorkspaceIdUseCase = 11 | makeRemovePageIdFromFavoritesByWorkspaceId(); 12 | 13 | return new RemoveFromFavoriteController( 14 | getPageByIdUseCase, 15 | removeFromFavoriteUseCase, 16 | removePageIdFromFavoritesByWorkspaceIdUseCase 17 | ); 18 | }; 19 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/update-page-content-by-page-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { UpdatePageContentByPageIdController } from '@infrastructure/http/controllers/pages/UpdatePageContentByPageIdController'; 3 | import { makeUpdatePageContentByPageIdValidation } from '@main/factories/controllers/pages/update-page-content-by-page-id/validation-factory'; 4 | import { makeGetPageById } from '@main/factories/use-cases/pages/get-page-by-id-factory'; 5 | import { makeUpdatePageContentByPageId } from '@main/factories/use-cases/pages/update-page-content-by-page-id-factory'; 6 | 7 | export const makeUpdatePageContentByPageIdController = (): BaseController => { 8 | const validation = makeUpdatePageContentByPageIdValidation(); 9 | const getPageByIdUseCase = makeGetPageById(); 10 | const updatePageContentByPageIdUseCase = makeUpdatePageContentByPageId(); 11 | 12 | return new UpdatePageContentByPageIdController( 13 | validation, 14 | getPageByIdUseCase, 15 | updatePageContentByPageIdUseCase 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/update-page-content-by-page-id/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { updatePageContentSchema } from '@main/schemas/update-page-content-schema'; 3 | 4 | export const makeUpdatePageContentByPageIdValidation = (): PayloadValidator => { 5 | const schema = updatePageContentSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/update-page-cover-by-page-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { UpdatePageCoverByPageIdController } from '@infrastructure/http/controllers/pages/UpdatePageCoverByPageIdController'; 3 | import { makeUpdatePageCoverByPageIdValidation } from '@main/factories/controllers/pages/update-page-cover-by-page-id/validation-factory'; 4 | import { makeGetPageById } from '@main/factories/use-cases/pages/get-page-by-id-factory'; 5 | import { makeUpdatePageCoverByPageId } from '@main/factories/use-cases/pages/update-page-cover-by-page-id-factory'; 6 | 7 | export const makeUpdatePageCoverByPageIdController = (): BaseController => { 8 | const validation = makeUpdatePageCoverByPageIdValidation(); 9 | const getPageByIdUseCase = makeGetPageById(); 10 | const updatePageCoverByPageIdUseCase = makeUpdatePageCoverByPageId(); 11 | 12 | return new UpdatePageCoverByPageIdController( 13 | validation, 14 | getPageByIdUseCase, 15 | updatePageCoverByPageIdUseCase 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/update-page-cover-by-page-id/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { updatePageCoverSchema } from '@main/schemas/update-page-cover-schema'; 3 | 4 | export const makeUpdatePageCoverByPageIdValidation = (): PayloadValidator => { 5 | const schema = updatePageCoverSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/update-page-icon-by-page-id/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { updatePageIconSchema } from '@main/schemas/update-page-icon-schema'; 3 | 4 | export const makeUpdatePageIconByPageIdValidation = (): PayloadValidator => { 5 | const schema = updatePageIconSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/update-page-settings-by-page-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { UpdatePageSettingsByPageIdController } from '@infrastructure/http/controllers/pages/UpdatePageSettingsByPageIdController'; 3 | import { makeUpdatePageSettingsByPageIdValidation } from '@main/factories/controllers/pages/update-page-settings-by-page-id/validation-factory'; 4 | import { makeGetPageById } from '@main/factories/use-cases/pages/get-page-by-id-factory'; 5 | import { makeUpdatePageSettingsByPageId } from '@main/factories/use-cases/pages/update-page-settings-by-page-id-factory'; 6 | 7 | export const makeUpdatePageSettingsByPageIdController = (): BaseController => { 8 | const validation = makeUpdatePageSettingsByPageIdValidation(); 9 | const getPageByIdUseCase = makeGetPageById(); 10 | const updatePageSettingsByPageIdUseCase = makeUpdatePageSettingsByPageId(); 11 | 12 | return new UpdatePageSettingsByPageIdController( 13 | validation, 14 | getPageByIdUseCase, 15 | updatePageSettingsByPageIdUseCase 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/update-page-settings-by-page-id/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { updatePageSettingsSchema } from '@main/schemas/update-page-settings-schema'; 3 | 4 | export const makeUpdatePageSettingsByPageIdValidation = 5 | (): PayloadValidator => { 6 | const schema = updatePageSettingsSchema; 7 | 8 | return new PayloadValidator(schema, 'body'); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/controllers/pages/update-page-title-by-page-id/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { updatePageTitleSchema } from '@main/schemas/update-page-title-schema'; 3 | 4 | export const makeUpdatePageTitleByPageIdValidation = (): PayloadValidator => { 5 | const schema = updatePageTitleSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/add-page-id-to-favorites-by-workspace-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { AddPageIdToFavoritesByWorkspaceIdController } from '@infrastructure/http/controllers/users/AddPageIdToFavoritesByWorkspaceIdController'; 3 | import { makeAddPageIdToFavoritesByWorkspaceId } from '@main/factories/use-cases/users/add-page-id-to-favorites-by-workspace-id-factory'; 4 | import { makeGetWorkspacesByUserId } from '@main/factories/use-cases/users/get-workspaces-by-user-id-factory'; 5 | 6 | export const makeAddPageIdToFavoritesByWorkspaceIdController = 7 | (): BaseController => { 8 | const getWorkspacesByUserIdUseCase = makeGetWorkspacesByUserId(); 9 | const addPageIdToFavoritesByWorkspaceIdUseCase = 10 | makeAddPageIdToFavoritesByWorkspaceId(); 11 | 12 | return new AddPageIdToFavoritesByWorkspaceIdController( 13 | getWorkspacesByUserIdUseCase, 14 | addPageIdToFavoritesByWorkspaceIdUseCase 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/add-workspace-by-user-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { AddWorkspaceByUserIdController } from '@infrastructure/http/controllers/users/AddWorkspaceByUserIdController'; 3 | import { makeAddWorkspaceByUserId } from '@main/factories/use-cases/users/add-workspace-by-user-id-factory'; 4 | import { makeGetUserById } from '@main/factories/use-cases/users/get-user-by-id-factory'; 5 | 6 | export const makeAddWorkspaceByUserIdController = (): BaseController => { 7 | const getUserByIdUseCase = makeGetUserById(); 8 | const addWorkspaceByUserIdUseCase = makeAddWorkspaceByUserId(); 9 | 10 | return new AddWorkspaceByUserIdController( 11 | getUserByIdUseCase, 12 | addWorkspaceByUserIdUseCase 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/get-access-token/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { GetAccessTokenController } from '@infrastructure/http/controllers/users/GetAccessTokenController'; 3 | import { makeGetAccessToken } from '@main/factories/use-cases/users/get-access-token-factory'; 4 | 5 | export const makeGetAccessTokenController = (): BaseController => { 6 | const useCase = makeGetAccessToken(); 7 | 8 | return new GetAccessTokenController(useCase); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/get-favorites-by-workspace-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { GetFavoritesByWorkspaceIdController } from '@infrastructure/http/controllers/users/GetFavoritesByWorkspaceIdController'; 3 | import { makeGetFavoritesByWorkspaceId } from '@main/factories/use-cases/users/get-favorites-by-workspace-id-factory'; 4 | import { makeGetWorkspacesByUserId } from '@main/factories/use-cases/users/get-workspaces-by-user-id-factory'; 5 | 6 | export const makeGetFavoritesByWorkspaceIdController = (): BaseController => { 7 | const getWorkspacesByUserIdUseCase = makeGetWorkspacesByUserId(); 8 | const getFavoritesByWorkspaceIdUseCase = makeGetFavoritesByWorkspaceId(); 9 | 10 | return new GetFavoritesByWorkspaceIdController( 11 | getWorkspacesByUserIdUseCase, 12 | getFavoritesByWorkspaceIdUseCase 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/get-user-by-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { GetUserByIdController } from '@infrastructure/http/controllers/users/GetUserByIdController'; 3 | import { makeGetUserById } from '@main/factories/use-cases/users/get-user-by-id-factory'; 4 | 5 | export const makeGetUserByIdController = (): BaseController => { 6 | const getUserByIdUseCase = makeGetUserById(); 7 | 8 | return new GetUserByIdController(getUserByIdUseCase); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/get-workspaces-by-user-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { GetWorkspacesByUserIdController } from '@infrastructure/http/controllers/users/GetWorkspacesByUserIdController'; 3 | import { makeGetWorkspacesByUserId } from '@main/factories/use-cases/users/get-workspaces-by-user-id-factory'; 4 | 5 | export const makeGetWorkspacesByUserIdController = (): BaseController => { 6 | const getWorkspacesByUserIdUseCase = makeGetWorkspacesByUserId(); 7 | 8 | return new GetWorkspacesByUserIdController(getWorkspacesByUserIdUseCase); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/remove-page-id-from-favorites-by-workspace-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { RemovePageIdFromFavoritesByWorkspaceIdController } from '@infrastructure/http/controllers/users/RemovePageIdFromFavoritesByWorkspaceIdController'; 3 | import { makeGetWorkspacesByUserId } from '@main/factories/use-cases/users/get-workspaces-by-user-id-factory'; 4 | import { makeRemovePageIdFromFavoritesByWorkspaceId } from '@main/factories/use-cases/users/remove-page-id-from-favorites-by-workspace-id-factory'; 5 | 6 | export const makeRemovePageIdFromFavoritesByWorkspaceIdController = 7 | (): BaseController => { 8 | const getWorkspacesByUserIdUseCase = makeGetWorkspacesByUserId(); 9 | const removePageIdFromFavoritesByWorkspaceIdUseCase = 10 | makeRemovePageIdFromFavoritesByWorkspaceId(); 11 | 12 | return new RemovePageIdFromFavoritesByWorkspaceIdController( 13 | getWorkspacesByUserIdUseCase, 14 | removePageIdFromFavoritesByWorkspaceIdUseCase 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/remove-workspace-by-user-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { RemoveWorkspaceByUserIdController } from '@infrastructure/http/controllers/users/RemoveWorkspaceByUserIdController'; 3 | import { makeGetWorkspacesByUserId } from '@main/factories/use-cases/users/get-workspaces-by-user-id-factory'; 4 | import { makeRemoveWorkspaceByUserId } from '@main/factories/use-cases/users/remove-workspace-by-user-id-factory'; 5 | 6 | export const makeRemoveWorkspaceByUserIdController = (): BaseController => { 7 | const getWorkspacesByUserIdUseCase = makeGetWorkspacesByUserId(); 8 | const removeWorkspaceByUserIdUseCase = makeRemoveWorkspaceByUserId(); 9 | 10 | return new RemoveWorkspaceByUserIdController( 11 | getWorkspacesByUserIdUseCase, 12 | removeWorkspaceByUserIdUseCase 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/sign-in/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { SignInController } from '@infrastructure/http/controllers/users/SignInController'; 3 | import { makeSignInValidation } from '@main/factories/controllers/users/sign-in/validation-factory'; 4 | import { makeSignIn } from '@main/factories/use-cases/users/sign-in-factory'; 5 | 6 | export const makeSignInController = (): BaseController => { 7 | const validation = makeSignInValidation(); 8 | const useCase = makeSignIn(); 9 | 10 | return new SignInController(validation, useCase); 11 | }; 12 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/sign-in/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { signInSchema } from '@main/schemas/sign-in-schema'; 3 | 4 | export const makeSignInValidation = (): PayloadValidator => { 5 | const schema = signInSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/sign-out/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { SignOutController } from '@infrastructure/http/controllers/users/SignOutController'; 3 | import { makeSignOut } from '@main/factories/use-cases/users/sign-out-factory'; 4 | 5 | export const makeSignOutController = (): BaseController => { 6 | const useCase = makeSignOut(); 7 | 8 | return new SignOutController(useCase); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/sign-up/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { signUpSchema } from '@main/schemas/sign-up-schema'; 3 | 4 | export const makeSignUpValidation = (): PayloadValidator => { 5 | const schema = signUpSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/update-user-profile-picture/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { UpdateUserProfilePictureController } from '@infrastructure/http/controllers/users/UpdateUserProfilePictureController'; 3 | import { makeUpdateUserProfilePictureValidation } from '@main/factories/controllers/users/update-user-profile-picture/validation-factory'; 4 | import { makeGetUserById } from '@main/factories/use-cases/users/get-user-by-id-factory'; 5 | import { makeUpdateUserProfilePicture } from '@main/factories/use-cases/users/update-user-profile-picture-factory'; 6 | 7 | export const makeUpdateUserProfilePictureController = (): BaseController => { 8 | const validation = makeUpdateUserProfilePictureValidation(); 9 | const getUserByIdUseCase = makeGetUserById(); 10 | const updateUserProfilePictureUseCase = makeUpdateUserProfilePicture(); 11 | 12 | return new UpdateUserProfilePictureController( 13 | validation, 14 | getUserByIdUseCase, 15 | updateUserProfilePictureUseCase 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/update-user-profile-picture/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { updateUserProfilePictureSchema } from '@main/schemas/update-user-profile-picture-schema'; 3 | 4 | export const makeUpdateUserProfilePictureValidation = (): PayloadValidator => { 5 | const schema = updateUserProfilePictureSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/update-user/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { UpdateUserController } from '@infrastructure/http/controllers/users/UpdateUserController'; 3 | import { makeUpdateUserValidation } from '@main/factories/controllers/users/update-user/validation-factory'; 4 | import { makeGetUserById } from '@main/factories/use-cases/users/get-user-by-id-factory'; 5 | import { makeUpdateUser } from '@main/factories/use-cases/users/update-user-factory'; 6 | 7 | export const makeUpdateUserController = (): BaseController => { 8 | const validation = makeUpdateUserValidation(); 9 | const getUserByIdUseCase = makeGetUserById(); 10 | const updateUserUseCase = makeUpdateUser(); 11 | return new UpdateUserController( 12 | validation, 13 | getUserByIdUseCase, 14 | updateUserUseCase 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/main/factories/controllers/users/update-user/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { updateUserSchema } from '@main/schemas/update-user-schema'; 3 | 4 | export const makeUpdateUserValidation = (): PayloadValidator => { 5 | const schema = updateUserSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/controllers/workspaces/add-member-by-workspace-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { AddMemberByWorkspaceIdController } from '@infrastructure/http/controllers/workspaces/AddMemberByWorkspaceIdController'; 3 | import { makeAddMemberByWorkspaceId } from '@main/factories/use-cases/workspaces/add-member-by-workspace-id-factory'; 4 | import { makeGetWorkspaceById } from '@main/factories/use-cases/workspaces/get-workspace-by-id-factory'; 5 | 6 | export const makeAddMemberByWorkspaceIdController = (): BaseController => { 7 | const getWorkspaceByIdUseCase = makeGetWorkspaceById(); 8 | const addMemberByWorkspaceIdUseCase = makeAddMemberByWorkspaceId(); 9 | 10 | return new AddMemberByWorkspaceIdController( 11 | getWorkspaceByIdUseCase, 12 | addMemberByWorkspaceIdUseCase 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/factories/controllers/workspaces/add-page/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { AddPageController } from '@infrastructure/http/controllers/workspaces/AddPageController'; 3 | import { makeAddPage } from '@main/factories/use-cases/workspaces/add-page-factory'; 4 | import { makeGetWorkspaceById } from '@main/factories/use-cases/workspaces/get-workspace-by-id-factory'; 5 | import { makeAddPageValidation } from '@main/factories/controllers/workspaces/add-page/validation-factory'; 6 | 7 | export const makeAddPageController = (): BaseController => { 8 | const validation = makeAddPageValidation(); 9 | const getWorkspaceByIdUseCase = makeGetWorkspaceById(); 10 | const addPageUseCase = makeAddPage(); 11 | 12 | return new AddPageController( 13 | validation, 14 | getWorkspaceByIdUseCase, 15 | addPageUseCase 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /src/main/factories/controllers/workspaces/add-page/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { addPageSchema } from '@main/schemas/add-page-schema'; 3 | 4 | export const makeAddPageValidation = (): PayloadValidator => { 5 | const schema = addPageSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/controllers/workspaces/create-workspace/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { createWorkspaceSchema } from '@main/schemas/create-workspace-schema'; 3 | 4 | export const makeCreateWorkspaceValidation = (): PayloadValidator => { 5 | const schema = createWorkspaceSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/controllers/workspaces/get-all-members-by-workspace-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { GetAllMembersByWorkspaceIdController } from '@infrastructure/http/controllers/workspaces/GetAllMembersByWorkspaceIdController'; 3 | import { makeGetAllMembersByWorkspaceId } from '@main/factories/use-cases/workspaces/get-all-members-by-workspace-id-factory'; 4 | import { makeGetWorkspaceById } from '@main/factories/use-cases/workspaces/get-workspace-by-id-factory'; 5 | 6 | export const makeGetAllMembersByWorkspaceIdController = (): BaseController => { 7 | const getWorkspaceByIdUseCase = makeGetWorkspaceById(); 8 | const getAllMembersByWorkspaceIdUseCase = makeGetAllMembersByWorkspaceId(); 9 | 10 | return new GetAllMembersByWorkspaceIdController( 11 | getWorkspaceByIdUseCase, 12 | getAllMembersByWorkspaceIdUseCase 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/factories/controllers/workspaces/get-all-root-pages/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { GetAllRootPagesController } from '@infrastructure/http/controllers/workspaces/GetAllRootPagesController'; 3 | import { makeGetAllRootPages } from '@main/factories/use-cases/workspaces/get-all-root-pages-factory'; 4 | import { makeGetWorkspaceById } from '@main/factories/use-cases/workspaces/get-workspace-by-id-factory'; 5 | 6 | export const makeGetAllRootPagesController = (): BaseController => { 7 | const getWorkspaceByIdUseCase = makeGetWorkspaceById(); 8 | const getAllRootPagesUseCase = makeGetAllRootPages(); 9 | 10 | return new GetAllRootPagesController( 11 | getWorkspaceByIdUseCase, 12 | getAllRootPagesUseCase 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/factories/controllers/workspaces/get-childrens-by-page-reference/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { GetChildrensByPageReferenceController } from '@infrastructure/http/controllers/workspaces/GetChildrensByPageReferenceController'; 3 | import { makeGetChildrensByPageReference } from '@main/factories/use-cases/workspaces/get-childrens-by-page-reference-factory'; 4 | 5 | export const makeGetChildrensByPageReferenceController = (): BaseController => { 6 | const getChildrensByPageReferenceUseCase = makeGetChildrensByPageReference(); 7 | 8 | return new GetChildrensByPageReferenceController( 9 | getChildrensByPageReferenceUseCase 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /src/main/factories/controllers/workspaces/get-workspace-by-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { GetWorkspaceByIdController } from '@infrastructure/http/controllers/workspaces/GetWorkspaceByIdController'; 3 | import { makeGetWorkspaceById } from '@main/factories/use-cases/workspaces/get-workspace-by-id-factory'; 4 | 5 | export const makeGetWorkspaceByIdController = (): BaseController => { 6 | const getWorkspaceByIdUseCase = makeGetWorkspaceById(); 7 | 8 | return new GetWorkspaceByIdController(getWorkspaceByIdUseCase); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/controllers/workspaces/remove-member-by-workspace-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { RemoveMemberByWorkspaceIdController } from '@infrastructure/http/controllers/workspaces/RemoveMemberByWorkspaceIdController'; 3 | import { makeGetWorkspaceById } from '@main/factories/use-cases/workspaces/get-workspace-by-id-factory'; 4 | import { makeRemoveMemberByWorkspaceId } from '@main/factories/use-cases/workspaces/remove-member-by-workspace-id-factory'; 5 | 6 | export const makeRemoveMemberByWorkspaceIdController = (): BaseController => { 7 | const getWorkspaceByIdUseCase = makeGetWorkspaceById(); 8 | const removeMemberByWorkspaceIdUseCase = makeRemoveMemberByWorkspaceId(); 9 | 10 | return new RemoveMemberByWorkspaceIdController( 11 | getWorkspaceByIdUseCase, 12 | removeMemberByWorkspaceIdUseCase 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/factories/controllers/workspaces/remove-page-by-page-id/controller-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 2 | import { RemovePageByPageIdController } from '@infrastructure/http/controllers/workspaces/RemovePageByPageIdController'; 3 | import { makeGetWorkspaceById } from '@main/factories/use-cases/workspaces/get-workspace-by-id-factory'; 4 | import { makeRemovePageByPageId } from '@main/factories/use-cases/workspaces/remove-page-by-page-id-factory'; 5 | 6 | export const makeRemovePageByPageIdController = (): BaseController => { 7 | const getWorkspaceByIdUseCase = makeGetWorkspaceById(); 8 | const removePageByPageIdUseCase = makeRemovePageByPageId(); 9 | 10 | return new RemovePageByPageIdController( 11 | getWorkspaceByIdUseCase, 12 | removePageByPageIdUseCase 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/factories/controllers/workspaces/update-workspace/validation-factory.ts: -------------------------------------------------------------------------------- 1 | import { PayloadValidator } from '@infrastructure/http/validations/PayloadValidator'; 2 | import { updateWorkspaceSchema } from '@main/schemas/update-workspace-schema'; 3 | 4 | export const makeUpdateWorkspaceValidation = (): PayloadValidator => { 5 | const schema = updateWorkspaceSchema; 6 | 7 | return new PayloadValidator(schema, 'body'); 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/factories/middlewares/auth-middleware-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseMiddleware } from '@infrastructure/http/middlewares/BaseMiddleware'; 2 | import { AuthMiddleware } from '@infrastructure/http/middlewares/authentication/AuthMiddleware'; 3 | import { makeAuthenticate } from '@main/factories/use-cases/users/authenticate-factory'; 4 | 5 | export const makeAuthMiddleware = (): BaseMiddleware => { 6 | const authenticationUseCase = makeAuthenticate(); 7 | 8 | return new AuthMiddleware(authenticationUseCase); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/middlewares/authorization-middleware-factory.ts: -------------------------------------------------------------------------------- 1 | import { BaseMiddleware } from '@infrastructure/http/middlewares/BaseMiddleware'; 2 | import { AuthorizationMiddleware } from '@infrastructure/http/middlewares/authorization/AuthorizationMiddleware'; 3 | import { makeAuthorization } from '@main/factories/use-cases/pages/authorization-factory'; 4 | 5 | export const makeAuthorizationMiddleware = (): BaseMiddleware => { 6 | const authorizationUseCase = makeAuthorization(); 7 | 8 | return new AuthorizationMiddleware(authorizationUseCase); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/add-to-favorite-factory.ts: -------------------------------------------------------------------------------- 1 | import { AddToFavoriteInterface } from '@application/interfaces/use-cases/pages/addToFavoriteInterface'; 2 | import { AddToFavorite } from '@application/use-cases/pages/AddToFavorite'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeAddToFavorite = (): AddToFavoriteInterface => { 6 | const pageRepository = new PageRepository(); 7 | 8 | return new AddToFavorite(pageRepository, pageRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/authorization-factory.ts: -------------------------------------------------------------------------------- 1 | import { AuthorizationInterface } from '@application/interfaces/use-cases/pages/authorizationInterface'; 2 | import { Authorization } from '@application/use-cases/pages/Authorization'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 5 | 6 | export const makeAuthorization = (): AuthorizationInterface => { 7 | const userRepository = new UserRepository(); 8 | const pageRepository = new PageRepository(); 9 | 10 | return new Authorization(pageRepository, userRepository); 11 | }; 12 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/create-page-factory.ts: -------------------------------------------------------------------------------- 1 | import { CreatePageInterface } from '@application/interfaces/use-cases/pages/createPageInterface'; 2 | import { CreatePage } from '@application/use-cases/pages/CreatePage'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeCreatePage = (): CreatePageInterface => { 6 | const pageRepository = new PageRepository(); 7 | 8 | return new CreatePage(pageRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/delete-page-factory.ts: -------------------------------------------------------------------------------- 1 | import { DeletePageInterface } from '@application/interfaces/use-cases/pages/deletePageInterface'; 2 | import { DeletePage } from '@application/use-cases/pages/DeletePage'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeDeletePage = (): DeletePageInterface => { 6 | const pageRepository = new PageRepository(); 7 | 8 | return new DeletePage(pageRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/delete-pages-by-workspace-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { DeletePagesByWorkspaceIdInterface } from '@application/interfaces/use-cases/pages/deletePagesByWorkspaceIdInterface'; 2 | import { DeletePagesByWorkspaceId } from '@application/use-cases/pages/DeletePagesByWorkspaceId'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeDeletePagesByWorkspaceId = 6 | (): DeletePagesByWorkspaceIdInterface => { 7 | const pageRepository = new PageRepository(); 8 | 9 | return new DeletePagesByWorkspaceId(pageRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/get-page-by-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { GetPageByIdInterface } from '@application/interfaces/use-cases/pages/getPageByIdInterface'; 2 | import { GetPageById } from '@application/use-cases/pages/GetPageById'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeGetPageById = (): GetPageByIdInterface => { 6 | const pageRepository = new PageRepository(); 7 | 8 | return new GetPageById(pageRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/get-page-content-by-page-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { GetPageContentByPageIdInterface } from '@application/interfaces/use-cases/pages/getPageContentByPageIdInterface'; 2 | import { GetPageContentByPageId } from '@application/use-cases/pages/GetPageContentByPageId'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeGetPageContentByPageId = 6 | (): GetPageContentByPageIdInterface => { 7 | const pageRepository = new PageRepository(); 8 | 9 | return new GetPageContentByPageId(pageRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/get-page-ids-by-path.ts: -------------------------------------------------------------------------------- 1 | import { GetPageIdsByPathInterface } from '@application/interfaces/use-cases/pages/getPageIdsByPathInterface'; 2 | import { GetPageIdsByPath } from '@application/use-cases/pages/GetPageIdsByPath'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeGetPageIdsByPath = (): GetPageIdsByPathInterface => { 6 | const pageRepository = new PageRepository(); 7 | 8 | return new GetPageIdsByPath(pageRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/get-page-settings-by-page-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { GetPageSettingsByPageIdInterface } from '@application/interfaces/use-cases/pages/getPageSettingsByPageIdInterface'; 2 | import { GetPageSettingsByPageId } from '@application/use-cases/pages/GetPageSettingsByPageId'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeGetPageSettingsByPageId = 6 | (): GetPageSettingsByPageIdInterface => { 7 | const pageRepository = new PageRepository(); 8 | 9 | return new GetPageSettingsByPageId(pageRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/remove-from-favorite-factory.ts: -------------------------------------------------------------------------------- 1 | import { RemoveFromFavoriteInterface } from '@application/interfaces/use-cases/pages/removeFromFavoriteInterface'; 2 | import { RemoveFromFavorite } from '@application/use-cases/pages/RemoveFromFavorite'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeRemoveFromFavorite = (): RemoveFromFavoriteInterface => { 6 | const pageRepository = new PageRepository(); 7 | 8 | return new RemoveFromFavorite(pageRepository, pageRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/update-page-content-by-page-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { UpdatePageContentByPageIdInterface } from '@application/interfaces/use-cases/pages/updatePageContentByPageIdInterface'; 2 | import { UpdatePageContentByPageId } from '@application/use-cases/pages/UpdatePageContentByPageId'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeUpdatePageContentByPageId = 6 | (): UpdatePageContentByPageIdInterface => { 7 | const pageRepository = new PageRepository(); 8 | 9 | return new UpdatePageContentByPageId(pageRepository, pageRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/update-page-cover-by-page-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { UpdatePageCoverByPageIdInterface } from '@application/interfaces/use-cases/pages/updatePageCoverByPageIdInterface'; 2 | import { UpdatePageCoverByPageId } from '@application/use-cases/pages/UpdatePageCoverByPageId'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeUpdatePageCoverByPageId = 6 | (): UpdatePageCoverByPageIdInterface => { 7 | const pageRepository = new PageRepository(); 8 | 9 | return new UpdatePageCoverByPageId(pageRepository, pageRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/update-page-icon-by-page-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { UpdatePageIconByPageIdInterface } from '@application/interfaces/use-cases/pages/updatePageIconByPageIdInterface'; 2 | import { UpdatePageIconByPageId } from '@application/use-cases/pages/UpdatePageIconByPageId'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeUpdatePageIconByPageId = 6 | (): UpdatePageIconByPageIdInterface => { 7 | const pageRepository = new PageRepository(); 8 | 9 | return new UpdatePageIconByPageId(pageRepository, pageRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/update-page-path-by-page-id.ts: -------------------------------------------------------------------------------- 1 | import { UpdatePagePathByPageIdInterface } from '@application/interfaces/use-cases/pages/updatePagePathByPageIdInterface'; 2 | import { UpdatePagePathByPageId } from '@application/use-cases/pages/UpdatePagePathByPageId'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeUpdatePagePathByPageId = 6 | (): UpdatePagePathByPageIdInterface => { 7 | const pageRepository = new PageRepository(); 8 | 9 | return new UpdatePagePathByPageId(pageRepository, pageRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/update-page-settings-by-page-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { UpdatePageSettingsByPageIdInterface } from '@application/interfaces/use-cases/pages/updatePageSettingsByPageIdInterface'; 2 | import { UpdatePageSettingsByPageId } from '@application/use-cases/pages/UpdatePageSettingsByPageId'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeUpdatePageSettingsByPageId = 6 | (): UpdatePageSettingsByPageIdInterface => { 7 | const pageRepository = new PageRepository(); 8 | 9 | return new UpdatePageSettingsByPageId(pageRepository, pageRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/pages/update-page-title-by-page-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { UpdatePageTitleByPageIdInterface } from '@application/interfaces/use-cases/pages/updatePageTitleByPageIdInterface'; 2 | import { UpdatePageTitleByPageId } from '@application/use-cases/pages/UpdatePageTitleByPageId'; 3 | import { PageRepository } from '@infrastructure/db/mongodb/repositories/PageRepository'; 4 | 5 | export const makeUpdatePageTitleByPageId = 6 | (): UpdatePageTitleByPageIdInterface => { 7 | const pageRepository = new PageRepository(); 8 | 9 | return new UpdatePageTitleByPageId(pageRepository, pageRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/add-page-id-to-favorites-by-workspace-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { AddPageIdToFavoritesByWorkspaceIdInterface } from '@application/interfaces/use-cases/users/AddPageIdToFavoritesByWorkspaceIdInterface'; 2 | import { AddPageIdToFavoritesByWorkspaceId } from '@application/use-cases/users/AddPageIdToFavoritesByWorkspaceId'; 3 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 4 | 5 | export const makeAddPageIdToFavoritesByWorkspaceId = 6 | (): AddPageIdToFavoritesByWorkspaceIdInterface => { 7 | const userRepository = new UserRepository(); 8 | 9 | return new AddPageIdToFavoritesByWorkspaceId( 10 | userRepository, 11 | userRepository 12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/add-workspace-by-user-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { AddWorkspaceByUserIdInterface } from '@application/interfaces/use-cases/users/AddWorkspaceByUserIdInterface'; 2 | import { AddWorkspaceByUserId } from '@application/use-cases/users/AddWorkspaceByUserId'; 3 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 4 | 5 | export const makeAddWorkspaceByUserId = (): AddWorkspaceByUserIdInterface => { 6 | const userRepository = new UserRepository(); 7 | 8 | return new AddWorkspaceByUserId(userRepository, userRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/authenticate-factory.ts: -------------------------------------------------------------------------------- 1 | import { AuthenticateInterface } from '@application/interfaces/use-cases/users/AuthenticateInterface'; 2 | import { Authenticate } from '@application/use-cases/users/Authenticate'; 3 | import { JWTAdapter } from '@infrastructure/cryptography/JWTAdapter'; 4 | import env from '@main/config/env'; 5 | 6 | export const makeAuthenticate = (): AuthenticateInterface => { 7 | const jwtAdapter = new JWTAdapter( 8 | env.accessTokenSecret, 9 | env.refreshTokenSecret 10 | ); 11 | return new Authenticate(jwtAdapter); 12 | }; 13 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/delete-user-factory.ts: -------------------------------------------------------------------------------- 1 | import { DeleteUserInterface } from '@application/interfaces/use-cases/users/DeleteUserInterface'; 2 | import { DeleteUser } from '@application/use-cases/users/DeleteUser'; 3 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 4 | 5 | export const makeDeleteUser = (): DeleteUserInterface => { 6 | const userRepository = new UserRepository(); 7 | 8 | return new DeleteUser(userRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/get-access-token-factory.ts: -------------------------------------------------------------------------------- 1 | import { GetAccessTokenInterface } from '@application/interfaces/use-cases/users/GetAccessTokenInterface'; 2 | import { GetAccessToken } from '@application/use-cases/users/GetAccessToken'; 3 | import { TokenRepository } from '@infrastructure/db/mongodb/repositories/TokenRepository'; 4 | import { JWTAdapter } from '@infrastructure/cryptography/JWTAdapter'; 5 | import env from '@main/config/env'; 6 | 7 | export const makeGetAccessToken = (): GetAccessTokenInterface => { 8 | const tokenRepository = new TokenRepository(); 9 | const jwtAdapter = new JWTAdapter( 10 | env.accessTokenSecret, 11 | env.refreshTokenSecret 12 | ); 13 | 14 | return new GetAccessToken(tokenRepository, jwtAdapter, jwtAdapter); 15 | }; 16 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/get-favorites-by-workspace-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { GetFavoritesByWorkspaceIdInterface } from '@application/interfaces/use-cases/users/GetFavoritesByWorkspaceIdInterface'; 2 | import { GetFavoritesByWorkspaceId } from '@application/use-cases/users/GetFavoritesByWorkspaceId'; 3 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 4 | 5 | export const makeGetFavoritesByWorkspaceId = 6 | (): GetFavoritesByWorkspaceIdInterface => { 7 | const userRepository = new UserRepository(); 8 | 9 | return new GetFavoritesByWorkspaceId(userRepository, userRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/get-user-by-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { GetUserByIdInterface } from '@application/interfaces/use-cases/users/GetUserByIdInterface'; 2 | import { GetUserById } from '@application/use-cases/users/GetUserById'; 3 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 4 | 5 | export const makeGetUserById = (): GetUserByIdInterface => { 6 | const userRepository = new UserRepository(); 7 | 8 | return new GetUserById(userRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/get-workspaces-by-user-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { GetWorkspacesByUserIdInterface } from '@application/interfaces/use-cases/users/GetWorkspacesByUserIdInterface'; 2 | import { GetWorkspacesByUserId } from '@application/use-cases/users/GetWorkspacesByUserId'; 3 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 4 | 5 | export const makeGetWorkspacesByUserId = (): GetWorkspacesByUserIdInterface => { 6 | const userRepository = new UserRepository(); 7 | 8 | return new GetWorkspacesByUserId(userRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/remove-page-id-from-favorites-by-workspace-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { RemovePageIdFromFavoritesByWorkspaceIdInterface } from '@application/interfaces/use-cases/users/RemovePageIdFromFavoritesByWorkspaceIdInterface'; 2 | import { RemovePageIdFromFavoritesByWorkspaceId } from '@application/use-cases/users/RemovePageIdFromFavoritesByWorkspaceId'; 3 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 4 | 5 | export const makeRemovePageIdFromFavoritesByWorkspaceId = 6 | (): RemovePageIdFromFavoritesByWorkspaceIdInterface => { 7 | const userRepository = new UserRepository(); 8 | 9 | return new RemovePageIdFromFavoritesByWorkspaceId( 10 | userRepository, 11 | userRepository 12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/remove-workspace-by-user-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { RemoveWorkspaceByUserIdInterface } from '@application/interfaces/use-cases/users/RemoveWorkspaceByUserIdInterface'; 2 | import { RemoveWorkspaceByUserId } from '@application/use-cases/users/RemoveWorkspaceByUserId'; 3 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 4 | 5 | export const makeRemoveWorkspaceByUserId = 6 | (): RemoveWorkspaceByUserIdInterface => { 7 | const userRepository = new UserRepository(); 8 | 9 | return new RemoveWorkspaceByUserId(userRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/sign-in-factory.ts: -------------------------------------------------------------------------------- 1 | import { SignInInterface } from '@application/interfaces/use-cases/users/SignInInterface'; 2 | import { SignIn } from '@application/use-cases/users/SignIn'; 3 | import { BcryptAdapter } from '@infrastructure/cryptography/BcryptAdapter'; 4 | import { JWTAdapter } from '@infrastructure/cryptography/JWTAdapter'; 5 | import { TokenRepository } from '@infrastructure/db/mongodb/repositories/TokenRepository'; 6 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 7 | import env from '@main/config/env'; 8 | 9 | export const makeSignIn = (): SignInInterface => { 10 | const userRepository = new UserRepository(); 11 | const tokenRepository = new TokenRepository(); 12 | const bcryptAdapter = new BcryptAdapter(+env.bcryptSalt); 13 | const jwtAdapter = new JWTAdapter( 14 | env.accessTokenSecret, 15 | env.refreshTokenSecret 16 | ); 17 | 18 | return new SignIn(userRepository, tokenRepository, bcryptAdapter, jwtAdapter); 19 | }; 20 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/sign-out-factory.ts: -------------------------------------------------------------------------------- 1 | import { SignOutInterface } from '@application/interfaces/use-cases/users/SignOutInterface'; 2 | import { SignOut } from '@application/use-cases/users/SignOut'; 3 | import { TokenRepository } from '@infrastructure/db/mongodb/repositories/TokenRepository'; 4 | 5 | export const makeSignOut = (): SignOutInterface => { 6 | const tokenRepository = new TokenRepository(); 7 | 8 | return new SignOut(tokenRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/sign-up-factory.ts: -------------------------------------------------------------------------------- 1 | import { SignUpInterface } from '@application/interfaces/use-cases/users/SignUpInterface'; 2 | import { SignUp } from '@application/use-cases/users/SignUp'; 3 | import { BcryptAdapter } from '@infrastructure/cryptography/BcryptAdapter'; 4 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 5 | import env from '@main/config/env'; 6 | 7 | export const makeSignUp = (): SignUpInterface => { 8 | const userRepository = new UserRepository(); 9 | const bcryptAdapter = new BcryptAdapter(+env.bcryptSalt); 10 | 11 | return new SignUp(userRepository, userRepository, bcryptAdapter); 12 | }; 13 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/update-user-factory.ts: -------------------------------------------------------------------------------- 1 | import { UpdateUserInterface } from '@application/interfaces/use-cases/users/UpdateUserInterface'; 2 | import { UpdateUser } from '@application/use-cases/users/UpdateUser'; 3 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 4 | 5 | export const makeUpdateUser = (): UpdateUserInterface => { 6 | const userRepository = new UserRepository(); 7 | 8 | return new UpdateUser(userRepository, userRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/update-user-profile-picture-factory.ts: -------------------------------------------------------------------------------- 1 | import { UpdateUserProfilePictureInterface } from '@application/interfaces/use-cases/users/UpdateUserProfilePictureInterface'; 2 | import { UpdateUserProfilePicture } from '@application/use-cases/users/UpdateUserProfilePicture'; 3 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 4 | 5 | export const makeUpdateUserProfilePicture = 6 | (): UpdateUserProfilePictureInterface => { 7 | const userRepository = new UserRepository(); 8 | 9 | return new UpdateUserProfilePicture(userRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/users/update-user-workspace-meta-data-by-workspace-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { UpdateUserWorkspaceMetaDataByWorkspaceIdInterface } from '@application/interfaces/use-cases/users/UpdateUserWorkspaceMetaDataByWorkspaceIdInterface'; 2 | import { UpdateUserWorkspaceMetaDataByWorkspaceId } from '@application/use-cases/users/UpdateUserWorkspaceMetaDataByWorkspaceId'; 3 | import { UserRepository } from '@infrastructure/db/mongodb/repositories/UserRepository'; 4 | 5 | export const makeUpdateUserWorkspaceMetaDataByWorkspaceId = 6 | (): UpdateUserWorkspaceMetaDataByWorkspaceIdInterface => { 7 | const userRepository = new UserRepository(); 8 | 9 | return new UpdateUserWorkspaceMetaDataByWorkspaceId( 10 | userRepository, 11 | userRepository 12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/add-member-by-workspace-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { AddMemberByWorkspaceIdInterface } from '@application/interfaces/use-cases/workspaces/AddMemberByWorkspaceIdInterface'; 2 | import { AddMemberByWorkspaceId } from '@application/use-cases/workspaces/AddMemberByWorkspaceId'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeAddMemberByWorkspaceId = 6 | (): AddMemberByWorkspaceIdInterface => { 7 | const workspaceRepository = new WorkspaceRepository(); 8 | 9 | return new AddMemberByWorkspaceId(workspaceRepository, workspaceRepository); 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/add-page-factory.ts: -------------------------------------------------------------------------------- 1 | import { AddPageInterface } from '@application/interfaces/use-cases/workspaces/AddPageInterface'; 2 | import { AddPage } from '@application/use-cases/workspaces/AddPage'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeAddPage = (): AddPageInterface => { 6 | const workspaceRepository = new WorkspaceRepository(); 7 | 8 | return new AddPage(workspaceRepository, workspaceRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/create-workspace-factory.ts: -------------------------------------------------------------------------------- 1 | import { CreateWorkspaceInterface } from '@application/interfaces/use-cases/workspaces/CreateWorkspaceInterface'; 2 | import { CreateWorkspace } from '@application/use-cases/workspaces/CreateWorkspace'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeCreateWorkspace = (): CreateWorkspaceInterface => { 6 | const workspaceRepository = new WorkspaceRepository(); 7 | 8 | return new CreateWorkspace(workspaceRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/delete-workspace-factory.ts: -------------------------------------------------------------------------------- 1 | import { DeleteWorkspaceInterface } from '@application/interfaces/use-cases/workspaces/DeleteWorkspaceInterface'; 2 | import { DeleteWorkspace } from '@application/use-cases/workspaces/DeleteWorkspace'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeDeleteWorkspace = (): DeleteWorkspaceInterface => { 6 | const workspaceRepository = new WorkspaceRepository(); 7 | 8 | return new DeleteWorkspace(workspaceRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/get-all-members-by-workspace-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { GetAllMembersByWorkspaceIdInterface } from '@application/interfaces/use-cases/workspaces/GetAllMembersByWorkspaceIdInterface'; 2 | import { GetAllMembersByWorkspaceId } from '@application/use-cases/workspaces/GetAllMembersByWorkspaceId'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeGetAllMembersByWorkspaceId = 6 | (): GetAllMembersByWorkspaceIdInterface => { 7 | const workspaceRepository = new WorkspaceRepository(); 8 | 9 | return new GetAllMembersByWorkspaceId( 10 | workspaceRepository, 11 | workspaceRepository 12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/get-all-root-pages-factory.ts: -------------------------------------------------------------------------------- 1 | import { GetAllRootPagesInterface } from '@application/interfaces/use-cases/workspaces/GetAllRootPagesInterface'; 2 | import { GetAllRootPages } from '@application/use-cases/workspaces/GetAllRootPages'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeGetAllRootPages = (): GetAllRootPagesInterface => { 6 | const workspaceRepository = new WorkspaceRepository(); 7 | 8 | return new GetAllRootPages(workspaceRepository, workspaceRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/get-childrens-by-page-reference-factory.ts: -------------------------------------------------------------------------------- 1 | import { GetChildrensByPageReferenceInterface } from '@application/interfaces/use-cases/workspaces/GetChildrensByPageReferenceInterface'; 2 | import { GetChildrensByPageReference } from '@application/use-cases/workspaces/GetChildrensByPageReference'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeGetChildrensByPageReference = 6 | (): GetChildrensByPageReferenceInterface => { 7 | const workspaceRepository = new WorkspaceRepository(); 8 | 9 | return new GetChildrensByPageReference( 10 | workspaceRepository, 11 | workspaceRepository 12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/get-workspace-by-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { GetWorkspaceByIdInterface } from '@application/interfaces/use-cases/workspaces/GetWorkspaceByIdInterface'; 2 | import { GetWorkspaceById } from '@application/use-cases/workspaces/GetWorkspaceById'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeGetWorkspaceById = (): GetWorkspaceByIdInterface => { 6 | const workspaceRepository = new WorkspaceRepository(); 7 | 8 | return new GetWorkspaceById(workspaceRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/remove-member-by-workspace-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { RemoveMemberByWorkspaceIdInterface } from '@application/interfaces/use-cases/workspaces/RemoveMemberByWorkspaceIdInterface'; 2 | import { RemoveMemberByWorkspaceId } from '@application/use-cases/workspaces/RemoveMemberByWorkspaceId'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeRemoveMemberByWorkspaceId = 6 | (): RemoveMemberByWorkspaceIdInterface => { 7 | const workspaceRepository = new WorkspaceRepository(); 8 | 9 | return new RemoveMemberByWorkspaceId( 10 | workspaceRepository, 11 | workspaceRepository 12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/remove-page-by-page-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { RemovePageByPageIdInterface } from '@application/interfaces/use-cases/workspaces/RemovePageByPageIdInterface'; 2 | import { RemovePageByPageId } from '@application/use-cases/workspaces/RemovePageByPageId'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeRemovePageByPageId = (): RemovePageByPageIdInterface => { 6 | const workspaceRepository = new WorkspaceRepository(); 7 | 8 | return new RemovePageByPageId(workspaceRepository, workspaceRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/update-workspace-factory.ts: -------------------------------------------------------------------------------- 1 | import { UpdateWorkspaceInterface } from '@application/interfaces/use-cases/workspaces/UpdateWorkspaceInterface'; 2 | import { UpdateWorkspace } from '@application/use-cases/workspaces/UpdateWorkspace'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeUpdateWorkspace = (): UpdateWorkspaceInterface => { 6 | const workspaceRepository = new WorkspaceRepository(); 7 | 8 | return new UpdateWorkspace(workspaceRepository, workspaceRepository); 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/factories/use-cases/workspaces/update-workspace-pages-meta-data-by-page-id-factory.ts: -------------------------------------------------------------------------------- 1 | import { UpdateWorkspacePagesMetaDataByPageIdInterface } from '@application/interfaces/use-cases/workspaces/UpdateWorkspacePagesMetaDataByPageIdInterface'; 2 | import { UpdateWorkspacePagesMetaDataByPageId } from '@application/use-cases/workspaces/UpdateWorkspacePagesMetaDataByPageId'; 3 | import { WorkspaceRepository } from '@infrastructure/db/mongodb/repositories/WorkspaceRepository'; 4 | 5 | export const makeUpdateWorkspacePagesMetaDataByWorkspaceId = 6 | (): UpdateWorkspacePagesMetaDataByPageIdInterface => { 7 | const workspaceRepository = new WorkspaceRepository(); 8 | 9 | return new UpdateWorkspacePagesMetaDataByPageId( 10 | workspaceRepository, 11 | workspaceRepository 12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /src/main/middlewares/auth-middleware.ts: -------------------------------------------------------------------------------- 1 | import { expressMiddlewareAdapter } from '@main/adapters/express-middleware-adapter'; 2 | import { makeAuthMiddleware } from '@main/factories/middlewares/auth-middleware-factory'; 3 | 4 | export const authMiddleware = expressMiddlewareAdapter(makeAuthMiddleware()); 5 | -------------------------------------------------------------------------------- /src/main/middlewares/authorization-middleware.ts: -------------------------------------------------------------------------------- 1 | import { expressMiddlewareAdapter } from '@main/adapters/express-middleware-adapter'; 2 | import { makeAuthorizationMiddleware } from '@main/factories/middlewares/authorization-middleware-factory'; 3 | 4 | export const authorizationMiddleware = expressMiddlewareAdapter( 5 | makeAuthorizationMiddleware() 6 | ); 7 | -------------------------------------------------------------------------------- /src/main/middlewares/body-parser.ts: -------------------------------------------------------------------------------- 1 | import { json } from 'express'; 2 | 3 | export const bodyParser = json(); 4 | -------------------------------------------------------------------------------- /src/main/middlewares/content-type.ts: -------------------------------------------------------------------------------- 1 | import { NextFunction, Request, Response } from 'express'; 2 | 3 | export const contentType = ( 4 | req: Request, 5 | res: Response, 6 | next: NextFunction 7 | ): void => { 8 | if (!res.type) { 9 | res.type('json'); 10 | } 11 | next(); 12 | }; 13 | -------------------------------------------------------------------------------- /src/main/middlewares/cors.ts: -------------------------------------------------------------------------------- 1 | import { NextFunction, Request, Response } from 'express'; 2 | 3 | export const cors = 4 | (options: { origin: string; credentials: boolean }) => 5 | (req: Request, res: Response, next: NextFunction): void => { 6 | // res.set('Access-Control-Allow-Headers', '*'); 7 | res.set('Access-Control-Allow-Headers', 'Authorization, Content-Type'); 8 | res.set( 9 | 'Access-Control-Allow-Methods', 10 | 'PUT, POST, GET, DELETE, PATCH, OPTIONS' 11 | ); 12 | res.set('Access-Control-Allow-Origin', options.origin); 13 | res.set('Access-Control-Allow-Credentials', options.credentials.toString()); 14 | next(); 15 | }; 16 | -------------------------------------------------------------------------------- /src/main/schemas/add-page-schema.ts: -------------------------------------------------------------------------------- 1 | export const addPageSchema = { 2 | type: 'object', 3 | properties: { 4 | id: { 5 | type: 'string', 6 | }, 7 | reference: { 8 | type: 'string', 9 | }, 10 | icon: { 11 | type: 'string', 12 | }, 13 | path: { 14 | type: ['string', 'null'], 15 | }, 16 | }, 17 | required: ['id', 'reference', 'icon', 'path'], 18 | }; 19 | -------------------------------------------------------------------------------- /src/main/schemas/create-workspace-schema.ts: -------------------------------------------------------------------------------- 1 | export const createWorkspaceSchema = { 2 | type: 'object', 3 | properties: { 4 | name: { 5 | type: 'string', 6 | }, 7 | icon: { 8 | type: 'string', 9 | }, 10 | }, 11 | required: ['name', 'icon'], 12 | }; 13 | -------------------------------------------------------------------------------- /src/main/schemas/sign-in-schema.ts: -------------------------------------------------------------------------------- 1 | export const signInSchema = { 2 | type: 'object', 3 | properties: { 4 | email: { 5 | type: 'string', 6 | format: 'email', 7 | }, 8 | password: { 9 | type: 'string', 10 | minLength: 6, 11 | maxLength: 20, 12 | }, 13 | }, 14 | required: ['email', 'password'], 15 | }; 16 | -------------------------------------------------------------------------------- /src/main/schemas/sign-up-schema.ts: -------------------------------------------------------------------------------- 1 | export const signUpSchema = { 2 | type: 'object', 3 | properties: { 4 | name: { 5 | type: 'string', 6 | }, 7 | email: { 8 | type: 'string', 9 | format: 'email', 10 | }, 11 | password: { 12 | type: 'string', 13 | minLength: 6, 14 | maxLength: 20, 15 | }, 16 | isDarkMode: { 17 | type: 'boolean', 18 | }, 19 | profilePicture: { 20 | type: 'object', 21 | properties: { 22 | url: { 23 | type: 'string', 24 | }, 25 | }, 26 | required: ['url'], 27 | }, 28 | }, 29 | required: ['name', 'email', 'password', 'isDarkMode', 'profilePicture'], 30 | }; 31 | -------------------------------------------------------------------------------- /src/main/schemas/update-page-content-schema.ts: -------------------------------------------------------------------------------- 1 | export const updatePageContentSchema = { 2 | type: 'object', 3 | properties: { 4 | content: { 5 | type: 'object', 6 | properties: { 7 | type: { 8 | type: 'string', 9 | }, 10 | content: { 11 | type: 'array', 12 | }, 13 | }, 14 | required: ['type', 'content'], 15 | }, 16 | }, 17 | required: ['content'], 18 | }; 19 | -------------------------------------------------------------------------------- /src/main/schemas/update-page-cover-schema.ts: -------------------------------------------------------------------------------- 1 | export const updatePageCoverSchema = { 2 | type: 'object', 3 | properties: { 4 | url: { 5 | type: 'string', 6 | }, 7 | }, 8 | required: ['url'], 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/schemas/update-page-icon-schema.ts: -------------------------------------------------------------------------------- 1 | export const updatePageIconSchema = { 2 | type: 'object', 3 | properties: { 4 | icon: { 5 | type: 'string', 6 | }, 7 | }, 8 | required: ['icon'], 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/schemas/update-page-settings-schema.ts: -------------------------------------------------------------------------------- 1 | export const updatePageSettingsSchema = { 2 | type: 'object', 3 | properties: { 4 | settings: { 5 | type: 'object', 6 | properties: { 7 | font: { 8 | type: 'string', 9 | }, 10 | smallText: { 11 | type: 'boolean', 12 | }, 13 | fullWidth: { 14 | type: 'boolean', 15 | }, 16 | lock: { 17 | type: 'boolean', 18 | }, 19 | }, 20 | required: ['font', 'smallText', 'fullWidth', 'lock'], 21 | }, 22 | }, 23 | required: ['settings'], 24 | }; 25 | -------------------------------------------------------------------------------- /src/main/schemas/update-page-title-schema.ts: -------------------------------------------------------------------------------- 1 | export const updatePageTitleSchema = { 2 | type: 'object', 3 | properties: { 4 | title: { 5 | type: 'string', 6 | }, 7 | }, 8 | required: ['title'], 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/schemas/update-user-profile-picture-schema.ts: -------------------------------------------------------------------------------- 1 | export const updateUserProfilePictureSchema = { 2 | type: 'object', 3 | properties: { 4 | url: { 5 | type: 'string', 6 | }, 7 | }, 8 | required: ['url'], 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/schemas/update-user-schema.ts: -------------------------------------------------------------------------------- 1 | export const updateUserSchema = { 2 | type: 'object', 3 | properties: { 4 | name: { 5 | type: 'string', 6 | }, 7 | email: { 8 | type: 'string', 9 | format: 'email', 10 | }, 11 | password: { 12 | type: 'string', 13 | minLength: 6, 14 | maxLength: 20, 15 | }, 16 | isDarkMode: { 17 | type: 'boolean', 18 | }, 19 | }, 20 | required: [], 21 | }; 22 | -------------------------------------------------------------------------------- /src/main/schemas/update-workspace-schema.ts: -------------------------------------------------------------------------------- 1 | export const updateWorkspaceSchema = { 2 | type: 'object', 3 | properties: { 4 | name: { 5 | type: 'string', 6 | }, 7 | icon: { 8 | type: 'string', 9 | }, 10 | }, 11 | required: [], 12 | }; 13 | -------------------------------------------------------------------------------- /src/main/server.ts: -------------------------------------------------------------------------------- 1 | import 'module-alias/register'; 2 | import dbConnection from '@infrastructure/db/mongodb/helpers/db-connection'; 3 | import env from '@main/config/env'; 4 | import setupApp from '@main/config/app'; 5 | 6 | dbConnection 7 | .connect(env.mongoUrl) 8 | .then(async () => { 9 | const app = setupApp(); 10 | app.listen(env.port, () => { 11 | // eslint-disable-next-line no-console 12 | console.log(`server is listining on port ${env.port}`); 13 | }); 14 | }) 15 | // eslint-disable-next-line no-console 16 | .catch(console.error); 17 | -------------------------------------------------------------------------------- /tests/application/use-cases/pages/DeletePage.spec.ts: -------------------------------------------------------------------------------- 1 | import { DeletePage } from '@application/use-cases/pages/DeletePage'; 2 | import mockPage from '@tests/domain/mock-page'; 3 | import { DeletePageRepositoryStub } from '@tests/infrastructure/mocks/pages/repositories'; 4 | 5 | type SutTypes = { 6 | sut: DeletePage; 7 | deletePageRepositoryStub: DeletePageRepositoryStub; 8 | }; 9 | 10 | const makeSut = (): SutTypes => { 11 | const deletePageRepositoryStub = new DeletePageRepositoryStub(); 12 | const sut = new DeletePage(deletePageRepositoryStub); 13 | return { 14 | sut, 15 | deletePageRepositoryStub, 16 | }; 17 | }; 18 | 19 | describe('DeletePage', () => { 20 | it('should call DeletePageRepository with correct user id', async () => { 21 | const { sut, deletePageRepositoryStub } = makeSut(); 22 | const deletePageRepositorySpy = jest.spyOn( 23 | deletePageRepositoryStub, 24 | 'deletePage' 25 | ); 26 | const { id } = mockPage(); 27 | await sut.execute(id); 28 | expect(deletePageRepositorySpy).toHaveBeenCalledWith(id); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /tests/application/use-cases/users/DeleteUser.spec.ts: -------------------------------------------------------------------------------- 1 | import { DeleteUser } from '@application/use-cases/users/DeleteUser'; 2 | import mockUser from '@tests/domain/mock-user'; 3 | import { DeleteUserRepositoryStub } from '@tests/infrastructure/mocks/users/repositories'; 4 | 5 | type SutTypes = { 6 | sut: DeleteUser; 7 | deleteUserRepositoryStub: DeleteUserRepositoryStub; 8 | }; 9 | 10 | const makeSut = (): SutTypes => { 11 | const deleteUserRepositoryStub = new DeleteUserRepositoryStub(); 12 | const sut = new DeleteUser(deleteUserRepositoryStub); 13 | return { 14 | sut, 15 | deleteUserRepositoryStub, 16 | }; 17 | }; 18 | 19 | describe('DeleteUser', () => { 20 | it('should call DeleteUserRepository with correct user id', async () => { 21 | const { sut, deleteUserRepositoryStub } = makeSut(); 22 | const deleteUserSpy = jest.spyOn(deleteUserRepositoryStub, 'deleteUser'); 23 | const { id } = mockUser(); 24 | await sut.execute(id); 25 | expect(deleteUserSpy).toHaveBeenCalledWith(id); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /tests/application/use-cases/users/SignOut.spec.ts: -------------------------------------------------------------------------------- 1 | import { SignOut } from '@application/use-cases/users/SignOut'; 2 | import { DeleteTokenRepositoryStub } from '@tests/infrastructure/mocks/tokens/repositories'; 3 | 4 | type SutTypes = { 5 | sut: SignOut; 6 | deleteTokenRepositoryStub: DeleteTokenRepositoryStub; 7 | }; 8 | 9 | const makeSut = (): SutTypes => { 10 | const deleteTokenRepositoryStub = new DeleteTokenRepositoryStub(); 11 | const sut = new SignOut(deleteTokenRepositoryStub); 12 | 13 | return { 14 | sut, 15 | deleteTokenRepositoryStub, 16 | }; 17 | }; 18 | 19 | describe('SignOut', () => { 20 | it('should call deleteTokenRepository with correct data', async () => { 21 | const { sut, deleteTokenRepositoryStub } = makeSut(); 22 | const deleteTokenRepositorySpy = jest.spyOn( 23 | deleteTokenRepositoryStub, 24 | 'deleteToken' 25 | ); 26 | 27 | const sampleToken = 'sample-refresh-token'; 28 | await sut.execute(sampleToken); 29 | 30 | expect(deleteTokenRepositorySpy).toHaveBeenCalledWith(sampleToken); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /tests/application/use-cases/workspaces/DeleteWorkspace.spec.ts: -------------------------------------------------------------------------------- 1 | import { DeleteWorkspace } from '@application/use-cases/workspaces/DeleteWorkspace'; 2 | import mockWorkspace from '@tests/domain/mock-workspace'; 3 | import { DeleteWorkspaceRepositoryStub } from '@tests/infrastructure/mocks/workspaces/repositories'; 4 | 5 | type SutTypes = { 6 | sut: DeleteWorkspace; 7 | deleteWorkspaceRepositoryStub: DeleteWorkspaceRepositoryStub; 8 | }; 9 | 10 | const makeSut = (): SutTypes => { 11 | const deleteWorkspaceRepositoryStub = new DeleteWorkspaceRepositoryStub(); 12 | const sut = new DeleteWorkspace(deleteWorkspaceRepositoryStub); 13 | return { 14 | sut, 15 | deleteWorkspaceRepositoryStub, 16 | }; 17 | }; 18 | 19 | describe('DeleteWorkspace', () => { 20 | it('should call DeleteWorkspaceRepository with correct user id', async () => { 21 | const { sut, deleteWorkspaceRepositoryStub } = makeSut(); 22 | const deleteWorkspaceRepositorySpy = jest.spyOn( 23 | deleteWorkspaceRepositoryStub, 24 | 'deleteWorkspace' 25 | ); 26 | const { id } = mockWorkspace(); 27 | await sut.execute(id); 28 | expect(deleteWorkspaceRepositorySpy).toHaveBeenCalledWith(id); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /tests/domain/mock-user.ts: -------------------------------------------------------------------------------- 1 | import { User } from '@domain/entities/User'; 2 | 3 | const mockUser = (): User => { 4 | return new User({ 5 | id: '112233445566778899aabbcc', 6 | name: 'sample-name', 7 | email: 'sample@email.com', 8 | password: 'sample-password', 9 | isDarkMode: true, 10 | profilePicture: { 11 | url: 'sample-url', 12 | }, 13 | workspaces: [ 14 | { 15 | workspaceId: '112233445566778899bbccaa', 16 | workspaceName: 'sample-name', 17 | workspaceIcon: '1f30e', 18 | favorites: ['sample-page-1'], 19 | }, 20 | ], 21 | createdAt: new Date(), 22 | updatedAt: new Date(), 23 | }); 24 | }; 25 | 26 | export default mockUser; 27 | -------------------------------------------------------------------------------- /tests/infrastructure/db/mongodb/helpers/db-connection.spec.ts: -------------------------------------------------------------------------------- 1 | import dbConnection from '@infrastructure/db/mongodb/helpers/db-connection'; 2 | import env from '@main/config/env'; 3 | 4 | describe('DbConnection', () => { 5 | beforeAll(async () => { 6 | await dbConnection.connect(env.mongoUrl); 7 | }); 8 | 9 | afterAll(async () => { 10 | await dbConnection.disconnect(); 11 | }); 12 | 13 | it('should reconnect if mongodb is down', async () => { 14 | let collection = await dbConnection.getCollection('notion'); 15 | expect(collection).toBeTruthy(); 16 | await dbConnection.disconnect(); 17 | collection = await dbConnection.getCollection('notion'); 18 | expect(collection).toBeTruthy(); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /tests/infrastructure/mocks/controllers.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-unused-vars */ 2 | import { BaseController } from '@infrastructure/http/controllers/BaseController'; 3 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 4 | import { HttpResponse } from '@infrastructure/http/interfaces/HttpResponse'; 5 | import { ok } from '@infrastructure/http/helpers/http'; 6 | 7 | export class ControllerStub extends BaseController { 8 | async execute(_httpRequest: HttpRequest): Promise { 9 | return ok('any_body'); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tests/infrastructure/mocks/middlewares.ts: -------------------------------------------------------------------------------- 1 | import { ok } from '@infrastructure/http/helpers/http'; 2 | import { HttpRequest } from '@infrastructure/http/interfaces/HttpRequest'; 3 | import { HttpResponse } from '@infrastructure/http/interfaces/HttpResponse'; 4 | import { BaseMiddleware } from '@infrastructure/http/middlewares/BaseMiddleware'; 5 | 6 | export class MiddlewareStub extends BaseMiddleware { 7 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 8 | async execute(_httpRequest: HttpRequest): Promise { 9 | return ok('any_body'); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tests/infrastructure/mocks/tokens/repositories.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-empty-function */ 2 | /* eslint-disable max-classes-per-file */ 3 | /* eslint-disable @typescript-eslint/no-unused-vars */ 4 | import { CreateTokenRepository } from '@application/interfaces/repositories/tokens/createTokenRepository'; 5 | import { DeleteTokenRepository } from '@application/interfaces/repositories/tokens/deleteTokenRepository'; 6 | import { GetTokenRepository } from '@application/interfaces/repositories/tokens/getTokenRepository'; 7 | 8 | export class CreateTokenRepositoryStub implements CreateTokenRepository { 9 | async createToken( 10 | _token: CreateTokenRepository.Request 11 | ): Promise { 12 | return 'sample-id'; 13 | } 14 | } 15 | 16 | export class GetTokenRepositoryStub implements GetTokenRepository { 17 | async getToken( 18 | _token: GetTokenRepository.Request 19 | ): Promise { 20 | return { 21 | _id: 'sample-id', 22 | token: 'sample-token', 23 | createdAt: new Date(), 24 | }; 25 | } 26 | } 27 | 28 | export class DeleteTokenRepositoryStub implements DeleteTokenRepository { 29 | async deleteToken( 30 | _token: DeleteTokenRepository.Request 31 | ): Promise {} 32 | } 33 | -------------------------------------------------------------------------------- /tests/infrastructure/mocks/validators.ts: -------------------------------------------------------------------------------- 1 | import { Validation } from '@infrastructure/http/interfaces/Validation'; 2 | 3 | export class ValidationStub implements Validation { 4 | // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars 5 | validate(_input: any): Error | null { 6 | return null; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /tsconfig-build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["tests"] 4 | } --------------------------------------------------------------------------------