From 149cdac5b27e87900000133aa5d799b342ea82af Mon Sep 17 00:00:00 2001 From: MatiasSargo <165160391+MatiasSargo@users.noreply.github.com> Date: Tue, 20 Aug 2024 08:12:40 +0200 Subject: [PATCH] implement register and login #85 --- staff/matias-sargo/ponies/api/.env | 3 - staff/matias-sargo/ponies/api/.gitignore | 2 - .../ponies/api/handlers/createPostHandler.js | 15 - .../ponies/api/handlers/deletePostHandler.js | 15 - .../api/handlers/getAllFavPostsHandler.js | 13 - .../api/handlers/getAllPoniesPostsHandler.js | 13 - .../ponies/api/handlers/getAllPostsHandler.js | 13 - .../ponies/api/handlers/getUserNameHandler.js | 15 - .../matias-sargo/ponies/api/handlers/index.js | 29 - .../api/handlers/registerUserHandler.js | 13 - .../ponies/api/handlers/searchPostsHandler.js | 13 - .../api/handlers/toggleFavPostHandler.js | 15 - .../api/handlers/toggleFollowUserHandler.js | 15 - .../api/handlers/toggleLikePostHandler.js | 15 - .../api/handlers/updatePostCaptionHandler.js | 17 - staff/matias-sargo/ponies/api/index.js | 75 -- .../ponies/api/test/authenticate-user.sh | 1 - .../ponies/api/test/create-post.sh | 1 - .../ponies/api/test/delete-post.sh | 1 - .../ponies/api/test/get-all-favs.sh | 1 - .../ponies/api/test/get-all-ponies-post.sh | 1 - .../ponies/api/test/get-all-posts.sh | 1 - .../ponies/api/test/get-user-name.sh | 1 - staff/matias-sargo/ponies/api/test/hello.sh | 1 - .../ponies/api/test/register-user.sh | 2 - .../ponies/api/test/search-post.sh | 1 - .../ponies/api/test/toggle-fav-post.sh | 1 - .../ponies/api/test/toggle-follow-user.sh | 1 - .../ponies/api/test/toggle-like-post.sh | 1 - .../matias-sargo/ponies/api/test/validate.js | 60 -- staff/matias-sargo/ponies/app/.env | 1 - staff/matias-sargo/ponies/app/.eslintrc.cjs | 21 - staff/matias-sargo/ponies/app/.gitignore | 2 - staff/matias-sargo/ponies/app/README.md | 19 - .../app/assets/img/horse-3-svgrepo-com.svg | 57 -- staff/matias-sargo/ponies/app/index.css | 30 - .../ponies/app/logic/createPost.js | 32 - .../ponies/app/logic/deletePost.js | 29 - .../ponies/app/logic/getAllFavPosts.js | 28 - .../ponies/app/logic/getAllPoniesPosts.js | 28 - .../ponies/app/logic/getAllPosts.js | 28 - .../ponies/app/logic/getUserId.js | 7 - .../ponies/app/logic/getUserName.js | 32 - .../ponies/app/logic/getUserUsername.js | 7 - staff/matias-sargo/ponies/app/logic/index.js | 37 - .../ponies/app/logic/logoutUser.js | 1 - .../ponies/app/logic/searchColors.js | 26 - .../ponies/app/logic/searchPosts.js | 30 - .../ponies/app/logic/toggleFavPost.js | 29 - .../ponies/app/logic/toggleFollowUser.js | 29 - .../ponies/app/logic/toggleLikePost.js | 29 - .../ponies/app/logic/updatePostCaption.js | 32 - .../matias-sargo/ponies/app/postcss.config.js | 6 - .../app/util/extractPayloadFromToken.js | 9 - .../ponies/app/util/formatTime.js | 37 - .../app/util/image/apple-touch-icon.png | Bin 49772 -> 0 bytes .../ponies/app/view/common/Alert.jsx | 17 - .../ponies/app/view/common/Confirm.jsx | 18 - .../ponies/app/view/home/Avatar.jsx | 5 - .../ponies/app/view/home/CreatePost.jsx | 69 -- .../ponies/app/view/home/FavsPostList.jsx | 75 -- .../ponies/app/view/home/Footer.jsx | 35 - .../ponies/app/view/home/Header.jsx | 85 -- .../ponies/app/view/home/Hello.jsx | 7 - .../ponies/app/view/home/PoniesPostList.jsx | 75 -- .../ponies/app/view/home/Post.jsx | 182 ---- .../ponies/app/view/home/PostList.jsx | 75 -- .../ponies/app/view/home/ResultsPostList.jsx | 80 -- .../ponies/app/view/home/Search.jsx | 48 - .../ponies/app/view/home/index.jsx | 69 -- .../ponies/app/view/library/Image.jsx | 5 - .../ponies/app/view/library/Paragraph.jsx | 5 - .../ponies/app/view/library/Time.jsx | 5 - staff/matias-sargo/ponies/com/package.json | 13 - staff/matias-sargo/ponies/cor/.env | 1 - staff/matias-sargo/ponies/cor/.gitignore | 2 - .../ponies/cor/data/demo-mongo.js | 43 - staff/matias-sargo/ponies/cor/data/demo.js | 82 -- .../ponies/cor/logic/authenticateUser.spec.js | 146 --- .../ponies/cor/logic/authenticateUser.test.js | 22 - .../ponies/cor/logic/createPost.js | 25 - .../ponies/cor/logic/createPost.spec.js | 119 --- .../ponies/cor/logic/createPost.test.js | 9 - .../ponies/cor/logic/deletePost.js | 29 - .../ponies/cor/logic/deletePost.spec.js | 172 ---- .../ponies/cor/logic/deletePost.test.js | 32 - .../ponies/cor/logic/demo-chai.js | 9 - .../ponies/cor/logic/demo-test.js | 8 - .../ponies/cor/logic/getAllFavPost.spec.js | 114 --- .../ponies/cor/logic/getAllFavPosts.js | 45 - .../ponies/cor/logic/getAllFavPosts.test.js | 32 - .../ponies/cor/logic/getAllPoniesPost.spec.js | 106 --- .../ponies/cor/logic/getAllPoniesPosts.js | 45 - .../cor/logic/getAllPoniesPosts.test.js | 32 - .../ponies/cor/logic/getAllPost.spec.js | 103 --- .../ponies/cor/logic/getAllPosts.js | 47 - .../ponies/cor/logic/getAllPosts.test.js | 22 - .../ponies/cor/logic/getUserName.js | 24 - .../ponies/cor/logic/getUserName.test.js | 22 - .../ponies/cor/logic/getUsername.spec.js | 136 --- staff/matias-sargo/ponies/cor/logic/index.js | 31 - .../ponies/cor/logic/registerUser.js | 42 - .../ponies/cor/logic/registerUser.spec.js | 246 ----- .../ponies/cor/logic/searchPosts.js | 46 - .../ponies/cor/logic/searchPosts.test.js | 11 - .../ponies/cor/logic/toggleFavPost.js | 35 - .../ponies/cor/logic/toggleFavPost.spec.js | 135 --- .../ponies/cor/logic/toggleFavPost.test.js | 21 - .../ponies/cor/logic/toggleFollowUser.js | 35 - .../ponies/cor/logic/toggleFollowUser.spec.js | 124 --- .../ponies/cor/logic/toggleFollowUser.test.js | 21 - .../ponies/cor/logic/toggleLikePost.js | 36 - .../ponies/cor/logic/toggleLikePost.spec.js | 130 --- .../ponies/cor/logic/toggleLikePost.test.js | 21 - .../ponies/cor/logic/updatePostCaption.js | 29 - .../cor/logic/updatePostCaption.spec.js | 157 ---- .../cor/logic/updatePostCaption.test.js | 21 - .../ponies/cor/util/generateId.js | 9 - .../matias-sargo/ponies/cor/util/validate.js | 54 -- staff/matias-sargo/ponies/web/home.html | 19 - staff/matias-sargo/ponies/web/index.css | 4 - staff/matias-sargo/ponies/web/index.js | 144 --- .../matias-sargo/ponies/web/login-error.html | 16 - staff/matias-sargo/ponies/web/login.html | 28 - .../matias-sargo/ponies/web/package-lock.json | 706 --------------- staff/matias-sargo/ponies/web/package.json | 20 - staff/matias-sargo/ponies/web/register.html | 32 - .../api/handlers/authenticateUserHandler.js | 5 +- .../project/api/handlers/index.js | 8 + .../api/handlers/registerUserHandler.js | 13 + staff/matias-sargo/project/api/index.js | 31 + .../api/middlewares/cors.js | 0 .../api/middlewares/errorHandler.js | 2 +- .../api/middlewares/index.js | 2 +- .../api/middlewares/jsonBodyParser.js | 0 .../api/middlewares/jwtVerifier.js | 2 +- .../{ponies => project}/api/package-lock.json | 28 +- .../{ponies => project}/api/package.json | 3 +- .../project/api/test/authenticate-user.sh | 1 + .../project/api/test/register-user.sh | 1 + staff/matias-sargo/project/app/.gitignore | 24 + staff/matias-sargo/project/app/README.md | 8 + .../app/view => project/app}/context.js | 0 .../matias-sargo/project/app/eslint.config.js | 38 + .../{ponies => project}/app/index.html | 4 +- staff/matias-sargo/project/app/index.jsx | 9 + .../app/logic/createProp.js} | 0 staff/matias-sargo/project/app/logic/index.js | 13 + .../app/logic/isUserLoggedIn.js | 0 .../app/logic/loginUser.js | 2 +- .../app/logic/registerUser.js | 7 +- .../{ponies => project}/app/package-lock.json | 838 ++++++++---------- .../{ponies => project}/app/package.json | 18 +- .../project/app/postcss.config.js | 6 + .../matias-sargo/project/app/public/vite.svg | 1 + .../project/app/src/assets/react.svg | 1 + staff/matias-sargo/project/app/src/index.css | 3 + .../{ponies/app => project/app/src}/index.jsx | 0 .../app/tailwind.config.js | 6 +- .../{ponies => project}/app/view/App.jsx | 10 +- .../app/view/library/Button.jsx | 0 .../app/view/library/Container.jsx | 0 .../app/view/library/Form.jsx | 0 .../app/view/library/Heading.jsx | 0 .../app/view/library/Input.jsx | 0 .../app/view/library/Label.jsx | 0 .../app/view/library/Link.jsx | 0 .../app/view/login/index.jsx | 4 +- .../app/view/register/index.jsx | 11 +- .../{ponies => project}/app/vite.config.js | 0 .../{ponies => project}/com/errors.js | 0 .../{ponies => project}/com/index.js | 0 staff/matias-sargo/project/com/package.json | 13 + .../{ponies => project}/com/validate.js | 0 .../{ponies => project}/cor/data/index.js | 0 .../{ponies => project}/cor/data/models.js | 12 +- .../{ponies => project}/cor/index.js | 0 .../project/cor/logic/authenicateUser.spec.js | 123 +++ .../cor/logic/authenticateUser.js | 0 .../cor/logic/authenticateUser.test.js | 10 + .../project/cor/logic/createProp.js | 34 + staff/matias-sargo/project/cor/logic/index.js | 11 + .../project/cor/logic/registerUser.js | 49 + .../project/cor/logic/registerUser.spec.js | 201 +++++ .../cor/logic/registerUser.test.js | 2 +- .../{ponies => project}/cor/package-lock.json | 748 +++++++++++++++- .../{ponies => project}/cor/package.json | 23 +- staff/matias-sargo/project/doc/README.md | 94 ++ 188 files changed, 1832 insertions(+), 5996 deletions(-) delete mode 100644 staff/matias-sargo/ponies/api/.env delete mode 100644 staff/matias-sargo/ponies/api/.gitignore delete mode 100644 staff/matias-sargo/ponies/api/handlers/createPostHandler.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/deletePostHandler.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/getAllFavPostsHandler.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/getAllPoniesPostsHandler.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/getAllPostsHandler.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/getUserNameHandler.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/index.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/registerUserHandler.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/searchPostsHandler.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/toggleFavPostHandler.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/toggleFollowUserHandler.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/toggleLikePostHandler.js delete mode 100644 staff/matias-sargo/ponies/api/handlers/updatePostCaptionHandler.js delete mode 100644 staff/matias-sargo/ponies/api/index.js delete mode 100644 staff/matias-sargo/ponies/api/test/authenticate-user.sh delete mode 100644 staff/matias-sargo/ponies/api/test/create-post.sh delete mode 100644 staff/matias-sargo/ponies/api/test/delete-post.sh delete mode 100644 staff/matias-sargo/ponies/api/test/get-all-favs.sh delete mode 100644 staff/matias-sargo/ponies/api/test/get-all-ponies-post.sh delete mode 100644 staff/matias-sargo/ponies/api/test/get-all-posts.sh delete mode 100644 staff/matias-sargo/ponies/api/test/get-user-name.sh delete mode 100644 staff/matias-sargo/ponies/api/test/hello.sh delete mode 100644 staff/matias-sargo/ponies/api/test/register-user.sh delete mode 100644 staff/matias-sargo/ponies/api/test/search-post.sh delete mode 100644 staff/matias-sargo/ponies/api/test/toggle-fav-post.sh delete mode 100644 staff/matias-sargo/ponies/api/test/toggle-follow-user.sh delete mode 100644 staff/matias-sargo/ponies/api/test/toggle-like-post.sh delete mode 100644 staff/matias-sargo/ponies/api/test/validate.js delete mode 100644 staff/matias-sargo/ponies/app/.env delete mode 100644 staff/matias-sargo/ponies/app/.eslintrc.cjs delete mode 100644 staff/matias-sargo/ponies/app/.gitignore delete mode 100644 staff/matias-sargo/ponies/app/README.md delete mode 100644 staff/matias-sargo/ponies/app/assets/img/horse-3-svgrepo-com.svg delete mode 100644 staff/matias-sargo/ponies/app/index.css delete mode 100644 staff/matias-sargo/ponies/app/logic/createPost.js delete mode 100644 staff/matias-sargo/ponies/app/logic/deletePost.js delete mode 100644 staff/matias-sargo/ponies/app/logic/getAllFavPosts.js delete mode 100644 staff/matias-sargo/ponies/app/logic/getAllPoniesPosts.js delete mode 100644 staff/matias-sargo/ponies/app/logic/getAllPosts.js delete mode 100644 staff/matias-sargo/ponies/app/logic/getUserId.js delete mode 100644 staff/matias-sargo/ponies/app/logic/getUserName.js delete mode 100644 staff/matias-sargo/ponies/app/logic/getUserUsername.js delete mode 100644 staff/matias-sargo/ponies/app/logic/index.js delete mode 100644 staff/matias-sargo/ponies/app/logic/logoutUser.js delete mode 100644 staff/matias-sargo/ponies/app/logic/searchColors.js delete mode 100644 staff/matias-sargo/ponies/app/logic/searchPosts.js delete mode 100644 staff/matias-sargo/ponies/app/logic/toggleFavPost.js delete mode 100644 staff/matias-sargo/ponies/app/logic/toggleFollowUser.js delete mode 100644 staff/matias-sargo/ponies/app/logic/toggleLikePost.js delete mode 100644 staff/matias-sargo/ponies/app/logic/updatePostCaption.js delete mode 100644 staff/matias-sargo/ponies/app/postcss.config.js delete mode 100644 staff/matias-sargo/ponies/app/util/extractPayloadFromToken.js delete mode 100644 staff/matias-sargo/ponies/app/util/formatTime.js delete mode 100644 staff/matias-sargo/ponies/app/util/image/apple-touch-icon.png delete mode 100644 staff/matias-sargo/ponies/app/view/common/Alert.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/common/Confirm.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/Avatar.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/CreatePost.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/FavsPostList.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/Footer.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/Header.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/Hello.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/PoniesPostList.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/Post.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/PostList.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/ResultsPostList.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/Search.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/home/index.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/library/Image.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/library/Paragraph.jsx delete mode 100644 staff/matias-sargo/ponies/app/view/library/Time.jsx delete mode 100644 staff/matias-sargo/ponies/com/package.json delete mode 100644 staff/matias-sargo/ponies/cor/.env delete mode 100644 staff/matias-sargo/ponies/cor/.gitignore delete mode 100644 staff/matias-sargo/ponies/cor/data/demo-mongo.js delete mode 100644 staff/matias-sargo/ponies/cor/data/demo.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/authenticateUser.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/authenticateUser.test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/createPost.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/createPost.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/createPost.test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/deletePost.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/deletePost.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/deletePost.test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/demo-chai.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/demo-test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getAllFavPost.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getAllFavPosts.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getAllFavPosts.test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getAllPoniesPost.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getAllPoniesPosts.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getAllPoniesPosts.test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getAllPost.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getAllPosts.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getAllPosts.test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getUserName.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getUserName.test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/getUsername.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/index.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/registerUser.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/registerUser.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/searchPosts.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/searchPosts.test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/toggleFavPost.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/toggleFavPost.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/toggleFavPost.test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/toggleFollowUser.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/toggleFollowUser.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/toggleFollowUser.test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/toggleLikePost.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/toggleLikePost.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/toggleLikePost.test.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/updatePostCaption.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/updatePostCaption.spec.js delete mode 100644 staff/matias-sargo/ponies/cor/logic/updatePostCaption.test.js delete mode 100644 staff/matias-sargo/ponies/cor/util/generateId.js delete mode 100644 staff/matias-sargo/ponies/cor/util/validate.js delete mode 100644 staff/matias-sargo/ponies/web/home.html delete mode 100644 staff/matias-sargo/ponies/web/index.css delete mode 100644 staff/matias-sargo/ponies/web/index.js delete mode 100644 staff/matias-sargo/ponies/web/login-error.html delete mode 100644 staff/matias-sargo/ponies/web/login.html delete mode 100644 staff/matias-sargo/ponies/web/package-lock.json delete mode 100644 staff/matias-sargo/ponies/web/package.json delete mode 100644 staff/matias-sargo/ponies/web/register.html rename staff/matias-sargo/{ponies => project}/api/handlers/authenticateUserHandler.js (87%) create mode 100644 staff/matias-sargo/project/api/handlers/index.js create mode 100644 staff/matias-sargo/project/api/handlers/registerUserHandler.js create mode 100644 staff/matias-sargo/project/api/index.js rename staff/matias-sargo/{ponies => project}/api/middlewares/cors.js (100%) rename staff/matias-sargo/{ponies => project}/api/middlewares/errorHandler.js (93%) rename staff/matias-sargo/{ponies => project}/api/middlewares/index.js (99%) rename staff/matias-sargo/{ponies => project}/api/middlewares/jsonBodyParser.js (100%) rename staff/matias-sargo/{ponies => project}/api/middlewares/jwtVerifier.js (91%) rename staff/matias-sargo/{ponies => project}/api/package-lock.json (97%) rename staff/matias-sargo/{ponies => project}/api/package.json (95%) create mode 100644 staff/matias-sargo/project/api/test/authenticate-user.sh create mode 100644 staff/matias-sargo/project/api/test/register-user.sh create mode 100644 staff/matias-sargo/project/app/.gitignore create mode 100644 staff/matias-sargo/project/app/README.md rename staff/matias-sargo/{ponies/app/view => project/app}/context.js (100%) create mode 100644 staff/matias-sargo/project/app/eslint.config.js rename staff/matias-sargo/{ponies => project}/app/index.html (73%) create mode 100644 staff/matias-sargo/project/app/index.jsx rename staff/matias-sargo/{ponies/web/favicon.ico => project/app/logic/createProp.js} (100%) create mode 100644 staff/matias-sargo/project/app/logic/index.js rename staff/matias-sargo/{ponies => project}/app/logic/isUserLoggedIn.js (100%) rename staff/matias-sargo/{ponies => project}/app/logic/loginUser.js (95%) rename staff/matias-sargo/{ponies => project}/app/logic/registerUser.js (77%) rename staff/matias-sargo/{ponies => project}/app/package-lock.json (88%) rename staff/matias-sargo/{ponies => project}/app/package.json (65%) create mode 100644 staff/matias-sargo/project/app/postcss.config.js create mode 100644 staff/matias-sargo/project/app/public/vite.svg create mode 100644 staff/matias-sargo/project/app/src/assets/react.svg create mode 100644 staff/matias-sargo/project/app/src/index.css rename staff/matias-sargo/{ponies/app => project/app/src}/index.jsx (100%) rename staff/matias-sargo/{ponies => project}/app/tailwind.config.js (64%) rename staff/matias-sargo/{ponies => project}/app/view/App.jsx (87%) rename staff/matias-sargo/{ponies => project}/app/view/library/Button.jsx (100%) rename staff/matias-sargo/{ponies => project}/app/view/library/Container.jsx (100%) rename staff/matias-sargo/{ponies => project}/app/view/library/Form.jsx (100%) rename staff/matias-sargo/{ponies => project}/app/view/library/Heading.jsx (100%) rename staff/matias-sargo/{ponies => project}/app/view/library/Input.jsx (100%) rename staff/matias-sargo/{ponies => project}/app/view/library/Label.jsx (100%) rename staff/matias-sargo/{ponies => project}/app/view/library/Link.jsx (100%) rename staff/matias-sargo/{ponies => project}/app/view/login/index.jsx (97%) rename staff/matias-sargo/{ponies => project}/app/view/register/index.jsx (88%) rename staff/matias-sargo/{ponies => project}/app/vite.config.js (100%) rename staff/matias-sargo/{ponies => project}/com/errors.js (100%) rename staff/matias-sargo/{ponies => project}/com/index.js (100%) create mode 100644 staff/matias-sargo/project/com/package.json rename staff/matias-sargo/{ponies => project}/com/validate.js (100%) rename staff/matias-sargo/{ponies => project}/cor/data/index.js (100%) rename staff/matias-sargo/{ponies => project}/cor/data/models.js (89%) rename staff/matias-sargo/{ponies => project}/cor/index.js (100%) create mode 100644 staff/matias-sargo/project/cor/logic/authenicateUser.spec.js rename staff/matias-sargo/{ponies => project}/cor/logic/authenticateUser.js (100%) create mode 100644 staff/matias-sargo/project/cor/logic/authenticateUser.test.js create mode 100644 staff/matias-sargo/project/cor/logic/createProp.js create mode 100644 staff/matias-sargo/project/cor/logic/index.js create mode 100644 staff/matias-sargo/project/cor/logic/registerUser.js create mode 100644 staff/matias-sargo/project/cor/logic/registerUser.spec.js rename staff/matias-sargo/{ponies => project}/cor/logic/registerUser.test.js (77%) rename staff/matias-sargo/{ponies => project}/cor/package-lock.json (62%) rename staff/matias-sargo/{ponies => project}/cor/package.json (55%) create mode 100644 staff/matias-sargo/project/doc/README.md diff --git a/staff/matias-sargo/ponies/api/.env b/staff/matias-sargo/ponies/api/.env deleted file mode 100644 index cee3b31b8..000000000 --- a/staff/matias-sargo/ponies/api/.env +++ /dev/null @@ -1,3 +0,0 @@ -PORT = 8080 -MONGODB_URI = mongodb://127.0.0.1:27017/ponies -JWT_SECRET = stairway to heaven led zepp \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/.gitignore b/staff/matias-sargo/ponies/api/.gitignore deleted file mode 100644 index 8f7b39f43..000000000 --- a/staff/matias-sargo/ponies/api/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -!.env \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/createPostHandler.js b/staff/matias-sargo/ponies/api/handlers/createPostHandler.js deleted file mode 100644 index 29f66e9a7..000000000 --- a/staff/matias-sargo/ponies/api/handlers/createPostHandler.js +++ /dev/null @@ -1,15 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { userId } = req - - const { image, caption } = req.body - - try { - logic.createPost(userId, image, caption) - .then(() => res.status(201).send()) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/deletePostHandler.js b/staff/matias-sargo/ponies/api/handlers/deletePostHandler.js deleted file mode 100644 index 77b361c43..000000000 --- a/staff/matias-sargo/ponies/api/handlers/deletePostHandler.js +++ /dev/null @@ -1,15 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { userId } = req - - const { postId } = req.params - - try { - logic.deletePost(userId, postId) - .then(() => res.status(204).send()) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/getAllFavPostsHandler.js b/staff/matias-sargo/ponies/api/handlers/getAllFavPostsHandler.js deleted file mode 100644 index 824c5f097..000000000 --- a/staff/matias-sargo/ponies/api/handlers/getAllFavPostsHandler.js +++ /dev/null @@ -1,13 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { userId } = req - - try { - logic.getAllFavPosts(userId) - .then(posts => res.json(posts)) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/getAllPoniesPostsHandler.js b/staff/matias-sargo/ponies/api/handlers/getAllPoniesPostsHandler.js deleted file mode 100644 index aec59a951..000000000 --- a/staff/matias-sargo/ponies/api/handlers/getAllPoniesPostsHandler.js +++ /dev/null @@ -1,13 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { userId } = req - - try { - logic.getAllPoniesPosts(userId) - .then(posts => res.json(posts)) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/getAllPostsHandler.js b/staff/matias-sargo/ponies/api/handlers/getAllPostsHandler.js deleted file mode 100644 index f97df482d..000000000 --- a/staff/matias-sargo/ponies/api/handlers/getAllPostsHandler.js +++ /dev/null @@ -1,13 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { userId } = req - - try { - logic.getAllPosts(userId) - .then(posts => res.json(posts)) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/getUserNameHandler.js b/staff/matias-sargo/ponies/api/handlers/getUserNameHandler.js deleted file mode 100644 index d0f3e239a..000000000 --- a/staff/matias-sargo/ponies/api/handlers/getUserNameHandler.js +++ /dev/null @@ -1,15 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { userId } = req - - const { targetUserId } = req.params - - try { - logic.getUserName(userId, targetUserId) - .then(name => res.json(name)) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/index.js b/staff/matias-sargo/ponies/api/handlers/index.js deleted file mode 100644 index 053d5edc0..000000000 --- a/staff/matias-sargo/ponies/api/handlers/index.js +++ /dev/null @@ -1,29 +0,0 @@ -import registerUserHandler from './registerUserHandler.js' -import authenticateUserHandler from './authenticateUserHandler.js' -import getUserNameHandler from './getUserNameHandler.js' -import getAllPostsHandler from './getAllPostsHandler.js' -import getAllPoniesPostsHandler from './getAllPoniesPostsHandler.js' -import getAllFavPostsHandler from './getAllFavPostsHandler.js' -import createPostHandler from './createPostHandler.js' -import deletePostHandler from './deletePostHandler.js' -import toggleLikePostHandler from './toggleLikePostHandler.js' -import toggleFavPostHandler from './toggleFavPostHandler.js' -import toggleFollowUserHandler from './toggleFollowUserHandler.js' -import updatePostCaptionHandler from './updatePostCaptionHandler.js' -import searchPostsHandler from './searchPostsHandler.js' - -export { - registerUserHandler, - authenticateUserHandler, - getUserNameHandler, - getAllPostsHandler, - getAllPoniesPostsHandler, - getAllFavPostsHandler, - createPostHandler, - deletePostHandler, - toggleLikePostHandler, - toggleFavPostHandler, - toggleFollowUserHandler, - updatePostCaptionHandler, - searchPostsHandler -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/registerUserHandler.js b/staff/matias-sargo/ponies/api/handlers/registerUserHandler.js deleted file mode 100644 index b4ea5f725..000000000 --- a/staff/matias-sargo/ponies/api/handlers/registerUserHandler.js +++ /dev/null @@ -1,13 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { name, surname, email, username, password, passwordRepeat } = req.body - - try { - logic.registerUser(name, surname, email, username, password, passwordRepeat) - .then(() => res.status(201).send()) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/searchPostsHandler.js b/staff/matias-sargo/ponies/api/handlers/searchPostsHandler.js deleted file mode 100644 index 5d893e4ae..000000000 --- a/staff/matias-sargo/ponies/api/handlers/searchPostsHandler.js +++ /dev/null @@ -1,13 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { userId, query: { q } } = req - - try { - logic.searchPosts(userId, q) - .then(posts => res.json(posts)) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/toggleFavPostHandler.js b/staff/matias-sargo/ponies/api/handlers/toggleFavPostHandler.js deleted file mode 100644 index 3507a2c1a..000000000 --- a/staff/matias-sargo/ponies/api/handlers/toggleFavPostHandler.js +++ /dev/null @@ -1,15 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { userId } = req - - const { postId } = req.params - - try { - logic.toggleFavPost(userId, postId) - .then(() => res.status(204).send()) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/toggleFollowUserHandler.js b/staff/matias-sargo/ponies/api/handlers/toggleFollowUserHandler.js deleted file mode 100644 index 5ba6fae5b..000000000 --- a/staff/matias-sargo/ponies/api/handlers/toggleFollowUserHandler.js +++ /dev/null @@ -1,15 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { userId } = req - - const { targetUserId } = req.params - - try { - logic.toggleFollowUser(userId, targetUserId) - .then(() => res.status(204).send()) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/toggleLikePostHandler.js b/staff/matias-sargo/ponies/api/handlers/toggleLikePostHandler.js deleted file mode 100644 index cef8e5e7b..000000000 --- a/staff/matias-sargo/ponies/api/handlers/toggleLikePostHandler.js +++ /dev/null @@ -1,15 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { userId } = req - - const { postId } = req.params - - try { - logic.toggleLikePost(userId, postId) - .then(() => res.status(204).send()) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/handlers/updatePostCaptionHandler.js b/staff/matias-sargo/ponies/api/handlers/updatePostCaptionHandler.js deleted file mode 100644 index a313ff488..000000000 --- a/staff/matias-sargo/ponies/api/handlers/updatePostCaptionHandler.js +++ /dev/null @@ -1,17 +0,0 @@ -import { logic } from 'cor' - -export default (req, res, next) => { - const { userId } = req - - const { postId } = req.params - - const { caption } = req.body - - try { - logic.updatePostCaption(userId, postId, caption) - .then(() => res.status(204).send()) - .catch(error => next(error)) - } catch (error) { - next(error) - } -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/index.js b/staff/matias-sargo/ponies/api/index.js deleted file mode 100644 index 53b4b7d5f..000000000 --- a/staff/matias-sargo/ponies/api/index.js +++ /dev/null @@ -1,75 +0,0 @@ -import 'dotenv/config' -import express from 'express' - -import { mongoose } from 'cor' - -import { cors, jsonBodyParser, jwtVerifier, errorHandler } from './middlewares/index.js' -import { - registerUserHandler, - authenticateUserHandler, - getUserNameHandler, - getAllPostsHandler, - getAllPoniesPostsHandler, - getAllFavPostsHandler, - createPostHandler, - deletePostHandler, - toggleLikePostHandler, - toggleFavPostHandler, - toggleFollowUserHandler, - updatePostCaptionHandler, - searchPostsHandler -} from './handlers/index.js' - -mongoose.connect(process.env.MONGODB_URI) - .then(() => { - console.info(`API connected to ${process.env.MONGODB_URI}`) - - const api = express() - - api.use(cors) - - api.get('/', (req, res) => { - res.send('Hello, World!') - }) - - api.post('/users', jsonBodyParser, registerUserHandler) - - api.post('/users/auth', jsonBodyParser, authenticateUserHandler) - - api.get('/users/:targetUserId/name', jwtVerifier, getUserNameHandler) - - api.get('/posts', jwtVerifier, getAllPostsHandler) - - api.get('/posts/ponies', jwtVerifier, getAllPoniesPostsHandler) - - api.get('/posts/favs', jwtVerifier, getAllFavPostsHandler) - - api.post('/posts', jwtVerifier, jsonBodyParser, createPostHandler) - - api.delete('/posts/:postId', jwtVerifier, deletePostHandler) - - api.patch('/posts/:postId/likes', jwtVerifier, toggleLikePostHandler) - - api.patch('/posts/:postId/favs', jwtVerifier, toggleFavPostHandler) - - api.patch('/users/:targetUserId/follows', jwtVerifier, toggleFollowUserHandler) - - api.patch('/posts/:postId/caption', jwtVerifier, jsonBodyParser, updatePostCaptionHandler) - - api.get('/posts/search', jwtVerifier, searchPostsHandler) - - api.get('/colors/search', (req, res, next) => { - const colors = ['red', 'green', 'blue', 'violette', 'brown', 'yellow'] - - const { q } = req.query - - const filtered = colors.filter(color => color.includes(q)) - - res.json(filtered) - }) - - api.use(errorHandler) - - api.listen(process.env.PORT, () => console.info(`API listening on PORT ${process.env.PORT}`)) - }) - .catch(error => console.error(error)) \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/authenticate-user.sh b/staff/matias-sargo/ponies/api/test/authenticate-user.sh deleted file mode 100644 index 40432b9b2..000000000 --- a/staff/matias-sargo/ponies/api/test/authenticate-user.sh +++ /dev/null @@ -1 +0,0 @@ -curl -v http://localhost:8080/users/auth -X POST -d '{"username":"peterpan","password":"123123123"}' \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/create-post.sh b/staff/matias-sargo/ponies/api/test/create-post.sh deleted file mode 100644 index 34e302a9f..000000000 --- a/staff/matias-sargo/ponies/api/test/create-post.sh +++ /dev/null @@ -1 +0,0 @@ -curl -v http://localhost:8080/posts -X POST -d '{"image":"https://media.giphy.com/media/Ty9Sg8oHghPWg/giphy.gif?cid=790b7611k1isspkgnlxqcvk07kqq26fe137qherkek4mavvf&ep=v1_gifs_trending&rid=giphy.gif&ct=g","caption":"ok"}' -H "Authorization: Basic matif" \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/delete-post.sh b/staff/matias-sargo/ponies/api/test/delete-post.sh deleted file mode 100644 index 2c83ee259..000000000 --- a/staff/matias-sargo/ponies/api/test/delete-post.sh +++ /dev/null @@ -1 +0,0 @@ -curl -v http://localhost:8080/posts/fgefrmf1i00 -X DELETE -H "Authorization: Basic matif" \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/get-all-favs.sh b/staff/matias-sargo/ponies/api/test/get-all-favs.sh deleted file mode 100644 index b4e97ef97..000000000 --- a/staff/matias-sargo/ponies/api/test/get-all-favs.sh +++ /dev/null @@ -1 +0,0 @@ -curl -v http://localhost:8080/posts/favs -H "Authorization: Basic matif" \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/get-all-ponies-post.sh b/staff/matias-sargo/ponies/api/test/get-all-ponies-post.sh deleted file mode 100644 index e478263e3..000000000 --- a/staff/matias-sargo/ponies/api/test/get-all-ponies-post.sh +++ /dev/null @@ -1 +0,0 @@ -curl -v http://localhost:8080/posts/ponies -H "Authorization: Basic matif" \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/get-all-posts.sh b/staff/matias-sargo/ponies/api/test/get-all-posts.sh deleted file mode 100644 index b7645c7b0..000000000 --- a/staff/matias-sargo/ponies/api/test/get-all-posts.sh +++ /dev/null @@ -1 +0,0 @@ -curl -v http://localhost:8080/posts -H "Authorization: Basic matif" \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/get-user-name.sh b/staff/matias-sargo/ponies/api/test/get-user-name.sh deleted file mode 100644 index 71cc15260..000000000 --- a/staff/matias-sargo/ponies/api/test/get-user-name.sh +++ /dev/null @@ -1 +0,0 @@ -curl -v http://localhost:8080/users/maif/name -H "Authorization: Basic matif" \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/hello.sh b/staff/matias-sargo/ponies/api/test/hello.sh deleted file mode 100644 index 912eb9bbc..000000000 --- a/staff/matias-sargo/ponies/api/test/hello.sh +++ /dev/null @@ -1 +0,0 @@ -curl http://localhost:8080/hello -v \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/register-user.sh b/staff/matias-sargo/ponies/api/test/register-user.sh deleted file mode 100644 index 9861d0fcf..000000000 --- a/staff/matias-sargo/ponies/api/test/register-user.sh +++ /dev/null @@ -1,2 +0,0 @@ - -curl -v http://localhost:8080/users -X POST -d '{"name":"Peter","surname":"Pan","email":"peter@pan.com","username":"peterpan","password":"123123123","passwordRepeat":"123123123"}' -H "Content-Type: application/json" \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/search-post.sh b/staff/matias-sargo/ponies/api/test/search-post.sh deleted file mode 100644 index 1e9643490..000000000 --- a/staff/matias-sargo/ponies/api/test/search-post.sh +++ /dev/null @@ -1 +0,0 @@ -curl -v http://localhost:8080/posts/search?q=atomic -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmIwY2Y1ZDE0MGE0NWE5ZGI5MDI5ODkiLCJpYXQiOjE3MjI4NjM1MTV9.zr3Tpw38WhHIihC5xauMvSLzOembbDSvYF8WOXkLo7o" \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/toggle-fav-post.sh b/staff/matias-sargo/ponies/api/test/toggle-fav-post.sh deleted file mode 100644 index e5c4c5200..000000000 --- a/staff/matias-sargo/ponies/api/test/toggle-fav-post.sh +++ /dev/null @@ -1 +0,0 @@ -curl -v http://localhost:8080/posts/1ksy8z2bdn6o/favs -X PATCH -H "Authorization: Basic matif" \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/toggle-follow-user.sh b/staff/matias-sargo/ponies/api/test/toggle-follow-user.sh deleted file mode 100644 index 308d1ab8a..000000000 --- a/staff/matias-sargo/ponies/api/test/toggle-follow-user.sh +++ /dev/null @@ -1 +0,0 @@ -curl -v http://localhost:8080/users/nico/follows -X PATCH -H "Authorization: Basic matif" \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/toggle-like-post.sh b/staff/matias-sargo/ponies/api/test/toggle-like-post.sh deleted file mode 100644 index 0a06096e9..000000000 --- a/staff/matias-sargo/ponies/api/test/toggle-like-post.sh +++ /dev/null @@ -1 +0,0 @@ -curl -v http://localhost:8080/posts/1ksy8z2bdn6o/likes -X PATCH -H "Authorization: Basic matif" \ No newline at end of file diff --git a/staff/matias-sargo/ponies/api/test/validate.js b/staff/matias-sargo/ponies/api/test/validate.js deleted file mode 100644 index 24e23ac8d..000000000 --- a/staff/matias-sargo/ponies/api/test/validate.js +++ /dev/null @@ -1,60 +0,0 @@ -const USERNAME_REGEX = /^(?!.*\s{2})[a-zA-Z0-9._-]{4,16}$/ -const NAME_REGEX = /^(?!.*\s{2})[a-zA-Z ]{3,16}$/ -const EMAIL_REGEX = /^[a-z0-9._]+@[a-z0-9.-]{3,63}\.[a-z]{2,10}$/ - -function validateString(value, explain = 'Value') { - if (typeof value !== 'string') throw new TypeError(`${explain} is not a string`) -} - -function validateCallback(callback, explain = 'Callback') { - if (typeof callback !== 'function') throw new TypeError(`${explain} is not a function`) -} - -function validateObject(object, explain = 'Object') { - if (object === null || typeof object !== 'object' || object.constructor !== Object) throw new TypeError(`${explain} is not an object`) -} - -function validateUsername(username) { - validateString(username, 'username') - if (!USERNAME_REGEX.test(username)) throw new SyntaxError('Invalid username') -} - -function validatePassword(password) { - validateString(password, 'password') - if (password.trim().length < 8) throw new RangeError('Password length is lower than 8 character') - if (password.includes(' ')) throw new SyntaxError('Password has empty spaces') -} - -function validateName(name, explain = 'name') { - validateString(name, explain) - if (!NAME_REGEX.test(name)) throw new SyntaxError(`Invalid ${explain}`) -} - -function validateEmail(email) { - validateString(email, 'email') - if (!EMAIL_REGEX.test(email)) throw new SyntaxError('Invalid email') -} - -function validateImage(image, explain = 'image') { - validateString(image, 'image') - if (!image.startsWith('http')) throw new SyntaxError(`Invalid ${explain}`) -} - -function validatePostId(postId) { - validateString(postId, 'PostId') - if (postId.trim().length === 0) throw new Error('Invalid postId') -} - -const validate = { - callback: validateCallback, - object: validateObject, - username: validateUsername, - password: validatePassword, - name: validateName, - email: validateEmail, - image: validateImage, - string: validateString, - postId: validatePostId -} - -export default validate \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/.env b/staff/matias-sargo/ponies/app/.env deleted file mode 100644 index 59c1c1813..000000000 --- a/staff/matias-sargo/ponies/app/.env +++ /dev/null @@ -1 +0,0 @@ -VITE_API_URL = http://localhost:8080 \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/.eslintrc.cjs b/staff/matias-sargo/ponies/app/.eslintrc.cjs deleted file mode 100644 index 3e212e1d4..000000000 --- a/staff/matias-sargo/ponies/app/.eslintrc.cjs +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:react/recommended', - 'plugin:react/jsx-runtime', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, - settings: { react: { version: '18.2' } }, - plugins: ['react-refresh'], - rules: { - 'react/jsx-no-target-blank': 'off', - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/staff/matias-sargo/ponies/app/.gitignore b/staff/matias-sargo/ponies/app/.gitignore deleted file mode 100644 index 8f7b39f43..000000000 --- a/staff/matias-sargo/ponies/app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -!.env \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/README.md b/staff/matias-sargo/ponies/app/README.md deleted file mode 100644 index 37017f635..000000000 --- a/staff/matias-sargo/ponies/app/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# app - -## install - -```sh -$ npm i -``` - -## run - -```sh -$ npm start -``` - -## compile - -```sh -$ npm run build -``` \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/assets/img/horse-3-svgrepo-com.svg b/staff/matias-sargo/ponies/app/assets/img/horse-3-svgrepo-com.svg deleted file mode 100644 index 8ff0fe9f1..000000000 --- a/staff/matias-sargo/ponies/app/assets/img/horse-3-svgrepo-com.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/index.css b/staff/matias-sargo/ponies/app/index.css deleted file mode 100644 index ba4957586..000000000 --- a/staff/matias-sargo/ponies/app/index.css +++ /dev/null @@ -1,30 +0,0 @@ - -@tailwind base; -@tailwind components; -@tailwind utilities; - -.view { - display: flex; - flex-direction: column; - align-items: center; - gap: 1rem; - font-size: 1.1rem; -} - -.main { - margin-top: 4rem; - margin-bottom: 3rem; -} - -.view { - display: flex; - flex-direction: column; - align-items: center; - gap: 1rem; - font-size: 1.1rem; -} - -.main { - margin-top: 3.5rem; - margin-bottom: 3rem; -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/createPost.js b/staff/matias-sargo/ponies/app/logic/createPost.js deleted file mode 100644 index 41e4a089e..000000000 --- a/staff/matias-sargo/ponies/app/logic/createPost.js +++ /dev/null @@ -1,32 +0,0 @@ -import { validate, errors } from '../../com' - -const { SystemError } = errors - -export default (image, caption) => { - validate.url(image, 'image') - validate.string(caption, 'caption') - - return fetch(`${import.meta.env.VITE_API_URL}/posts`, { - method: 'POST', - headers: { - Authorization: `Bearer ${sessionStorage.token}`, - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ image, caption }) - }) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 201) return - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/deletePost.js b/staff/matias-sargo/ponies/app/logic/deletePost.js deleted file mode 100644 index 24feb86d8..000000000 --- a/staff/matias-sargo/ponies/app/logic/deletePost.js +++ /dev/null @@ -1,29 +0,0 @@ -import { validate, errors } from "../../com"; - -const { SystemError } = errors - -export default postId => { - validate.string(postId, 'postId') - - return fetch(`${import.meta.env.VITE_API_URL}/posts/${postId}`, { - method: 'DELETE', - headers: { - Authorization: `Bearer ${sessionStorage.token}` - } - }) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 204) return - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/getAllFavPosts.js b/staff/matias-sargo/ponies/app/logic/getAllFavPosts.js deleted file mode 100644 index e56d2b1a8..000000000 --- a/staff/matias-sargo/ponies/app/logic/getAllFavPosts.js +++ /dev/null @@ -1,28 +0,0 @@ -import { validate, errors } from "../../com"; - -const { SystemError } = errors - -export default () => { - return fetch(`${import.meta.env.VITE_API_URL}/posts/favs`, { - headers: { - Authorization: `Bearer ${sessionStorage.token}` - } - }) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 200) - return response.json() - .then(posts => posts) - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/getAllPoniesPosts.js b/staff/matias-sargo/ponies/app/logic/getAllPoniesPosts.js deleted file mode 100644 index 5fe9fd55d..000000000 --- a/staff/matias-sargo/ponies/app/logic/getAllPoniesPosts.js +++ /dev/null @@ -1,28 +0,0 @@ -import { validate, errors } from "../../com"; - -const { SystemError } = errors - -export default () => { - return fetch(`${import.meta.env.VITE_API_URL}/posts/ponies`, { - headers: { - Authorization: `Bearer ${sessionStorage.token}` - } - }) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 200) - return response.json() - .then(posts => posts) - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/getAllPosts.js b/staff/matias-sargo/ponies/app/logic/getAllPosts.js deleted file mode 100644 index 8d2358059..000000000 --- a/staff/matias-sargo/ponies/app/logic/getAllPosts.js +++ /dev/null @@ -1,28 +0,0 @@ -import { validate, errors } from "../../com"; - -const { SystemError } = errors - -export default () => { - return fetch(`${import.meta.env.VITE_API_URL}/posts`, { - headers: { - Authorization: `Bearer ${sessionStorage.token}` - } - }) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 200) - return response.json() - .then(posts => posts) - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/getUserId.js b/staff/matias-sargo/ponies/app/logic/getUserId.js deleted file mode 100644 index a3c51642d..000000000 --- a/staff/matias-sargo/ponies/app/logic/getUserId.js +++ /dev/null @@ -1,7 +0,0 @@ -import extractPayloadFromToken from '../util/extractPayloadFromToken' - -export default () => { - const { sub: userId } = extractPayloadFromToken(sessionStorage.token) - - return userId -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/getUserName.js b/staff/matias-sargo/ponies/app/logic/getUserName.js deleted file mode 100644 index 8bdf714d0..000000000 --- a/staff/matias-sargo/ponies/app/logic/getUserName.js +++ /dev/null @@ -1,32 +0,0 @@ -import { validate, errors } from "../../com"; - -const { SystemError } = errors - -import extractPayloadFromToken from '../util/extractPayloadFromToken' - -export default () => { - const { sub: username } = extractPayloadFromToken(sessionStorage.token) - - return fetch(`${import.meta.env.VITE_API_URL}/users/${username}/name`, { - headers: { - Authorization: `Bearer ${sessionStorage.token}` - } - }) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 200) - return response.json() - .then(name => name) - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/getUserUsername.js b/staff/matias-sargo/ponies/app/logic/getUserUsername.js deleted file mode 100644 index 4698ac045..000000000 --- a/staff/matias-sargo/ponies/app/logic/getUserUsername.js +++ /dev/null @@ -1,7 +0,0 @@ -import extractPayloadFromToken from '../util/extractPayloadFromToken' - -export default () => { - const { sub: username } = extractPayloadFromToken(sessionStorage.token) - - return username -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/index.js b/staff/matias-sargo/ponies/app/logic/index.js deleted file mode 100644 index 2984efe2f..000000000 --- a/staff/matias-sargo/ponies/app/logic/index.js +++ /dev/null @@ -1,37 +0,0 @@ -import getAllPosts from './getAllPosts.js' -import getUserName from './getUserName.js' -import getUserId from './getUserId.js' -import loginUser from './loginUser.js' -import logoutUser from './logoutUser.js' -import registerUser from './registerUser.js' -import toggleLikePost from './toggleLikePost.js' -import updatePostCaption from './updatePostCaption.js' -import createPost from './createPost.js' -import deletePost from './deletePost.js' -import toggleFavPost from './toggleFavPost.js' -import getAllFavPosts from './getAllFavPosts.js' -import toggleFollowUser from './toggleFollowUser.js' -import getAllPoniesPosts from './getAllPoniesPosts.js' -import isUserLoggedIn from './isUserLoggedIn.js' -import searchColors from './searchColors.js' - -const logic = { - getAllPosts, - getUserName, - getUserId, - loginUser, - logoutUser, - registerUser, - toggleLikePost, - updatePostCaption, - createPost, - deletePost, - toggleFavPost, - getAllFavPosts, - toggleFollowUser, - getAllPoniesPosts, - isUserLoggedIn, - searchColors -} - -export default logic \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/logoutUser.js b/staff/matias-sargo/ponies/app/logic/logoutUser.js deleted file mode 100644 index 678dcc8f8..000000000 --- a/staff/matias-sargo/ponies/app/logic/logoutUser.js +++ /dev/null @@ -1 +0,0 @@ -export default () => delete sessionStorage.token \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/searchColors.js b/staff/matias-sargo/ponies/app/logic/searchColors.js deleted file mode 100644 index fb91f505f..000000000 --- a/staff/matias-sargo/ponies/app/logic/searchColors.js +++ /dev/null @@ -1,26 +0,0 @@ -import { validate, errors } from '../../com' - -const { SystemError } = errors - -export default query => { - validate.string(query, 'query') - - return fetch(`${import.meta.env.VITE_API_URL}/colors/search?q=${query}`) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 200) - return response.json() - .then(colors => colors) - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/searchPosts.js b/staff/matias-sargo/ponies/app/logic/searchPosts.js deleted file mode 100644 index bd994712e..000000000 --- a/staff/matias-sargo/ponies/app/logic/searchPosts.js +++ /dev/null @@ -1,30 +0,0 @@ -import { validate, errors } from "../../com"; - -const { SystemError } = errors - -export default query => { - validate.string(query, 'query') - - return fetch(`${import.meta.env.VITE_API_URL}/posts/search?q=${query}`, { - headers: { - Authorization: `Bearer ${sessionStorage.token}` - } - }) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 200) - return response.json() - .then(posts => posts) - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/toggleFavPost.js b/staff/matias-sargo/ponies/app/logic/toggleFavPost.js deleted file mode 100644 index 9b600d043..000000000 --- a/staff/matias-sargo/ponies/app/logic/toggleFavPost.js +++ /dev/null @@ -1,29 +0,0 @@ -import { validate, errors } from "../../com"; - -const { SystemError } = errors - -export default postId => { - validate.string(postId, 'postId') - - return fetch(`${import.meta.env.VITE_API_URL}/posts/${postId}/favs`, { - method: 'PATCH', - headers: { - Authorization: `Bearer ${sessionStorage.token}` - } - }) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 204) return - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/toggleFollowUser.js b/staff/matias-sargo/ponies/app/logic/toggleFollowUser.js deleted file mode 100644 index b63a7252e..000000000 --- a/staff/matias-sargo/ponies/app/logic/toggleFollowUser.js +++ /dev/null @@ -1,29 +0,0 @@ -import { validate, errors } from "../../com"; - -const { SystemError } = errors - -export default targetUserId => { - validate.string(targetUserId, 'targetUserId') - - return fetch(`${import.meta.env.VITE_API_URL}/users/${targetUserId}/follows`, { - method: 'PATCH', - headers: { - Authorization: `Bearer ${sessionStorage.token}` - } - }) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 204) return - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/toggleLikePost.js b/staff/matias-sargo/ponies/app/logic/toggleLikePost.js deleted file mode 100644 index c925fd99c..000000000 --- a/staff/matias-sargo/ponies/app/logic/toggleLikePost.js +++ /dev/null @@ -1,29 +0,0 @@ -import { validate, errors } from "../../com"; - -const { SystemError } = errors - -export default postId => { - validate.string(postId, 'postId') - - return fetch(`${import.meta.env.VITE_API_URL}/posts/${postId}/likes`, { - method: 'PATCH', - headers: { - Authorization: `Bearer ${sessionStorage.token}` - } - }) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 204) return - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/logic/updatePostCaption.js b/staff/matias-sargo/ponies/app/logic/updatePostCaption.js deleted file mode 100644 index 8009d5211..000000000 --- a/staff/matias-sargo/ponies/app/logic/updatePostCaption.js +++ /dev/null @@ -1,32 +0,0 @@ -import { validate, errors } from "../../com"; - -const { SystemError } = errors - -export default (postId, caption) => { - validate.string(postId, 'postId') - validate.string(caption, 'caption') - - return fetch(`${import.meta.env.VITE_API_URL}/posts/${postId}/caption`, { - method: 'PATCH', - headers: { - Authorization: `Bearer ${sessionStorage.token}`, - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ caption }) - }) - .catch(error => { throw new SystemError(error.message) }) - .then(response => { - const { status } = response - - if (status === 204) return - - return response.json() - .then(body => { - const { error, message } = body - - const constructor = errors[error] - - throw new constructor(message) - }) - }) -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/postcss.config.js b/staff/matias-sargo/ponies/app/postcss.config.js deleted file mode 100644 index 2e7af2b7f..000000000 --- a/staff/matias-sargo/ponies/app/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/staff/matias-sargo/ponies/app/util/extractPayloadFromToken.js b/staff/matias-sargo/ponies/app/util/extractPayloadFromToken.js deleted file mode 100644 index 044aeb436..000000000 --- a/staff/matias-sargo/ponies/app/util/extractPayloadFromToken.js +++ /dev/null @@ -1,9 +0,0 @@ -export default token => { - const payloadB64 = token.slice(token.indexOf('.') + 1, token.lastIndexOf('.')) - - const payloadJSON = atob(payloadB64) - - const payload = JSON.parse(payloadJSON) - - return payload -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/util/formatTime.js b/staff/matias-sargo/ponies/app/util/formatTime.js deleted file mode 100644 index 1b4d2ab07..000000000 --- a/staff/matias-sargo/ponies/app/util/formatTime.js +++ /dev/null @@ -1,37 +0,0 @@ -function formatTime(date) { - const seconds = Math.round((Date.now() - date.getTime()) / 1000) - - if (seconds < 60) - return seconds + ' second' + (seconds === 1 ? '' : 's') - - const minutes = Math.round(seconds / 60) - - if (minutes < 60) - return minutes + ' minute' + (minutes === 1 ? '' : 's') - - const hours = Math.round(minutes / 60) - - if (hours < 24) - return hours + ' hour' + (hours === 1 ? '' : 's') - - const days = Math.round(hours / 24) - - if (days < 7) - return days + ' day' + (days === 1 ? '' : 's') - - const weeks = Math.round(days / 7) - - if (weeks < 4) - return weeks + ' week' + (weeks === 1 ? '' : 's') - - const months = Math.round(weeks / 4) - - if (months < 12) - return months + ' month' + (months === 1 ? '' : 's') - - const years = Math.round(months / 12) - - return years + ' year' + (years === 1 ? '' : 's') -} - -export default formatTime \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/util/image/apple-touch-icon.png b/staff/matias-sargo/ponies/app/util/image/apple-touch-icon.png deleted file mode 100644 index b12a83b22aa9eb56f6e277d6a67d8909874a0018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49772 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 z%0D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 z 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 diff --git a/staff/matias-sargo/ponies/app/view/common/Alert.jsx b/staff/matias-sargo/ponies/app/view/common/Alert.jsx deleted file mode 100644 index dbd6b9985..000000000 --- a/staff/matias-sargo/ponies/app/view/common/Alert.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import Button from '../library/Button' -import Paragraph from '../library/Paragraph' -import Container from '../library/Container' - -export default function Alert({ message, onAccept }) { - return <> - - - - - - {message} - - - - -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/common/Confirm.jsx b/staff/matias-sargo/ponies/app/view/common/Confirm.jsx deleted file mode 100644 index 819217046..000000000 --- a/staff/matias-sargo/ponies/app/view/common/Confirm.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import Button from '../library/Button' -import Paragraph from '../library/Paragraph' -import Container from '../library/Container' - -export default function Confirm({ message, onAccept, onCancel }) { - return <> - - - - - - {message} - - - - - -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/Avatar.jsx b/staff/matias-sargo/ponies/app/view/home/Avatar.jsx deleted file mode 100644 index 65b39dc2e..000000000 --- a/staff/matias-sargo/ponies/app/view/home/Avatar.jsx +++ /dev/null @@ -1,5 +0,0 @@ -import Image from '../library/Image' - -export default function Avatar({ url }) { - return -} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/CreatePost.jsx b/staff/matias-sargo/ponies/app/view/home/CreatePost.jsx deleted file mode 100644 index fe90f8a3a..000000000 --- a/staff/matias-sargo/ponies/app/view/home/CreatePost.jsx +++ /dev/null @@ -1,69 +0,0 @@ -import logic from '../../logic' - -import Heading from '../library/Heading' -import Form from '../library/Form' -import Input from '../library/Input' -import Label from '../library/Label' -import Button from '../library/Button' -import Container from '../library/Container' - -export default function CreatePost({ onPostCreated, onCancelCreatePost }) { - console.debug('CreatePost -> call') - - const handleCreatePostSubmit = event => { - console.debug('CreatePost -> handleCreatePostSubmit') - - event.preventDefault() - - const form = event.target - - const postImageInput = form['post-image-input'] - const postCaptionInput = form['post-caption-input'] - - const postImage = postImageInput.value - const postCaption = postCaptionInput.value - - try { - logic.createPost(postImage, postCaption) - .then(() => onPostCreated()) - .catch(error => { - console.error(error) - - alert(error.message) - }) - } catch (error) { - console.error(error) - - alert(error.message) - } - } - - const handleCancelCreatePostClick = () => { - console.debug('CreatePost -> handleCancelCreatePostClick') - - onCancelCreatePost() - } - - return
- Create Post - -
- - - - - - - - - - - - - - - - -
-
-} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/FavsPostList.jsx b/staff/matias-sargo/ponies/app/view/home/FavsPostList.jsx deleted file mode 100644 index b4b90c8a7..000000000 --- a/staff/matias-sargo/ponies/app/view/home/FavsPostList.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import logic from '../../logic' - -import { useState, useEffect } from 'react' - -import Post from './Post' - -export default function FavsPostList() { - console.debug('FavsPostList -> call') - - const [posts, setPosts] = useState([]) - - useEffect(() => { - console.debug('FavsPostList -> useEffect') - - loadPosts() - }, []) - - const handlePostDeleted = () => { - console.debug('FavsPostList -> handlePostDeleted') - - loadPosts() - } - - const handlePostEdited = () => { - console.debug('FavsPostList -> handlePostEdited') - - loadPosts() - } - - const handlePostLikeToggled = () => { - console.debug('FavsPostList -> handlePostLikeToggled') - - loadPosts() - } - - const handlePostFavToggled = () => { - console.debug('FavsPostList -> handlePostFavToggled') - - loadPosts() - } - - const handleUserFollowToggled = () => { - console.debug('FavsPostList -> handleUserFollowToggled') - - loadPosts() - } - - const loadPosts = () => { - try { - logic.getAllFavPosts() - .then(posts => setPosts(posts)) - .catch(error => { - console.error(error) - - alert(error.message) - }) - } catch (error) { - console.error(error) - - alert(error.message) - } - } - - return
- {posts.map(post => )} -
-} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/Footer.jsx b/staff/matias-sargo/ponies/app/view/home/Footer.jsx deleted file mode 100644 index 7e92b3b1e..000000000 --- a/staff/matias-sargo/ponies/app/view/home/Footer.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useState } from 'react' - -import CreatePost from './CreatePost' - -import Button from '../library/Button' - -export default function Footer({ onPostCreated }) { - console.debug('Footer -> call') - - const [createPostVisible, setCreatePostVisible] = useState(false) - - const handleCreatePostClick = () => { - console.debug('Footer -> handleCreatePostClick') - - setCreatePostVisible(true) - } - - const handleCancelCreatePostClick = () => { - console.debug('Footer -> handleCancelCreatePostClick') - - setCreatePostVisible(false) - } - - const handlePostCreated = () => { - setCreatePostVisible(false) - - onPostCreated() - } - - return
- - - {createPostVisible && } -
-} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/Header.jsx b/staff/matias-sargo/ponies/app/view/home/Header.jsx deleted file mode 100644 index c521706ff..000000000 --- a/staff/matias-sargo/ponies/app/view/home/Header.jsx +++ /dev/null @@ -1,85 +0,0 @@ -import logic from '../../logic' - -import { useState, useEffect } from 'react' - -import Button from '../library/Button' -import Paragraph from '../library/Paragraph' -import Container from '../library/Container' - -import Search from './Search' - -import useContext from '../context' - -export default function Header({ onHomeClick, onPoniesClick, onFavsClick, onLogout }) { - console.debug('Header -> call') - - const [name, setName] = useState(null) - - const { theme, setTheme } = useContext() - - useEffect(() => { - console.debug('Header -> useEffect') - - try { - logic.getUserName() - .then(name => setName(name)) - .catch(error => { - console.error(error) - - alert(error.message) - }) - } catch (error) { - console.error(error) - - alert(error.message) - } - }, []) - - const handleHomeClick = () => { - console.debug('Header -> handleHomeClick') - - onHomeClick() - } - - const handlePoniesClick = () => { - console.debug('Header -> handlePoniesClick') - - onPoniesClick() - } - - const handleFavsClick = () => { - console.debug('Header -> handleFavsClick') - - onFavsClick() - } - - const handleLogout = () => { - console.debug('Header -> handleLogout') - - try { - logic.logoutUser() - - onLogout() - } catch (error) { - console.error(error) - - alert(error.message) - } - } - - const handleSwitchTheme = () => setTheme(theme === 'dark' ? 'light' : 'dark') - - - return
- - - - {name} - - - - - - -
-} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/Hello.jsx b/staff/matias-sargo/ponies/app/view/home/Hello.jsx deleted file mode 100644 index 35d187923..000000000 --- a/staff/matias-sargo/ponies/app/view/home/Hello.jsx +++ /dev/null @@ -1,7 +0,0 @@ -import { useParams } from 'react-router-dom' - -export default () => { - const { to } = useParams() - - return

Hello, {to}!

-} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/PoniesPostList.jsx b/staff/matias-sargo/ponies/app/view/home/PoniesPostList.jsx deleted file mode 100644 index e6f9ac0a9..000000000 --- a/staff/matias-sargo/ponies/app/view/home/PoniesPostList.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import logic from '../../logic' - -import { useState, useEffect } from 'react' - -import Post from './Post' - -export default function PoniesPostList() { - console.debug('PoniesPostList -> call') - - const [posts, setPosts] = useState([]) - - useEffect(() => { - console.debug('PoniesPostList -> useEffect') - - loadPosts() - }, []) - - const handlePostDeleted = () => { - console.debug('PoniesPostList -> handlePostDeleted') - - loadPosts() - } - - const handlePostEdited = () => { - console.debug('PoniesPostList -> handlePostEdited') - - loadPosts() - } - - const handlePostLikeToggled = () => { - console.debug('PoniesPostList -> handlePostLikeToggled') - - loadPosts() - } - - const handlePostFavToggled = () => { - console.debug('PoniesPostList -> handlePostFavToggled') - - loadPosts() - } - - const handleUserFollowToggled = () => { - console.debug('PoniesPostList -> handleUserFollowToggled') - - loadPosts() - } - - const loadPosts = () => { - try { - logic.getAllPoniesPosts() - .then(posts => setPosts(posts)) - .catch(error => { - console.error(error) - - alert(error.message) - }) - } catch (error) { - console.error(error) - - alert(error.message) - } - } - - return
- {posts.map(post => )} -
-} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/Post.jsx b/staff/matias-sargo/ponies/app/view/home/Post.jsx deleted file mode 100644 index ffc59f58e..000000000 --- a/staff/matias-sargo/ponies/app/view/home/Post.jsx +++ /dev/null @@ -1,182 +0,0 @@ -import logic from '../../logic' - -import formatTime from '../../util/formatTime' - -import { useState } from 'react' - -import Button from '../library/Button' -import Input from '../library/Input' -import Label from '../library/Label' -import Form from '../library/Form' -import Time from '../library/Time' -import Image from '../library/Image' -import Paragraph from '../library/Paragraph' -import Heading from '../library/Heading' -import Container from '../library/Container' -import Confirm from '../common/Confirm' - -import Avatar from './Avatar' - -export default function Post({ post, onPostDeleted, onPostEdited, onPostFavToggled, onPostLikeToggled, onUserFollowToggled }) { - console.debug('Post -> call') - - const [editPostVisible, setEditPostVisible] = useState(false) - const [confirmMessage, setConfirmMessage] = useState(null) - - const handleDeletePostClick = () => setConfirmMessage('Delete Post?') - - const handleDeletePostAccept = () => { - try { - logic.deletePost(post.id) - .then(() => onPostDeleted()) - .catch(error => { - console.error(error) - - alert(error.message) - }) - } catch (error) { - console.error(error) - - alert(error.message) - } - } - - const handleDeletePostCancel = () => setConfirmMessage(null) - - - const handleEditPostClick = () => { - console.debug('Post -> handleEditPost') - - setEditPostVisible(true) - } - - const handleCancelEditPostClick = () => { - console.debug('Post -> handleCancelEditPostClick') - - setEditPostVisible(false) - } - - const handleEditPostSubmit = event => { - console.debug('Post -> handleEditPostSubmit') - - event.preventDefault() - - const form = event.target - - const editCaptionInput = form['edit-caption-input'] - - const newCaption = editCaptionInput.value - - try { - logic.updatePostCaption(post.id, newCaption) - .then(() => { - setEditPostVisible(false) - - onPostEdited() - }) - .catch(error => { - console.error(error) - - alert(error.message) - }) - } catch (error) { - console.error(error) - - alert(error.message) - } - } - - const handleLikePostClick = () => { - console.debug('Post -> handleLikePostClick') - - try { - logic.toggleLikePost(post.id) - .then(() => onPostLikeToggled()) - .catch(error => { - console.error(error) - - alert(error.message) - }) - } catch (error) { - console.error(error) - - alert(error.message) - } - } - - const handleFavPostClick = () => { - console.debug('Post -> handleFavPostClick') - - try { - logic.toggleFavPost(post.id) - .then(() => onPostFavToggled()) - .catch(error => { - console.error(error) - - alert(error.message) - }) - } catch (error) { - console.error(error) - - alert(error.message) - } - } - - const handleFollowUserClick = () => { - console.debug('Post -> handleFollowUserClick') - - try { - logic.toggleFollowUser(post.author.id) - .then(() => onUserFollowToggled()) - .catch(error => { - console.error(error) - - alert(error.message) - }) - } catch (error) { - console.error(error) - - alert(error.message) - } - } - - return
- - - - {post.author.username} - - - - - {post.caption} - - {post.caption} - - - - - - {post.author.id === logic.getUserId() && <> - - - } - - - - - {editPostVisible &&
- - - - - - - - - -
} - - {confirmMessage && } -
-} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/PostList.jsx b/staff/matias-sargo/ponies/app/view/home/PostList.jsx deleted file mode 100644 index ec6b168ec..000000000 --- a/staff/matias-sargo/ponies/app/view/home/PostList.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import logic from '../../logic' - -import { useState, useEffect } from 'react' - -import Post from './Post' - -export default function PostList({ refreshStamp }) { - console.debug('PostList -> call') - - const [posts, setPosts] = useState([]) - - useEffect(() => { - console.debug('PostList -> useEffect') - - loadPosts() - }, [refreshStamp]) - - const handlePostDeleted = () => { - console.debug('PostList -> handlePostDeleted') - - loadPosts() - } - - const handlePostEdited = () => { - console.debug('PostList -> handlePostEdited') - - loadPosts() - } - - const handlePostLikeToggled = () => { - console.debug('PostList -> handlePostLikeToggled') - - loadPosts() - } - - const handlePostFavToggled = () => { - console.debug('PostList -> handlePostFavToggled') - - loadPosts() - } - - const handleUserFollowToggled = () => { - console.debug('PostList -> handleUserFollowToggled') - - loadPosts() - } - - const loadPosts = () => { - try { - logic.getAllPosts() - .then(posts => setPosts(posts)) - .catch(error => { - console.error(error) - - alert(error.message) - }) - } catch (error) { - console.error(error) - - alert(error.message) - } - } - - return
- {posts.map(post => )} -
-} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/ResultsPostList.jsx b/staff/matias-sargo/ponies/app/view/home/ResultsPostList.jsx deleted file mode 100644 index a0802c877..000000000 --- a/staff/matias-sargo/ponies/app/view/home/ResultsPostList.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import { useState, useEffect } from 'react' -import { useSearchParams } from 'react-router-dom' - -import logic from '../../logic' - -import Post from './Post' - -export default function ResultsPostList({ refreshStamp }) { - console.debug('ResultsPostList -> call') - - const [searchParams] = useSearchParams() - - const q = searchParams.get('q') || '' - - const [posts, setPosts] = useState([]) - - useEffect(() => { - console.debug('ResultsPostList -> useEffect [refreshStamp, q]') - - loadPosts() - }, [refreshStamp, q]) - - const handlePostDeleted = () => { - console.debug('ResultsPostList -> handlePostDeleted') - - loadPosts() - } - - const handlePostEdited = () => { - console.debug('ResultsPostList -> handlePostEdited') - - loadPosts() - } - - const handlePostLikeToggled = () => { - console.debug('ResultsPostList -> handlePostLikeToggled') - - loadPosts() - } - - const handlePostFavToggled = () => { - console.debug('ResultsPostList -> handlePostFavToggled') - - loadPosts() - } - - const handleUserFollowToggled = () => { - console.debug('ResultsPostList -> handleUserFollowToggled') - - loadPosts() - } - - const loadPosts = () => { - try { - logic.searchPosts(q) - .then(posts => setPosts(posts)) - .catch(error => { - console.error(error) - - alert(error.message) - }) - } catch (error) { - console.error(error) - - alert(error.message) - } - } - - return
- {posts.map(post => )} -
-} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/Search.jsx b/staff/matias-sargo/ponies/app/view/home/Search.jsx deleted file mode 100644 index a7391ec6c..000000000 --- a/staff/matias-sargo/ponies/app/view/home/Search.jsx +++ /dev/null @@ -1,48 +0,0 @@ -import { useSearchParams, useNavigate, useLocation } from 'react-router-dom' -import { useEffect, useState } from 'react' - -import Form from '../library/Form' -import Input from '../library/Input' -import Button from '../library/Button' - -export default function Search() { - const navigate = useNavigate() - const location = useLocation() - const [searchParams, setSeachParams] = useSearchParams() - const [query, setQuery] = useState('') - - const q = searchParams.get('q') || '' - - useEffect(() => { - setQuery(q) - }, [q]) - - const handleSubmit = event => { - event.preventDefault() - - const form = event.target - - const { value: query } = form.q - - if (!query.trim()) - navigate('/search') - else if (location.pathname !== '/search') - navigate(`/search?q=${query}`) - else - setSeachParams({ q: query }) - - setQuery(query) - } - - const handleInputChange = event => { - const { value: query } = event.target - - setQuery(query) - } - - - return
- - -
-} \ No newline at end of file diff --git a/staff/matias-sargo/ponies/app/view/home/index.jsx b/staff/matias-sargo/ponies/app/view/home/index.jsx deleted file mode 100644 index 5e5ba8839..000000000 --- a/staff/matias-sargo/ponies/app/view/home/index.jsx +++ /dev/null @@ -1,69 +0,0 @@ -import { useState } from 'react' -import { Routes, Route, useNavigate } from 'react-router-dom' - -import Header from './Header' -import PostList from './PostList' -import Footer from './Footer' -import PoniesPostList from './PoniesPostList' -import FavsPostList from './FavsPostList' -import Hello from './Hello' -import ResultsPostList from './ResultsPostList' - - -export default function Home({ onLogout }) { - console.debug('Home -> call') - - const navigate = useNavigate() - - const [refreshStamp, setRefreshStamp] = useState(null) - - const handlePostCreated = () => { - console.debug('Home -> handlePostCreated') - - setRefreshStamp(Date.now()) - navigate('/') - } - - const handlePoniesClick = () => { - console.debug('Home -> handlePoniesClick') - - navigate('/ponies') - } - - const handleHomeClick = () => { - console.debug('Home -> handleHomeClick') - - navigate('/') - } - - const handleFavsClick = () => { - console.debug('Home -> handleFavsClick') - - navigate('/favs') - } - - return <> -
- -
- - } /> - - } /> - - } /> - - } /> - - } /> - -
- -