@stone-js/starters 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +101 -0
- package/basic-react-declarative/LICENSE +21 -0
- package/basic-react-declarative/README.md +39 -0
- package/basic-react-declarative/app/Application.tsx +89 -0
- package/basic-react-declarative/assets/css/index.css +26 -0
- package/basic-react-declarative/package.json +39 -0
- package/basic-react-declarative/public/logo.png +0 -0
- package/basic-react-declarative/tests/Application.spec.ts +96 -0
- package/basic-react-declarative/tests/__snapshots__/Application.spec.ts.snap +3 -0
- package/basic-react-declarative/tsconfig.json +33 -0
- package/basic-react-declarative/vitest.config.ts +24 -0
- package/basic-react-imperative/LICENSE +21 -0
- package/basic-react-imperative/README.md +39 -0
- package/basic-react-imperative/app/Application.tsx +89 -0
- package/basic-react-imperative/assets/css/index.css +26 -0
- package/basic-react-imperative/package.json +39 -0
- package/basic-react-imperative/public/logo.png +0 -0
- package/basic-react-imperative/tests/Application.spec.ts +80 -0
- package/basic-react-imperative/tests/__snapshots__/Application.spec.ts.snap +3 -0
- package/basic-react-imperative/tsconfig.json +33 -0
- package/basic-react-imperative/vitest.config.ts +24 -0
- package/basic-service-declarative/LICENSE +21 -0
- package/basic-service-declarative/README.md +39 -0
- package/basic-service-declarative/app/Application.ts +56 -0
- package/basic-service-declarative/package.json +34 -0
- package/basic-service-declarative/tests/Application.spec.ts +60 -0
- package/basic-service-declarative/tsconfig.json +25 -0
- package/basic-service-declarative/vitest.config.ts +24 -0
- package/basic-service-imperative/LICENSE +21 -0
- package/basic-service-imperative/README.md +39 -0
- package/basic-service-imperative/app/Application.ts +60 -0
- package/basic-service-imperative/package.json +34 -0
- package/basic-service-imperative/tests/Application.spec.ts +52 -0
- package/basic-service-imperative/tsconfig.json +25 -0
- package/basic-service-imperative/vitest.config.ts +24 -0
- package/continuum-showcase/README.md +44 -0
- package/continuum-showcase/app/env.d.ts +34 -0
- package/continuum-showcase/app/layouts/MainLayout.tsx +20 -0
- package/continuum-showcase/app/pages/BlogPostPage.tsx +62 -0
- package/continuum-showcase/app/pages/HomePage.tsx +58 -0
- package/continuum-showcase/package.json +25 -0
- package/continuum-showcase/stone.config.mjs +20 -0
- package/full-react-declarative/.env.example +1 -0
- package/full-react-declarative/.env.public.example +1 -0
- package/full-react-declarative/LICENSE +21 -0
- package/full-react-declarative/README.md +39 -0
- package/full-react-declarative/app/Application.ts +85 -0
- package/full-react-declarative/app/clients/AxiosClient.ts +136 -0
- package/full-react-declarative/app/clients/CommentClient.ts +61 -0
- package/full-react-declarative/app/clients/PostClient.ts +90 -0
- package/full-react-declarative/app/clients/SecurityClient.ts +66 -0
- package/full-react-declarative/app/clients/UserClient.ts +97 -0
- package/full-react-declarative/app/components/ChangePasswordForm/ChangePasswordForm.tsx +50 -0
- package/full-react-declarative/app/components/CommentForm/CommentForm.tsx +37 -0
- package/full-react-declarative/app/components/CommentItem/CommentItem.tsx +42 -0
- package/full-react-declarative/app/components/CommentWidget/CommentWidget.tsx +95 -0
- package/full-react-declarative/app/components/LoginForm/LoginForm.css +0 -0
- package/full-react-declarative/app/components/LoginForm/LoginForm.tsx +71 -0
- package/full-react-declarative/app/components/PostDetails/PostDetails.tsx +44 -0
- package/full-react-declarative/app/components/PostForm/PostForm.css +0 -0
- package/full-react-declarative/app/components/PostForm/PostForm.tsx +47 -0
- package/full-react-declarative/app/components/PostItem/PostItem.css +0 -0
- package/full-react-declarative/app/components/PostItem/PostItem.tsx +34 -0
- package/full-react-declarative/app/components/RegisterForm/RegisterForm.tsx +110 -0
- package/full-react-declarative/app/components/UserForm/UserForm.tsx +47 -0
- package/full-react-declarative/app/configurations/AppConfiguration.ts +17 -0
- package/full-react-declarative/app/error-pages/DefaultErrorPage/DefaultErrorPage.css +0 -0
- package/full-react-declarative/app/error-pages/DefaultErrorPage/DefaultErrorPage.tsx +52 -0
- package/full-react-declarative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.css +0 -0
- package/full-react-declarative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.tsx +53 -0
- package/full-react-declarative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.css +0 -0
- package/full-react-declarative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.tsx +54 -0
- package/full-react-declarative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.css +0 -0
- package/full-react-declarative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.tsx +53 -0
- package/full-react-declarative/app/errors/ForbiddenError.ts +11 -0
- package/full-react-declarative/app/errors/PostNotFoundError.ts +11 -0
- package/full-react-declarative/app/errors/UnauthorizedError.ts +11 -0
- package/full-react-declarative/app/errors/UserNotFoundError.ts +11 -0
- package/full-react-declarative/app/events/UserEvent.ts +18 -0
- package/full-react-declarative/app/layout/AppLayout/AppLayout.css +20 -0
- package/full-react-declarative/app/layout/AppLayout/AppLayout.tsx +101 -0
- package/full-react-declarative/app/layout/ErrorLayout/ErrorLayout.css +0 -0
- package/full-react-declarative/app/layout/ErrorLayout/ErrorLayout.tsx +41 -0
- package/full-react-declarative/app/layout/SecurityLayout/SecurityLayout.css +0 -0
- package/full-react-declarative/app/layout/SecurityLayout/SecurityLayout.tsx +39 -0
- package/full-react-declarative/app/middleware/AuthMiddleware.ts +85 -0
- package/full-react-declarative/app/models/Comment.ts +31 -0
- package/full-react-declarative/app/models/Post.ts +22 -0
- package/full-react-declarative/app/models/User.ts +62 -0
- package/full-react-declarative/app/pages/home/HomePage.tsx +44 -0
- package/full-react-declarative/app/pages/login/LoginPage.css +0 -0
- package/full-react-declarative/app/pages/login/LoginPage.tsx +73 -0
- package/full-react-declarative/app/pages/posts/CreatePostPage/CreatePostPage.css +0 -0
- package/full-react-declarative/app/pages/posts/CreatePostPage/CreatePostPage.tsx +67 -0
- package/full-react-declarative/app/pages/posts/PostPage/PostPage.tsx +60 -0
- package/full-react-declarative/app/pages/posts/ShowPostPage/ShowPostPage.tsx +83 -0
- package/full-react-declarative/app/pages/posts/UpdatePostPage/UpdatePostPage.tsx +77 -0
- package/full-react-declarative/app/pages/register/RegisterPage.tsx +68 -0
- package/full-react-declarative/app/pages/users/CreateUserPage.tsx +48 -0
- package/full-react-declarative/app/pages/users/ShowUserPage.tsx +62 -0
- package/full-react-declarative/app/pages/users/UpdateUserPage.tsx +57 -0
- package/full-react-declarative/app/pages/users/UserPage.tsx +57 -0
- package/full-react-declarative/app/providers/AppServiceProvider.ts +43 -0
- package/full-react-declarative/app/services/CommentService.ts +59 -0
- package/full-react-declarative/app/services/PostService.ts +108 -0
- package/full-react-declarative/app/services/SecurityService.ts +80 -0
- package/full-react-declarative/app/services/TokenService.ts +116 -0
- package/full-react-declarative/app/services/UserService.ts +126 -0
- package/full-react-declarative/app/utils.ts +17 -0
- package/full-react-declarative/assets/css/index.css +301 -0
- package/full-react-declarative/assets/img/logo.png +0 -0
- package/full-react-declarative/package.json +46 -0
- package/full-react-declarative/public/logo.png +0 -0
- package/full-react-declarative/public/vite.svg +1 -0
- package/full-react-declarative/stone.config.mjs +12 -0
- package/full-react-declarative/tsconfig.json +29 -0
- package/full-react-declarative/vitest.config.ts +24 -0
- package/full-react-imperative/.env.example +1 -0
- package/full-react-imperative/.env.public.example +1 -0
- package/full-react-imperative/LICENSE +21 -0
- package/full-react-imperative/README.md +39 -0
- package/full-react-imperative/app/Application.ts +79 -0
- package/full-react-imperative/app/clients/AxiosClient.ts +124 -0
- package/full-react-imperative/app/clients/CommentClient.ts +57 -0
- package/full-react-imperative/app/clients/PostClient.ts +86 -0
- package/full-react-imperative/app/clients/SecurityClient.ts +60 -0
- package/full-react-imperative/app/clients/UserClient.ts +93 -0
- package/full-react-imperative/app/clients/contracts/IAxiosClient.ts +97 -0
- package/full-react-imperative/app/clients/contracts/ICommentClient.ts +31 -0
- package/full-react-imperative/app/clients/contracts/IPostClient.ts +55 -0
- package/full-react-imperative/app/clients/contracts/ISecurityClient.ts +33 -0
- package/full-react-imperative/app/clients/contracts/IUserClient.ts +61 -0
- package/full-react-imperative/app/components/ChangePasswordForm/ChangePasswordForm.tsx +50 -0
- package/full-react-imperative/app/components/CommentForm/CommentForm.css +35 -0
- package/full-react-imperative/app/components/CommentForm/CommentForm.tsx +45 -0
- package/full-react-imperative/app/components/CommentItem/CommentItem.css +74 -0
- package/full-react-imperative/app/components/CommentItem/CommentItem.tsx +62 -0
- package/full-react-imperative/app/components/CommentWidget/CommentWidget.css +25 -0
- package/full-react-imperative/app/components/CommentWidget/CommentWidget.tsx +119 -0
- package/full-react-imperative/app/components/Dropdown/Dropdown.css +52 -0
- package/full-react-imperative/app/components/Dropdown/Dropdown.tsx +40 -0
- package/full-react-imperative/app/components/LayoutHeader/LayoutHeader.css +62 -0
- package/full-react-imperative/app/components/LayoutHeader/LayoutHeader.tsx +61 -0
- package/full-react-imperative/app/components/LayoutLeftMenu/LayoutLeftMenu.css +25 -0
- package/full-react-imperative/app/components/LayoutLeftMenu/LayoutLeftMenu.tsx +32 -0
- package/full-react-imperative/app/components/LoginForm/LoginForm.css +0 -0
- package/full-react-imperative/app/components/LoginForm/LoginForm.tsx +71 -0
- package/full-react-imperative/app/components/NotificationBadge/NotificationBadge.css +41 -0
- package/full-react-imperative/app/components/NotificationBadge/NotificationBadge.tsx +63 -0
- package/full-react-imperative/app/components/PostCard/PostCard.css +129 -0
- package/full-react-imperative/app/components/PostCard/PostCard.tsx +65 -0
- package/full-react-imperative/app/components/PostForm/PostForm.css +92 -0
- package/full-react-imperative/app/components/PostForm/PostForm.tsx +76 -0
- package/full-react-imperative/app/components/PostSkeleton/PostSkeleton.css +65 -0
- package/full-react-imperative/app/components/PostSkeleton/PostSkeleton.tsx +25 -0
- package/full-react-imperative/app/components/PostWidget/PostWidget.tsx +95 -0
- package/full-react-imperative/app/components/ProfileForm/ProfileForm.css +84 -0
- package/full-react-imperative/app/components/ProfileForm/ProfileForm.tsx +79 -0
- package/full-react-imperative/app/components/RegisterForm/RegisterForm.tsx +110 -0
- package/full-react-imperative/app/components/RightAsidePanel/RightAsidePanel.css +32 -0
- package/full-react-imperative/app/components/RightAsidePanel/RightAsidePanel.tsx +62 -0
- package/full-react-imperative/app/components/SettingsForm/SettingsForm.css +126 -0
- package/full-react-imperative/app/components/SettingsForm/SettingsForm.tsx +86 -0
- package/full-react-imperative/app/components/UserAvatar/UserAvatar.css +18 -0
- package/full-react-imperative/app/components/UserAvatar/UserAvatar.tsx +60 -0
- package/full-react-imperative/app/components/UserBadge/UserBadge.css +33 -0
- package/full-react-imperative/app/components/UserBadge/UserBadge.tsx +49 -0
- package/full-react-imperative/app/components/UserCard/UserCard.css +70 -0
- package/full-react-imperative/app/components/UserCard/UserCard.tsx +43 -0
- package/full-react-imperative/app/configurations/AppConfiguration.ts +19 -0
- package/full-react-imperative/app/error-pages/DefaultErrorPage/DefaultErrorPage.css +0 -0
- package/full-react-imperative/app/error-pages/DefaultErrorPage/DefaultErrorPage.tsx +41 -0
- package/full-react-imperative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.css +0 -0
- package/full-react-imperative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.tsx +42 -0
- package/full-react-imperative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.css +0 -0
- package/full-react-imperative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.tsx +49 -0
- package/full-react-imperative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.css +0 -0
- package/full-react-imperative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.tsx +42 -0
- package/full-react-imperative/app/errors/ForbiddenError.ts +11 -0
- package/full-react-imperative/app/errors/PostNotFoundError.ts +11 -0
- package/full-react-imperative/app/errors/UnauthorizedError.ts +11 -0
- package/full-react-imperative/app/errors/UserNotFoundError.ts +11 -0
- package/full-react-imperative/app/events/UserEvent.ts +18 -0
- package/full-react-imperative/app/layout/AppLayout/AppLayout.css +106 -0
- package/full-react-imperative/app/layout/AppLayout/AppLayout.tsx +48 -0
- package/full-react-imperative/app/layout/ErrorLayout/ErrorLayout.css +0 -0
- package/full-react-imperative/app/layout/ErrorLayout/ErrorLayout.tsx +45 -0
- package/full-react-imperative/app/layout/SecurityLayout/SecurityLayout.css +0 -0
- package/full-react-imperative/app/layout/SecurityLayout/SecurityLayout.tsx +43 -0
- package/full-react-imperative/app/layout/SettingsLayout/SettingsLayout.css +99 -0
- package/full-react-imperative/app/layout/SettingsLayout/SettingsLayout.tsx +44 -0
- package/full-react-imperative/app/middleware/AuthMiddleware.ts +56 -0
- package/full-react-imperative/app/models/Comment.ts +35 -0
- package/full-react-imperative/app/models/Post.ts +27 -0
- package/full-react-imperative/app/models/User.ts +68 -0
- package/full-react-imperative/app/pages/Settings/SettingsPage.tsx +23 -0
- package/full-react-imperative/app/pages/home/HomePage.tsx +58 -0
- package/full-react-imperative/app/pages/login/LoginPage.css +0 -0
- package/full-react-imperative/app/pages/login/LoginPage.tsx +65 -0
- package/full-react-imperative/app/pages/posts/ShowPostPage/ShowPostPage.tsx +64 -0
- package/full-react-imperative/app/pages/posts/UpdatePostPage/UpdatePostPage.tsx +56 -0
- package/full-react-imperative/app/pages/register/RegisterPage.tsx +71 -0
- package/full-react-imperative/app/pages/users/ShowUserPage/ShowUserPage.css +64 -0
- package/full-react-imperative/app/pages/users/ShowUserPage/ShowUserPage.tsx +104 -0
- package/full-react-imperative/app/pages/users/UpdateUserPage/UpdateUserPage.css +0 -0
- package/full-react-imperative/app/pages/users/UpdateUserPage/UpdateUserPage.tsx +43 -0
- package/full-react-imperative/app/pages/users/UserPage/UserPage.css +31 -0
- package/full-react-imperative/app/pages/users/UserPage/UserPage.tsx +59 -0
- package/full-react-imperative/app/pages/utils.ts +67 -0
- package/full-react-imperative/app/providers/AppServiceProvider.ts +40 -0
- package/full-react-imperative/app/services/CommentService.ts +53 -0
- package/full-react-imperative/app/services/PostService.ts +102 -0
- package/full-react-imperative/app/services/SecurityService.ts +72 -0
- package/full-react-imperative/app/services/TokenService.ts +108 -0
- package/full-react-imperative/app/services/UserService.ts +115 -0
- package/full-react-imperative/app/services/contracts/ICommentService.ts +30 -0
- package/full-react-imperative/app/services/contracts/IPostService.ts +65 -0
- package/full-react-imperative/app/services/contracts/ISecurityService.ts +39 -0
- package/full-react-imperative/app/services/contracts/ITokenService.ts +44 -0
- package/full-react-imperative/app/services/contracts/IUserService.ts +70 -0
- package/full-react-imperative/app/utils.ts +31 -0
- package/full-react-imperative/assets/css/index.css +301 -0
- package/full-react-imperative/assets/img/logo.png +0 -0
- package/full-react-imperative/package.json +48 -0
- package/full-react-imperative/public/logo.png +0 -0
- package/full-react-imperative/public/vite.svg +1 -0
- package/full-react-imperative/stone.config.mjs +12 -0
- package/full-react-imperative/tsconfig.json +29 -0
- package/full-react-imperative/vitest.config.ts +24 -0
- package/full-service-declarative/.env.example +2 -0
- package/full-service-declarative/LICENSE +21 -0
- package/full-service-declarative/README.md +65 -0
- package/full-service-declarative/app/Application.ts +327 -0
- package/full-service-declarative/app/commands/ListSessionsCommand.ts +70 -0
- package/full-service-declarative/app/commands/ListUsersCommand.ts +56 -0
- package/full-service-declarative/app/configurations/AppConfiguration.ts +52 -0
- package/full-service-declarative/app/configurations/UserLiveConfiguration.ts +28 -0
- package/full-service-declarative/app/database/DatabaseClient.ts +43 -0
- package/full-service-declarative/app/database/schema.ts +43 -0
- package/full-service-declarative/app/error-handlers/SecurityErrorHandler.ts +61 -0
- package/full-service-declarative/app/errors/CredentialsError.ts +12 -0
- package/full-service-declarative/app/events/UserEvent.ts +17 -0
- package/full-service-declarative/app/handlers/CommentEventHandler.ts +103 -0
- package/full-service-declarative/app/handlers/PostEventHandler.ts +104 -0
- package/full-service-declarative/app/handlers/SecurityEventHandler.ts +108 -0
- package/full-service-declarative/app/handlers/UserEventHandler.ts +159 -0
- package/full-service-declarative/app/listeners/UserEventListener.ts +35 -0
- package/full-service-declarative/app/middleware/AuthMiddleware.ts +54 -0
- package/full-service-declarative/app/models/Comment.ts +38 -0
- package/full-service-declarative/app/models/Post.ts +50 -0
- package/full-service-declarative/app/models/Session.ts +14 -0
- package/full-service-declarative/app/models/User.ts +77 -0
- package/full-service-declarative/app/providers/DrizzleServiceProvider.ts +59 -0
- package/full-service-declarative/app/repositories/CommentRepository.ts +155 -0
- package/full-service-declarative/app/repositories/PostRepository.ts +138 -0
- package/full-service-declarative/app/repositories/SessionRepository.ts +123 -0
- package/full-service-declarative/app/repositories/UserRepository.ts +99 -0
- package/full-service-declarative/app/services/CommentService.ts +112 -0
- package/full-service-declarative/app/services/PostService.ts +100 -0
- package/full-service-declarative/app/services/SecurityService.ts +232 -0
- package/full-service-declarative/app/services/SessionService.ts +130 -0
- package/full-service-declarative/app/services/UserService.ts +110 -0
- package/full-service-declarative/app/subscribers/UserEventSubscriber.ts +38 -0
- package/full-service-declarative/drizzle.config.ts +13 -0
- package/full-service-declarative/package.json +48 -0
- package/full-service-declarative/stone.config.mjs +12 -0
- package/full-service-declarative/tsconfig.json +25 -0
- package/full-service-declarative/vitest.config.ts +24 -0
- package/full-service-imperative/.env.example +2 -0
- package/full-service-imperative/LICENSE +21 -0
- package/full-service-imperative/README.md +65 -0
- package/full-service-imperative/app/Application.ts +317 -0
- package/full-service-imperative/app/commands/ListSessionsCommand.ts +54 -0
- package/full-service-imperative/app/commands/ListUsersCommand.ts +42 -0
- package/full-service-imperative/app/configurations/AppConfiguration.ts +44 -0
- package/full-service-imperative/app/configurations/UserLiveConfiguration.ts +26 -0
- package/full-service-imperative/app/database/DatabaseClient.ts +39 -0
- package/full-service-imperative/app/database/schema.ts +43 -0
- package/full-service-imperative/app/error-handlers/SecurityErrorHandler.ts +58 -0
- package/full-service-imperative/app/errors/CredentialsError.ts +12 -0
- package/full-service-imperative/app/events/UserEvent.ts +17 -0
- package/full-service-imperative/app/handlers/CommentEventHandler.ts +99 -0
- package/full-service-imperative/app/handlers/PostEventHandler.ts +99 -0
- package/full-service-imperative/app/handlers/SecurityEventHandler.ts +83 -0
- package/full-service-imperative/app/handlers/UserEventHandler.ts +132 -0
- package/full-service-imperative/app/listeners/UserEventListener.ts +23 -0
- package/full-service-imperative/app/middleware/AuthMiddleware.ts +44 -0
- package/full-service-imperative/app/models/Comment.ts +38 -0
- package/full-service-imperative/app/models/Post.ts +50 -0
- package/full-service-imperative/app/models/Session.ts +14 -0
- package/full-service-imperative/app/models/User.ts +77 -0
- package/full-service-imperative/app/providers/DrizzleServiceProvider.ts +56 -0
- package/full-service-imperative/app/repositories/CommentRepository.ts +148 -0
- package/full-service-imperative/app/repositories/PostRepository.ts +130 -0
- package/full-service-imperative/app/repositories/SessionRepository.ts +115 -0
- package/full-service-imperative/app/repositories/UserRepository.ts +91 -0
- package/full-service-imperative/app/repositories/contracts/ICommentRepository.ts +72 -0
- package/full-service-imperative/app/repositories/contracts/IPostRepository.ts +63 -0
- package/full-service-imperative/app/repositories/contracts/ISessionRepository.ts +65 -0
- package/full-service-imperative/app/repositories/contracts/IUserRepository.ts +55 -0
- package/full-service-imperative/app/services/CommentService.ts +109 -0
- package/full-service-imperative/app/services/PostService.ts +97 -0
- package/full-service-imperative/app/services/SecurityService.ts +224 -0
- package/full-service-imperative/app/services/SessionService.ts +124 -0
- package/full-service-imperative/app/services/UserService.ts +105 -0
- package/full-service-imperative/app/services/contracts/ICommentService.ts +62 -0
- package/full-service-imperative/app/services/contracts/IPostService.ts +53 -0
- package/full-service-imperative/app/services/contracts/ISecurityService.ts +97 -0
- package/full-service-imperative/app/services/contracts/ISessionService.ts +73 -0
- package/full-service-imperative/app/services/contracts/IUserService.ts +57 -0
- package/full-service-imperative/app/subscribers/UserEventSubscriber.ts +28 -0
- package/full-service-imperative/drizzle.config.ts +13 -0
- package/full-service-imperative/package.json +48 -0
- package/full-service-imperative/stone.config.mjs +12 -0
- package/full-service-imperative/tsconfig.json +25 -0
- package/full-service-imperative/vitest.config.ts +24 -0
- package/package.json +225 -0
- package/standard-react-declarative/LICENSE +21 -0
- package/standard-react-declarative/README.md +39 -0
- package/standard-react-declarative/app/Application.ts +45 -0
- package/standard-react-declarative/app/pages/welcome/WelcomePage.tsx +57 -0
- package/standard-react-declarative/app/services/WelcomeService.ts +38 -0
- package/standard-react-declarative/assets/css/index.css +26 -0
- package/standard-react-declarative/package.json +42 -0
- package/standard-react-declarative/tsconfig.json +33 -0
- package/standard-react-declarative/vitest.config.ts +24 -0
- package/standard-react-imperative/LICENSE +21 -0
- package/standard-react-imperative/README.md +39 -0
- package/standard-react-imperative/app/Application.ts +41 -0
- package/standard-react-imperative/app/pages/welcome/WelcomePage.tsx +50 -0
- package/standard-react-imperative/app/services/WelcomeService.ts +38 -0
- package/standard-react-imperative/assets/css/index.css +26 -0
- package/standard-react-imperative/package.json +42 -0
- package/standard-react-imperative/tsconfig.json +33 -0
- package/standard-react-imperative/vitest.config.ts +24 -0
- package/standard-service-declarative/LICENSE +21 -0
- package/standard-service-declarative/README.md +39 -0
- package/standard-service-declarative/app/Application.ts +39 -0
- package/standard-service-declarative/app/handlers/WelcomeEventHandler.ts +45 -0
- package/standard-service-declarative/app/services/WelcomeService.ts +38 -0
- package/standard-service-declarative/package.json +36 -0
- package/standard-service-declarative/tsconfig.json +25 -0
- package/standard-service-declarative/vitest.config.ts +24 -0
- package/standard-service-imperative/LICENSE +21 -0
- package/standard-service-imperative/README.md +39 -0
- package/standard-service-imperative/app/Application.ts +11 -0
- package/standard-service-imperative/app/handlers/welcomeEventHandler.ts +31 -0
- package/standard-service-imperative/app/services/welcomeService.ts +38 -0
- package/standard-service-imperative/package.json +35 -0
- package/standard-service-imperative/tsconfig.json +25 -0
- package/standard-service-imperative/vitest.config.ts +24 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { defineStone } from '@stone-js/core'
|
|
2
|
+
import { Comment, CommentInput } from '../models/Comment'
|
|
3
|
+
import { ICommentService } from './contracts/ICommentService'
|
|
4
|
+
import { ICommentClient } from '../clients/contracts/ICommentClient'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Comment Service Options
|
|
8
|
+
*/
|
|
9
|
+
export interface CommentServiceOptions {
|
|
10
|
+
commentClient: ICommentClient
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Comment Service
|
|
15
|
+
*/
|
|
16
|
+
export const CommentService = ({ commentClient }: CommentServiceOptions): ICommentService => ({
|
|
17
|
+
/**
|
|
18
|
+
* List comments
|
|
19
|
+
*
|
|
20
|
+
* @param postId - The id of the post to list comments
|
|
21
|
+
* @param limit - The limit of comments to list
|
|
22
|
+
*/
|
|
23
|
+
async list (postId: number, limit: number = 10): Promise<Comment[]> {
|
|
24
|
+
return await commentClient.list(postId, limit)
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Create a comment
|
|
29
|
+
*
|
|
30
|
+
* @param postId - The id of the post to create the comment for
|
|
31
|
+
* @param comment - The comment to create
|
|
32
|
+
*/
|
|
33
|
+
async create (postId: number, comment: CommentInput): Promise<void> {
|
|
34
|
+
await commentClient.create(postId, comment)
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Delete a comment
|
|
39
|
+
*
|
|
40
|
+
* @param id - The id of the comment to delete
|
|
41
|
+
*/
|
|
42
|
+
async delete (id: number): Promise<void> {
|
|
43
|
+
await commentClient.delete(id)
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Comment Service blueprint.
|
|
49
|
+
*
|
|
50
|
+
* The alias is required to get benefits of desctructuring Dependency Injection.
|
|
51
|
+
* And because the front-end class will be minified, we need to use alias to keep the class name.
|
|
52
|
+
*/
|
|
53
|
+
export const CommentServiceBlueprint = defineStone(CommentService, { alias: 'commentService' })
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { defineService } from '@stone-js/core'
|
|
2
|
+
import { Post, PostInput } from '../models/Post'
|
|
3
|
+
import { IPostService } from './contracts/IPostService'
|
|
4
|
+
import { IPostClient } from '../clients/contracts/IPostClient'
|
|
5
|
+
import { PostNotFoundError } from '../errors/PostNotFoundError'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Post Service Options
|
|
9
|
+
*/
|
|
10
|
+
export interface PostServiceOptions {
|
|
11
|
+
postClient: IPostClient
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Post Service
|
|
16
|
+
*/
|
|
17
|
+
export const PostService = ({ postClient }: PostServiceOptions): IPostService => ({
|
|
18
|
+
/**
|
|
19
|
+
* List posts
|
|
20
|
+
*
|
|
21
|
+
* @param limit - The limit of posts to list
|
|
22
|
+
*/
|
|
23
|
+
async list (limit: number = 10): Promise<Post[]> {
|
|
24
|
+
return await postClient.list(limit)
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* List posts by author
|
|
29
|
+
*
|
|
30
|
+
* @param id - The id of the author to list posts
|
|
31
|
+
* @param limit - The limit of posts to list
|
|
32
|
+
*/
|
|
33
|
+
async listbyAuthor (id: number, limit: number = 10): Promise<Post[]> {
|
|
34
|
+
return await postClient.listByAuthor(id, limit)
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Find a post
|
|
39
|
+
*
|
|
40
|
+
* @param conditions - The conditions to find the post
|
|
41
|
+
* @returns The found post
|
|
42
|
+
*/
|
|
43
|
+
async find (conditions: Record<string, any>): Promise<Post> {
|
|
44
|
+
try {
|
|
45
|
+
return await postClient.find(conditions.id)
|
|
46
|
+
} catch (error: any) {
|
|
47
|
+
if (error.status === 404) {
|
|
48
|
+
throw new PostNotFoundError(error.message, { cause: error })
|
|
49
|
+
} else {
|
|
50
|
+
throw error
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Find a post by key
|
|
57
|
+
*
|
|
58
|
+
* @param key - The key to find the post
|
|
59
|
+
* @param value - The value to find the post
|
|
60
|
+
* @returns The found post
|
|
61
|
+
* @throws PostNotFoundError
|
|
62
|
+
*/
|
|
63
|
+
async findBy (key: string, value: string): Promise<Post | undefined> {
|
|
64
|
+
return await this.find({ [key]: value })
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Create a post
|
|
69
|
+
*
|
|
70
|
+
* @param post - The post to create
|
|
71
|
+
*/
|
|
72
|
+
async create (post: PostInput): Promise<Post> {
|
|
73
|
+
return await postClient.create(post)
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Update a post
|
|
78
|
+
*
|
|
79
|
+
* @param id - The id of the post to update
|
|
80
|
+
* @param post - The post data to update
|
|
81
|
+
*/
|
|
82
|
+
async update (id: number, post: PostInput): Promise<Post> {
|
|
83
|
+
return await postClient.update(id, post)
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Delete a post
|
|
88
|
+
*
|
|
89
|
+
* @param id - The id of the post to delete
|
|
90
|
+
*/
|
|
91
|
+
async delete (id: number): Promise<void> {
|
|
92
|
+
await postClient.delete(id)
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Post Service Blueprint
|
|
98
|
+
*
|
|
99
|
+
* The alias is required to get benefits of desctructuring Dependency Injection.
|
|
100
|
+
* And because the front-end class will be minified, we need to use alias to keep the class name.
|
|
101
|
+
*/
|
|
102
|
+
export const PostServiceBlueprint = defineService(PostService, { alias: 'postService', isFactory: true })
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { defineService } from '@stone-js/core'
|
|
2
|
+
import { ITokenService } from './contracts/ITokenService'
|
|
3
|
+
import { ISecurityService } from './contracts/ISecurityService'
|
|
4
|
+
import { ISecurityClient } from '../clients/contracts/ISecurityClient'
|
|
5
|
+
import { UserChangePassword, UserLogin, UserRegister } from '../models/User'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Security Service Options
|
|
9
|
+
*/
|
|
10
|
+
export interface SecurityServiceOptions {
|
|
11
|
+
tokenService: ITokenService
|
|
12
|
+
securityClient: ISecurityClient
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Security Service
|
|
17
|
+
*/
|
|
18
|
+
export const SecurityService = ({ tokenService, securityClient }: SecurityServiceOptions): ISecurityService => ({
|
|
19
|
+
/**
|
|
20
|
+
* Login a user
|
|
21
|
+
*
|
|
22
|
+
* @param user - The user to login
|
|
23
|
+
* @returns The user token
|
|
24
|
+
*/
|
|
25
|
+
async login (user: UserLogin): Promise<void> {
|
|
26
|
+
const token = await securityClient.login(user)
|
|
27
|
+
tokenService.saveToken(token)
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Logout a user
|
|
32
|
+
*/
|
|
33
|
+
async logout (): Promise<void> {
|
|
34
|
+
await securityClient.logout()
|
|
35
|
+
tokenService.removeToken()
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Register a user
|
|
40
|
+
*
|
|
41
|
+
* @param user - The user to register
|
|
42
|
+
*/
|
|
43
|
+
async register (user: UserRegister): Promise<void> {
|
|
44
|
+
await securityClient.register(user)
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Change the user password
|
|
49
|
+
*
|
|
50
|
+
* @param password - The password to change
|
|
51
|
+
*/
|
|
52
|
+
async changePassword (password: UserChangePassword): Promise<void> {
|
|
53
|
+
await securityClient.changePassword(password)
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Check if the user is authenticated
|
|
58
|
+
*
|
|
59
|
+
* @returns True if the user is authenticated, false otherwise
|
|
60
|
+
*/
|
|
61
|
+
isAuthenticated (): boolean {
|
|
62
|
+
return tokenService.isAuthenticated()
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Security Service Blueprint
|
|
68
|
+
*
|
|
69
|
+
* The alias is required to get benefits of desctructuring Dependency Injection.
|
|
70
|
+
* And because the front-end class will be minified, we need to use alias to keep the class name.
|
|
71
|
+
*/
|
|
72
|
+
export const SecurityServiceBlueprint = defineService(SecurityService, { alias: 'securityService', isFactory: true })
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Axios } from 'axios'
|
|
2
|
+
import { UserToken } from '../models/User'
|
|
3
|
+
import { ReactIncomingEvent } from '@stone-js/use-react'
|
|
4
|
+
import { ITokenService } from './contracts/ITokenService'
|
|
5
|
+
import { defineService, IContainer, isNotEmpty } from '@stone-js/core'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Token Service Options
|
|
9
|
+
*/
|
|
10
|
+
export interface TokenServiceOptions {
|
|
11
|
+
axios: Axios
|
|
12
|
+
container: IContainer
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Token Service
|
|
17
|
+
*/
|
|
18
|
+
export const TokenService = ({ container, axios }: TokenServiceOptions): ITokenService => ({
|
|
19
|
+
/**
|
|
20
|
+
* Refresh the user token
|
|
21
|
+
*/
|
|
22
|
+
async refresh (): Promise<void> {
|
|
23
|
+
const headers = {
|
|
24
|
+
Accept: 'application/json',
|
|
25
|
+
'Content-Type': 'application/json',
|
|
26
|
+
Authorization: `Bearer ${String(this.getAccessToken())}`
|
|
27
|
+
}
|
|
28
|
+
const response = await axios.post<UserToken>('/refresh', {}, { headers })
|
|
29
|
+
|
|
30
|
+
this.saveToken(response.data)
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Set the token
|
|
35
|
+
*
|
|
36
|
+
* The event must be resolved on demand
|
|
37
|
+
* because the event is not available at the time of service creation.
|
|
38
|
+
* The event is available only when the request is made.
|
|
39
|
+
*
|
|
40
|
+
* @param token - The token to set
|
|
41
|
+
*/
|
|
42
|
+
saveToken (token: UserToken): void {
|
|
43
|
+
container.make<ReactIncomingEvent>('event').cookies.add(
|
|
44
|
+
'token',
|
|
45
|
+
{ ...token, createdAt: Date.now() },
|
|
46
|
+
{
|
|
47
|
+
path: '/',
|
|
48
|
+
secure: true,
|
|
49
|
+
httpOnly: false,
|
|
50
|
+
maxAge: token.expiresIn
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Remove the token
|
|
57
|
+
*/
|
|
58
|
+
removeToken (): void {
|
|
59
|
+
container.make<ReactIncomingEvent>('event').cookies.remove(
|
|
60
|
+
'token',
|
|
61
|
+
{
|
|
62
|
+
path: '/',
|
|
63
|
+
secure: true,
|
|
64
|
+
httpOnly: false
|
|
65
|
+
}
|
|
66
|
+
)
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Get the token
|
|
71
|
+
*
|
|
72
|
+
* The event must be resolved on demand
|
|
73
|
+
* because the event is not available at the time of service creation.
|
|
74
|
+
* The event is available only when the request is made.
|
|
75
|
+
*
|
|
76
|
+
* @returns The token
|
|
77
|
+
*/
|
|
78
|
+
getToken (): UserToken | undefined {
|
|
79
|
+
return container.make<ReactIncomingEvent>('event').cookies.getValue('token')
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Get the access token
|
|
84
|
+
*
|
|
85
|
+
* @returns The access token
|
|
86
|
+
*/
|
|
87
|
+
getAccessToken (): string | undefined {
|
|
88
|
+
return this.getToken()?.accessToken
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Check if the user is authenticated
|
|
93
|
+
*
|
|
94
|
+
* @returns True if the user is authenticated, false otherwise
|
|
95
|
+
*/
|
|
96
|
+
isAuthenticated (): boolean {
|
|
97
|
+
const token = this.getToken()
|
|
98
|
+
return isNotEmpty<UserToken>(token) && (token.createdAt + (token.expiresIn * 1000)) > Date.now()
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Token Service Blueprint
|
|
104
|
+
*
|
|
105
|
+
* The alias is required to get benefits of desctructuring Dependency Injection.
|
|
106
|
+
* And because the front-end class will be minified, we need to use alias to keep the class name.
|
|
107
|
+
*/
|
|
108
|
+
export const TokenServiceBlueprint = defineService(TokenService, { alias: 'tokenService', isFactory: true })
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { UserEvent } from '../events/UserEvent'
|
|
2
|
+
import { User, UserInput } from '../models/User'
|
|
3
|
+
import { ReactRuntime } from '@stone-js/use-react'
|
|
4
|
+
import { IUserService } from './contracts/IUserService'
|
|
5
|
+
import { defineService, EventEmitter } from '@stone-js/core'
|
|
6
|
+
import { IUserClient } from '../clients/contracts/IUserClient'
|
|
7
|
+
import { UserNotFoundError } from '../errors/UserNotFoundError'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* User Service Options
|
|
11
|
+
*/
|
|
12
|
+
export interface UserServiceOptions {
|
|
13
|
+
userClient: IUserClient
|
|
14
|
+
reactRuntime: ReactRuntime
|
|
15
|
+
eventEmitter: EventEmitter
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* User Service
|
|
20
|
+
*/
|
|
21
|
+
export const UserService = ({ userClient, reactRuntime, eventEmitter }: UserServiceOptions): IUserService => {
|
|
22
|
+
return {
|
|
23
|
+
/**
|
|
24
|
+
* List users
|
|
25
|
+
*
|
|
26
|
+
* @param limit - The limit of users to list
|
|
27
|
+
*/
|
|
28
|
+
async list (limit: number = 10): Promise<User[]> {
|
|
29
|
+
return await userClient.list(limit)
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Get the current user
|
|
34
|
+
*/
|
|
35
|
+
async current (): Promise<User> {
|
|
36
|
+
return await userClient.currentUser()
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Find a user
|
|
41
|
+
*
|
|
42
|
+
* @param conditions - The conditions to find the user
|
|
43
|
+
* @returns The found user
|
|
44
|
+
*/
|
|
45
|
+
async find (conditions: Record<string, any>): Promise<User> {
|
|
46
|
+
try {
|
|
47
|
+
return await userClient.find(conditions.id)
|
|
48
|
+
} catch (error: any) {
|
|
49
|
+
if (error.status === 404) {
|
|
50
|
+
throw new UserNotFoundError(error.message, { cause: error })
|
|
51
|
+
} else {
|
|
52
|
+
throw error
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Find a user by key
|
|
59
|
+
*
|
|
60
|
+
* @param key - The key to find the user
|
|
61
|
+
* @param value - The value to find the user
|
|
62
|
+
* @returns The found user
|
|
63
|
+
* @throws UserNotFoundError
|
|
64
|
+
*/
|
|
65
|
+
async findBy (key: string, value: any): Promise<User | undefined> {
|
|
66
|
+
return await reactRuntime.snapshot(`user-${String(key)}-${String(value)}`, async () => await this.find({ [key]: value }))
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Create a user
|
|
71
|
+
*
|
|
72
|
+
* @param user - The user to create
|
|
73
|
+
*/
|
|
74
|
+
async create (user: UserInput): Promise<void> {
|
|
75
|
+
await eventEmitter.emit(new UserEvent(user))
|
|
76
|
+
await userClient.create(user)
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Update the current user
|
|
81
|
+
*
|
|
82
|
+
* @param user - The user data to update
|
|
83
|
+
*/
|
|
84
|
+
async updateCurrent (user: UserInput): Promise<User> {
|
|
85
|
+
return await userClient.updateCurrent(user)
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Update a user
|
|
90
|
+
*
|
|
91
|
+
* @param id - The id of the user to update
|
|
92
|
+
* @param user - The user data to update
|
|
93
|
+
*/
|
|
94
|
+
async update (id: number, user: UserInput): Promise<User> {
|
|
95
|
+
return await userClient.update(id, user)
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Delete a user
|
|
100
|
+
*
|
|
101
|
+
* @param id - The id of the user to delete
|
|
102
|
+
*/
|
|
103
|
+
async delete (id: number): Promise<void> {
|
|
104
|
+
await userClient.delete(id)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* User Service Blueprint
|
|
111
|
+
*
|
|
112
|
+
* The alias is required to get benefits of desctructuring Dependency Injection.
|
|
113
|
+
* And because the front-end class will be minified, we need to use alias to keep the class name.
|
|
114
|
+
*/
|
|
115
|
+
export const UserServiceBlueprint = defineService(UserService, { alias: 'userService', isFactory: true })
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Comment, CommentInput } from '../../models/Comment'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Comment Service contract
|
|
5
|
+
*/
|
|
6
|
+
export interface ICommentService {
|
|
7
|
+
/**
|
|
8
|
+
* List comments for a given post.
|
|
9
|
+
*
|
|
10
|
+
* @param postId - The ID of the post to list comments for.
|
|
11
|
+
* @param limit - Optional number of comments to return (default: 10).
|
|
12
|
+
* @returns The list of comments.
|
|
13
|
+
*/
|
|
14
|
+
list: (postId: number, limit?: number) => Promise<Comment[]>
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Create a new comment for a post.
|
|
18
|
+
*
|
|
19
|
+
* @param postId - The ID of the post.
|
|
20
|
+
* @param comment - The comment data.
|
|
21
|
+
*/
|
|
22
|
+
create: (postId: number, comment: CommentInput) => Promise<void>
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Delete a comment by its ID.
|
|
26
|
+
*
|
|
27
|
+
* @param id - The ID of the comment to delete.
|
|
28
|
+
*/
|
|
29
|
+
delete: (id: number) => Promise<void>
|
|
30
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Post, PostInput } from '../../models/Post'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Post Service contract
|
|
5
|
+
*/
|
|
6
|
+
export interface IPostService {
|
|
7
|
+
/**
|
|
8
|
+
* List posts.
|
|
9
|
+
*
|
|
10
|
+
* @param limit - Optional limit of posts to list (default: 10).
|
|
11
|
+
* @returns The list of posts.
|
|
12
|
+
*/
|
|
13
|
+
list: (limit?: number) => Promise<Post[]>
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* List posts by author.
|
|
17
|
+
*
|
|
18
|
+
* @param id - The author ID.
|
|
19
|
+
* @param limit - Optional limit of posts (default: 10).
|
|
20
|
+
* @returns The list of posts.
|
|
21
|
+
*/
|
|
22
|
+
listbyAuthor: (id: number, limit?: number) => Promise<Post[]>
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Find a post by conditions (e.g., ID).
|
|
26
|
+
*
|
|
27
|
+
* @param conditions - Key-value map to identify the post (e.g., `{ id: 42 }`).
|
|
28
|
+
* @returns The found post.
|
|
29
|
+
* @throws PostNotFoundError if not found.
|
|
30
|
+
*/
|
|
31
|
+
find: (conditions: Record<string, any>) => Promise<Post>
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Find a post by a specific key and value.
|
|
35
|
+
*
|
|
36
|
+
* @param key - The key to filter by.
|
|
37
|
+
* @param value - The value to match.
|
|
38
|
+
* @returns The post or throws PostNotFoundError.
|
|
39
|
+
*/
|
|
40
|
+
findBy: (key: string, value: string) => Promise<Post | undefined>
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Create a post.
|
|
44
|
+
*
|
|
45
|
+
* @param post - The post data to create.
|
|
46
|
+
* @returns The created post.
|
|
47
|
+
*/
|
|
48
|
+
create: (post: PostInput) => Promise<Post>
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Update a post.
|
|
52
|
+
*
|
|
53
|
+
* @param id - The ID of the post to update.
|
|
54
|
+
* @param post - The post data to update.
|
|
55
|
+
* @returns The updated post.
|
|
56
|
+
*/
|
|
57
|
+
update: (id: number, post: PostInput) => Promise<Post>
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Delete a post by ID.
|
|
61
|
+
*
|
|
62
|
+
* @param id - The ID of the post to delete.
|
|
63
|
+
*/
|
|
64
|
+
delete: (id: number) => Promise<void>
|
|
65
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { UserLogin, UserRegister, UserChangePassword } from '../../models/User'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Security Service contract
|
|
5
|
+
*/
|
|
6
|
+
export interface ISecurityService {
|
|
7
|
+
/**
|
|
8
|
+
* Login a user and store their token.
|
|
9
|
+
*
|
|
10
|
+
* @param user - The user login credentials.
|
|
11
|
+
*/
|
|
12
|
+
login: (user: UserLogin) => Promise<void>
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Logout the user and clear the token.
|
|
16
|
+
*/
|
|
17
|
+
logout: () => Promise<void>
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Register a new user.
|
|
21
|
+
*
|
|
22
|
+
* @param user - The user registration data.
|
|
23
|
+
*/
|
|
24
|
+
register: (user: UserRegister) => Promise<void>
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Change the user's password.
|
|
28
|
+
*
|
|
29
|
+
* @param password - The password payload.
|
|
30
|
+
*/
|
|
31
|
+
changePassword: (password: UserChangePassword) => Promise<void>
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Check if the user is currently authenticated.
|
|
35
|
+
*
|
|
36
|
+
* @returns `true` if authenticated, `false` otherwise.
|
|
37
|
+
*/
|
|
38
|
+
isAuthenticated: () => boolean
|
|
39
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { UserToken } from '../../models/User'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Token Service contract
|
|
5
|
+
*/
|
|
6
|
+
export interface ITokenService {
|
|
7
|
+
/**
|
|
8
|
+
* Refresh the user token by making a call to the refresh endpoint.
|
|
9
|
+
*/
|
|
10
|
+
refresh: () => Promise<void>
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Save the token in the cookies.
|
|
14
|
+
*
|
|
15
|
+
* @param token - The token to store.
|
|
16
|
+
*/
|
|
17
|
+
saveToken: (token: UserToken) => void
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Remove the token from cookies.
|
|
21
|
+
*/
|
|
22
|
+
removeToken: () => void
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Get the full token object from cookies.
|
|
26
|
+
*
|
|
27
|
+
* @returns The stored token, or `undefined` if not found.
|
|
28
|
+
*/
|
|
29
|
+
getToken: () => UserToken | undefined
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Get only the access token string from the stored token.
|
|
33
|
+
*
|
|
34
|
+
* @returns The access token string, or `undefined`.
|
|
35
|
+
*/
|
|
36
|
+
getAccessToken: () => string | undefined
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Check if the user is currently authenticated based on token expiry.
|
|
40
|
+
*
|
|
41
|
+
* @returns `true` if the user is authenticated, otherwise `false`.
|
|
42
|
+
*/
|
|
43
|
+
isAuthenticated: () => boolean
|
|
44
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { User, UserInput } from '../../models/User'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* User Service contract
|
|
5
|
+
*/
|
|
6
|
+
export interface IUserService {
|
|
7
|
+
/**
|
|
8
|
+
* List users.
|
|
9
|
+
*
|
|
10
|
+
* @param limit - The number of users to list (default: 10).
|
|
11
|
+
* @returns The list of users.
|
|
12
|
+
*/
|
|
13
|
+
list: (limit?: number) => Promise<User[]>
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Get the currently authenticated user.
|
|
17
|
+
*
|
|
18
|
+
* @returns The current user.
|
|
19
|
+
*/
|
|
20
|
+
current: () => Promise<User>
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Find a user by conditions (e.g., by ID).
|
|
24
|
+
*
|
|
25
|
+
* @param conditions - Conditions to identify the user (e.g., `{ id: number }`).
|
|
26
|
+
* @returns The found user.
|
|
27
|
+
* @throws UserNotFoundError if the user is not found.
|
|
28
|
+
*/
|
|
29
|
+
find: (conditions: Record<string, any>) => Promise<User>
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Find a user by key-value pair with snapshot caching.
|
|
33
|
+
*
|
|
34
|
+
* @param key - The key to filter by (e.g., `"email"`).
|
|
35
|
+
* @param value - The value to match.
|
|
36
|
+
* @returns The found user or throws UserNotFoundError.
|
|
37
|
+
*/
|
|
38
|
+
findBy: (key: string, value: any) => Promise<User | undefined>
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Create a new user.
|
|
42
|
+
*
|
|
43
|
+
* @param user - The user data to create.
|
|
44
|
+
*/
|
|
45
|
+
create: (user: UserInput) => Promise<void>
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Update the currently authenticated user.
|
|
49
|
+
*
|
|
50
|
+
* @param user - The updated user data.
|
|
51
|
+
* @returns The updated user.
|
|
52
|
+
*/
|
|
53
|
+
updateCurrent: (user: UserInput) => Promise<User>
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Update a user by ID.
|
|
57
|
+
*
|
|
58
|
+
* @param id - The ID of the user to update.
|
|
59
|
+
* @param user - The updated user data.
|
|
60
|
+
* @returns The updated user.
|
|
61
|
+
*/
|
|
62
|
+
update: (id: number, user: UserInput) => Promise<User>
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Delete a user by ID.
|
|
66
|
+
*
|
|
67
|
+
* @param id - The ID of the user to delete.
|
|
68
|
+
*/
|
|
69
|
+
delete: (id: number) => Promise<void>
|
|
70
|
+
}
|