{"id":20636176,"url":"https://github.com/thejoltjoker/picterest","last_synced_at":"2026-04-11T12:01:35.318Z","repository":{"id":225487831,"uuid":"765630900","full_name":"thejoltjoker/picterest","owner":"thejoltjoker","description":"Full-stack app integrating Google Custom Search and Auth0 for user login, image search, and saving favorites. First assignment of FSU23D Integration course.","archived":false,"fork":false,"pushed_at":"2024-03-11T12:24:19.000Z","size":49027,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-16T08:35:12.945Z","etag":null,"topics":["api-integration","auth0","express","openapi","react","swagger","typescript","vite"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thejoltjoker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-03-01T10:00:19.000Z","updated_at":"2024-10-16T21:51:04.000Z","dependencies_parsed_at":"2024-03-10T14:42:02.720Z","dependency_job_id":null,"html_url":"https://github.com/thejoltjoker/picterest","commit_stats":null,"previous_names":["thejoltjoker/react-image-search","thejoltjoker/picterest"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/thejoltjoker/picterest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejoltjoker%2Fpicterest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejoltjoker%2Fpicterest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejoltjoker%2Fpicterest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejoltjoker%2Fpicterest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thejoltjoker","download_url":"https://codeload.github.com/thejoltjoker/picterest/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejoltjoker%2Fpicterest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31679484,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T08:18:19.405Z","status":"ssl_error","status_checked_at":"2026-04-11T08:17:08.892Z","response_time":54,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-integration","auth0","express","openapi","react","swagger","typescript","vite"],"created_at":"2024-11-16T15:09:31.010Z","updated_at":"2026-04-11T12:01:35.278Z","avatar_url":"https://github.com/thejoltjoker.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"client/public/picterest_desktop_search_02_light.png\" alt=\"Screenshot\"\u003e\n  \u003cbr/\u003e\n  Picterest\n\u003c/h1\u003e\n\n\u003ch4 align=\"center\"\u003eFullstack application integrating Google Custom Search and Auth0\u003c/h4\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#key-features\"\u003eKey Features\u003c/a\u003e •\n  \u003ca href=\"#how-to-use\"\u003eHow To Use\u003c/a\u003e •\n  \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e •\n  \u003ca href=\"#api-endpoints\"\u003eAPI Endpoints\u003c/a\u003e •\n  \u003ca href=\"#related\"\u003eRelated\u003c/a\u003e •\n  \u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\n\u003c/p\u003e\n\n## Key Features\n\n- User authentication with Google or GitHub accounts using Auth0.\n- Image search using Google Custom Search with suggestions for corrected search terms.\n- Display of search results and information about the search duration.\n- Ability to save favorite images to a user-specific list.\n- View a user's unique list of favorite images.\n- Light and dark theme.\n\n## How To Use\n\n### Installation\n\n### Automatic\n\n1. Clone the repository from [GitHub](https://github.com/thejoltjoker/picterest).\n2. Navigate to the project directory.\n3. Follow instructions to setup [client](./client/README.md) and [server](./server/README.md).\n4. Run `npm run setup` from project root directory.\n5. Run `npm start` from project root directory.\n   - Alternatively run `npm run dev` in client and server respectively.\n6. Navigate to http://localhost:5173 in your favorite browser to use the app.\n\n### Manual\n\n1. Clone the repository from [GitHub](https://github.com/thejoltjoker/picterest).\n2. Navigate to the project directory.\n3. Follow instructions to setup [client](./client/README.md) and [server](./server/README.md).\n4. Run `npm run dev` in `server` directory.\n5. Open a new terminal and run `npm run dev` in `client` directory.\n6. Navigate to http://localhost:5173 in your favorite browser to use the app.\n\n#### Client Setup\n\nFollow [client setup instructions in `client/README.md`](./client/README.md)\n\n#### Server Setup\n\nFollow [server setup instructions in `server/README.md`](./server/README.md)\n\n## API Endpoints\n  \n### User\n\n- `GET /api/user`: Get a user from the database.\n- `POST /api/user`: Create a user in the database.\n- `PUT /api/user/{userId}`: Update a user in the database.\n- `DELETE /api/user/{userId}`: Delete a user from the database.\n\n### Favorites\n\n- `GET /api/user/{userId}/favorites`: Get a user's favorites.\n- `POST /api/user/{userId}/favorites`: Create a new favorite for user.\n- `PUT /api/user/{userId}/favorites/{favoriteId}`: Update a favorite for user.\n- `DELETE /api/user/{userId}/favorites/{favoriteId}`: Delete a favorite for user.\n\n## Related\n\n- [FSU23D-integration](https://github.com/thejoltjoker/FSU23D-integration) - Repo for the  Systemstöd och Integration Course of FSU23D.\n\n### You may also like...\n\n- [SnapCat](https://github.com/thejoltjoker/snapcat) - Mock Social Media for Cats, Powered by React, TypeScript, React Router, Vite, and Tailwind CSS.\n- [React Todo App](https://github.com/thejoltjoker/react-todo-app) - A simple todo-list application built with React\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE).\n\n---\n\nChecklist for System Support and Integration 3-Part System - ImageSearch:\n\n[x] Create scripts to run both server and client\n\n**Klient (Client):**\n\n1. [x] Implement login functionality with Google or GitHub account using Auth0.\n2. [x] Enable searching for images with a maximum of 10 results when the user is logged in (Google Custom Search).\n3. [x] Implement a suggestion feature (\"Menade du…\") for misspelled search terms, allowing users to click on the corrected term for a new search.\n4. [x] Display the duration of the search process.\n5. [x] Allow users, when logged in, to save an image to their list of favorite pictures.\n6. [x] Provide a section on the page where users can view their list of favorite images.\n7. [x] Ensure that each user has a unique list of favorite images.\n\n**Server:**\n\n1. [x] Create a JSON file on the server to store a list of users and their favorite images.\n2. [x] Implement a server endpoint to save a favorite image, validating the data using Joi before saving.\n3. [x] Develop a server endpoint that responds with a list of favorite images for a specific user.\n4. [/] Define the data structure for the JSON file as specified:\n\n   ```json\n   [\n     {\n       \"user\": \"fakeuser\",\n       \"favoriteImages\": [\n         {\n           \"title\": \"faketitle\",\n           \"byteSize\": 2832098,\n           \"url\": \"http://……….\"\n         }\n       ]\n     }\n   ]\n   ```\n\n**Allmänt (General):**\n\n1. [ ] Submit the task on time.\n2. [x] Utilize Git and GitHub for version control.\n3. [x] Include a Readme with information on how to build the projects.\n4. [ ] Ensure that `node_modules` is not included in the submission.\n\n**Inlämning (Submission):**\n\n- [ ] Submit the project via the learning platform, either as a zip file or a link to the GitHub repository.\n\n**Additional Notes:**\n\n- [x] Ensure the application is headless with a React frontend and a Node (Express) backend.\n- [x] Implement the feature to suggest corrections for misspelled search terms.\n- [x] Verify that the server endpoint for saving favorite images works seamlessly with the specified data structure.\n- [x] Consider user authentication and authorization aspects for securing user-specific data.\n- [x] Test the entire application to ensure all specified functionalities are working as expected.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthejoltjoker%2Fpicterest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthejoltjoker%2Fpicterest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthejoltjoker%2Fpicterest/lists"}