├── part3 ├── Procfile ├── .eslintignore ├── .gitignore ├── README.md ├── package.json ├── .eslintrc.json └── models │ └── person.js ├── part4 └── bloglist │ ├── .eslintignore │ ├── .gitignore │ ├── utils │ ├── logger.js │ └── config.js │ ├── index.js │ ├── controllers │ ├── testing.js │ ├── login.js │ └── users.js │ ├── models │ ├── blog.js │ └── user.js │ ├── .eslintrc.json │ ├── package.json │ ├── app.js │ └── tests │ └── list_helper.js ├── part9 ├── flight-diary │ ├── backend │ │ ├── .eslintignore │ │ ├── .gitignore │ │ ├── tsconfig.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── types.ts │ │ │ ├── routes │ │ │ │ └── diaries.ts │ │ │ └── services │ │ │ │ └── diaryService.ts │ │ ├── package.json │ │ ├── .eslintrc │ │ └── data │ │ │ └── entries.ts │ └── frontend │ │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ │ ├── src │ │ ├── index.tsx │ │ └── types.ts │ │ ├── .gitignore │ │ ├── .eslintrc │ │ ├── tsconfig.json │ │ └── package.json ├── TypeScript First steps │ ├── .prettierrc │ ├── tsconfig.json │ ├── .gitignore │ ├── bmiCalculator.ts │ ├── package.json │ ├── .eslintrc │ └── index.ts ├── patientor │ ├── frontend │ │ ├── src │ │ │ ├── constants.ts │ │ │ ├── index.tsx │ │ │ ├── types.ts │ │ │ ├── services │ │ │ │ └── patients.ts │ │ │ └── components │ │ │ │ ├── AddPatientModal │ │ │ │ └── index.tsx │ │ │ │ ├── HealthRatingBar.tsx │ │ │ │ └── PatientInfoPage │ │ │ │ └── index.tsx │ │ ├── public │ │ │ ├── robots.txt │ │ │ ├── favicon.ico │ │ │ ├── logo192.png │ │ │ ├── logo512.png │ │ │ └── manifest.json │ │ ├── .gitignore │ │ ├── tsconfig.json │ │ ├── package.json │ │ └── README.md │ └── backend │ │ ├── src │ │ ├── routes │ │ │ ├── diagnoses.ts │ │ │ └── patients.ts │ │ ├── services │ │ │ ├── diagnoseService.ts │ │ │ └── patientService.ts │ │ ├── types.ts │ │ ├── index.ts │ │ └── data │ │ │ └── patients.ts │ │ ├── tsconfig.json │ │ ├── .gitignore │ │ ├── .eslintrc │ │ └── package.json └── create-react-app │ ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ └── manifest.json │ ├── src │ ├── components │ │ ├── Header.tsx │ │ ├── Total.tsx │ │ └── Content.tsx │ ├── index.tsx │ ├── types.ts │ └── App.tsx │ ├── .gitignore │ ├── .eslintrc │ ├── tsconfig.json │ └── package.json ├── .gitignore ├── part7 ├── bloglist │ ├── redux │ │ ├── bloglist-backend │ │ │ ├── .eslintignore │ │ │ ├── .gitignore │ │ │ ├── utils │ │ │ │ ├── logger.js │ │ │ │ └── config.js │ │ │ ├── index.js │ │ │ ├── controllers │ │ │ │ ├── testing.js │ │ │ │ ├── login.js │ │ │ │ └── users.js │ │ │ ├── models │ │ │ │ ├── blog.js │ │ │ │ └── user.js │ │ │ ├── .eslintrc.json │ │ │ ├── package.json │ │ │ ├── app.js │ │ │ └── tests │ │ │ │ └── list_helper.js │ │ └── bloglist-frontend │ │ │ ├── public │ │ │ ├── robots.txt │ │ │ ├── favicon.ico │ │ │ ├── logo192.png │ │ │ ├── logo512.png │ │ │ └── manifest.json │ │ │ ├── tailwind.config.js │ │ │ ├── src │ │ │ ├── components │ │ │ │ ├── Notification.js │ │ │ │ └── Blog.js │ │ │ ├── services │ │ │ │ ├── users.js │ │ │ │ ├── login.js │ │ │ │ └── blogs.js │ │ │ ├── reducers │ │ │ │ ├── userReducer.js │ │ │ │ ├── usersReducer.js │ │ │ │ ├── blogReducer.js │ │ │ │ └── notificationReducer.js │ │ │ ├── app.css │ │ │ ├── store.js │ │ │ ├── index.js │ │ │ └── tests │ │ │ │ ├── BlogForm.test.js │ │ │ │ └── Blog.test.js │ │ │ ├── .gitignore │ │ │ ├── .eslintrc.json │ │ │ └── package.json │ └── context-react-query │ │ ├── bloglist-backend │ │ ├── .eslintignore │ │ ├── .gitignore │ │ ├── utils │ │ │ ├── logger.js │ │ │ └── config.js │ │ ├── index.js │ │ ├── controllers │ │ │ ├── testing.js │ │ │ ├── login.js │ │ │ └── users.js │ │ ├── models │ │ │ ├── blog.js │ │ │ └── user.js │ │ ├── .eslintrc.json │ │ ├── package.json │ │ ├── app.js │ │ └── tests │ │ │ └── list_helper.js │ │ └── bloglist-frontend │ │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ │ ├── src │ │ ├── services │ │ │ ├── login.js │ │ │ └── blogs.js │ │ ├── app.css │ │ ├── index.js │ │ ├── loginContext.js │ │ ├── NotificationContext.js │ │ ├── tests │ │ │ ├── BlogForm.test.js │ │ │ └── Blog.test.js │ │ └── components │ │ │ └── BlogForm.js │ │ ├── .gitignore │ │ ├── .eslintrc.json │ │ └── package.json ├── country-hook │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ ├── src │ │ └── index.js │ ├── .gitignore │ └── package.json ├── ultimate-hooks │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ ├── src │ │ └── index.js │ ├── .gitignore │ ├── db.json │ └── package.json └── anecdotes-routed │ ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ └── manifest.json │ ├── src │ ├── index.js │ └── hooks │ │ └── index.js │ ├── .gitignore │ └── package.json ├── part0 ├── 0.4.png ├── 0.5.png └── 0.6.png ├── part2 ├── countries │ ├── .env │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ ├── src │ │ └── index.js │ ├── .gitignore │ └── package.json ├── courseinfo │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ ├── src │ │ ├── index.js │ │ ├── Course.js │ │ └── App.js │ ├── .gitignore │ └── package.json └── phonebook │ ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ └── manifest.json │ ├── src │ ├── index.js │ ├── app.css │ └── services │ │ └── persons.js │ ├── .gitignore │ ├── db.json │ └── package.json ├── part1 ├── anecdotes │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ ├── src │ │ └── index.js │ ├── .gitignore │ └── package.json ├── courseinfo │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ ├── src │ │ ├── index.js │ │ └── App.js │ ├── .gitignore │ └── package.json └── unicafe │ ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ └── manifest.json │ ├── src │ ├── index.js │ ├── setupTests.js │ ├── App.test.js │ ├── index.css │ ├── reportWebVitals.js │ └── App.css │ ├── .gitignore │ └── package.json ├── part6 ├── anecdotes-query │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ ├── .gitignore │ ├── src │ │ ├── components │ │ │ ├── Notification.js │ │ │ └── AnecdoteForm.js │ │ ├── requests.js │ │ ├── index.js │ │ └── NotificationContext.js │ ├── server.js │ └── package.json ├── anecdotes-redux │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ ├── src │ │ ├── index.js │ │ ├── components │ │ │ ├── Notification.js │ │ │ ├── Filter.js │ │ │ ├── AnecdoteForm.js │ │ │ └── AnecdoteList.js │ │ ├── reducers │ │ │ ├── filterReducer.js │ │ │ ├── notificationReducer.js │ │ │ └── anecdoteReducer.js │ │ ├── store.js │ │ ├── App.js │ │ └── services │ │ │ └── anecdotes.js │ ├── .gitignore │ ├── package.json │ └── db.json └── unicafe-redux │ ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ └── manifest.json │ ├── src │ ├── store.js │ ├── index.js │ └── reducer.js │ ├── .gitignore │ └── package.json ├── part5 └── bloglist-frontend │ ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ └── manifest.json │ ├── cypress │ ├── fixtures │ │ └── example.json │ └── support │ │ └── e2e.js │ ├── src │ ├── index.js │ ├── services │ │ ├── login.js │ │ └── blogs.js │ ├── app.css │ ├── tests │ │ ├── BlogForm.test.js │ │ └── Blog.test.js │ └── components │ │ └── BlogForm.js │ ├── cypress.config.js │ ├── .gitignore │ ├── .eslintrc.json │ └── package.json ├── part8 ├── library-frontend │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ ├── .gitignore │ ├── src │ │ ├── components │ │ │ ├── Authors.js │ │ │ ├── Recommend.js │ │ │ └── Login.js │ │ ├── index.js │ │ └── queries.js │ └── package.json └── library │ ├── .gitignore │ ├── models │ ├── author.js │ ├── user.js │ └── book.js │ └── package.json └── certificate ├── certificate-part5.png ├── certificate-part6.png ├── certificate-part7.png ├── certificate-part8.png └── certificate-part9.png /part3/Procfile: -------------------------------------------------------------------------------- 1 | web: node index.js -------------------------------------------------------------------------------- /part3/.eslintignore: -------------------------------------------------------------------------------- 1 | build 2 | .eslintrc.json -------------------------------------------------------------------------------- /part4/bloglist/.eslintignore: -------------------------------------------------------------------------------- 1 | build 2 | .eslintrc.json -------------------------------------------------------------------------------- /part9/flight-diary/backend/.eslintignore: -------------------------------------------------------------------------------- 1 | build 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .env 3 | .expo 4 | node_modules 5 | .idea -------------------------------------------------------------------------------- /part9/flight-diary/backend/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | build -------------------------------------------------------------------------------- /part4/bloglist/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /requests 3 | /build 4 | .env -------------------------------------------------------------------------------- /part9/TypeScript First steps/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true 3 | } 4 | -------------------------------------------------------------------------------- /part7/bloglist/redux/bloglist-backend/.eslintignore: -------------------------------------------------------------------------------- 1 | build 2 | .eslintrc.json -------------------------------------------------------------------------------- /part0/0.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part0/0.4.png -------------------------------------------------------------------------------- /part0/0.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part0/0.5.png -------------------------------------------------------------------------------- /part0/0.6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part0/0.6.png -------------------------------------------------------------------------------- /part2/countries/.env: -------------------------------------------------------------------------------- 1 | # .env 2 | 3 | REACT_APP_API_KEY=9357a7f2dceb6f8b6a955b425b798904 -------------------------------------------------------------------------------- /part7/bloglist/context-react-query/bloglist-backend/.eslintignore: -------------------------------------------------------------------------------- 1 | build 2 | .eslintrc.json -------------------------------------------------------------------------------- /part7/bloglist/redux/bloglist-backend/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /requests 3 | /build 4 | .env -------------------------------------------------------------------------------- /part9/patientor/frontend/src/constants.ts: -------------------------------------------------------------------------------- 1 | export const apiBaseUrl = "http://localhost:3001/api" 2 | -------------------------------------------------------------------------------- /part1/anecdotes/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part1/courseinfo/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part1/unicafe/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part2/countries/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part2/courseinfo/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part2/phonebook/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part7/bloglist/context-react-query/bloglist-backend/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /requests 3 | /build 4 | .env -------------------------------------------------------------------------------- /part6/anecdotes-query/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part6/anecdotes-redux/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part6/unicafe-redux/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part7/country-hook/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part7/ultimate-hooks/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part5/bloglist-frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part7/anecdotes-routed/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part8/library-frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part9/create-react-app/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part9/patientor/frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /certificate/certificate-part5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/certificate/certificate-part5.png -------------------------------------------------------------------------------- /certificate/certificate-part6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/certificate/certificate-part6.png -------------------------------------------------------------------------------- /certificate/certificate-part7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/certificate/certificate-part7.png -------------------------------------------------------------------------------- /certificate/certificate-part8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/certificate/certificate-part8.png -------------------------------------------------------------------------------- /certificate/certificate-part9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/certificate/certificate-part9.png -------------------------------------------------------------------------------- /part1/unicafe/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part1/unicafe/public/favicon.ico -------------------------------------------------------------------------------- /part1/unicafe/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part1/unicafe/public/logo192.png -------------------------------------------------------------------------------- /part1/unicafe/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part1/unicafe/public/logo512.png -------------------------------------------------------------------------------- /part9/flight-diary/frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part1/anecdotes/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part1/anecdotes/public/favicon.ico -------------------------------------------------------------------------------- /part1/anecdotes/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part1/anecdotes/public/logo192.png -------------------------------------------------------------------------------- /part1/anecdotes/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part1/anecdotes/public/logo512.png -------------------------------------------------------------------------------- /part1/courseinfo/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part1/courseinfo/public/favicon.ico -------------------------------------------------------------------------------- /part1/courseinfo/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part1/courseinfo/public/logo192.png -------------------------------------------------------------------------------- /part1/courseinfo/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part1/courseinfo/public/logo512.png -------------------------------------------------------------------------------- /part2/countries/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part2/countries/public/favicon.ico -------------------------------------------------------------------------------- /part2/countries/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part2/countries/public/logo192.png -------------------------------------------------------------------------------- /part2/countries/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part2/countries/public/logo512.png -------------------------------------------------------------------------------- /part2/courseinfo/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part2/courseinfo/public/favicon.ico -------------------------------------------------------------------------------- /part2/courseinfo/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part2/courseinfo/public/logo192.png -------------------------------------------------------------------------------- /part2/courseinfo/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part2/courseinfo/public/logo512.png -------------------------------------------------------------------------------- /part2/phonebook/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part2/phonebook/public/favicon.ico -------------------------------------------------------------------------------- /part2/phonebook/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part2/phonebook/public/logo192.png -------------------------------------------------------------------------------- /part2/phonebook/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part2/phonebook/public/logo512.png -------------------------------------------------------------------------------- /part6/unicafe-redux/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part6/unicafe-redux/public/favicon.ico -------------------------------------------------------------------------------- /part6/unicafe-redux/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part6/unicafe-redux/public/logo192.png -------------------------------------------------------------------------------- /part6/unicafe-redux/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part6/unicafe-redux/public/logo512.png -------------------------------------------------------------------------------- /part7/bloglist/redux/bloglist-frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part7/country-hook/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part7/country-hook/public/favicon.ico -------------------------------------------------------------------------------- /part7/country-hook/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part7/country-hook/public/logo192.png -------------------------------------------------------------------------------- /part7/country-hook/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part7/country-hook/public/logo512.png -------------------------------------------------------------------------------- /part6/anecdotes-query/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part6/anecdotes-query/public/favicon.ico -------------------------------------------------------------------------------- /part6/anecdotes-query/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part6/anecdotes-query/public/logo192.png -------------------------------------------------------------------------------- /part6/anecdotes-query/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part6/anecdotes-query/public/logo512.png -------------------------------------------------------------------------------- /part6/anecdotes-redux/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part6/anecdotes-redux/public/favicon.ico -------------------------------------------------------------------------------- /part6/anecdotes-redux/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part6/anecdotes-redux/public/logo192.png -------------------------------------------------------------------------------- /part6/anecdotes-redux/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part6/anecdotes-redux/public/logo512.png -------------------------------------------------------------------------------- /part7/anecdotes-routed/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part7/anecdotes-routed/public/favicon.ico -------------------------------------------------------------------------------- /part7/anecdotes-routed/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part7/anecdotes-routed/public/logo192.png -------------------------------------------------------------------------------- /part7/anecdotes-routed/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part7/anecdotes-routed/public/logo512.png -------------------------------------------------------------------------------- /part7/ultimate-hooks/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part7/ultimate-hooks/public/favicon.ico -------------------------------------------------------------------------------- /part7/ultimate-hooks/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part7/ultimate-hooks/public/logo192.png -------------------------------------------------------------------------------- /part7/ultimate-hooks/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part7/ultimate-hooks/public/logo512.png -------------------------------------------------------------------------------- /part8/library-frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part8/library-frontend/public/favicon.ico -------------------------------------------------------------------------------- /part8/library-frontend/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part8/library-frontend/public/logo192.png -------------------------------------------------------------------------------- /part8/library-frontend/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part8/library-frontend/public/logo512.png -------------------------------------------------------------------------------- /part9/create-react-app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part9/create-react-app/public/favicon.ico -------------------------------------------------------------------------------- /part9/create-react-app/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part9/create-react-app/public/logo192.png -------------------------------------------------------------------------------- /part9/create-react-app/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part9/create-react-app/public/logo512.png -------------------------------------------------------------------------------- /part5/bloglist-frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part5/bloglist-frontend/public/favicon.ico -------------------------------------------------------------------------------- /part5/bloglist-frontend/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part5/bloglist-frontend/public/logo192.png -------------------------------------------------------------------------------- /part5/bloglist-frontend/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part5/bloglist-frontend/public/logo512.png -------------------------------------------------------------------------------- /part9/patientor/frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part9/patientor/frontend/public/favicon.ico -------------------------------------------------------------------------------- /part9/patientor/frontend/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part9/patientor/frontend/public/logo192.png -------------------------------------------------------------------------------- /part9/patientor/frontend/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part9/patientor/frontend/public/logo512.png -------------------------------------------------------------------------------- /part7/bloglist/context-react-query/bloglist-frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /part9/flight-diary/frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part9/flight-diary/frontend/public/favicon.ico -------------------------------------------------------------------------------- /part9/flight-diary/frontend/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part9/flight-diary/frontend/public/logo192.png -------------------------------------------------------------------------------- /part9/flight-diary/frontend/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juanescacha/FullStackOpen/HEAD/part9/flight-diary/frontend/public/logo512.png -------------------------------------------------------------------------------- /part3/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /requests 6 | .env -------------------------------------------------------------------------------- /part9/create-react-app/src/components/Header.tsx: -------------------------------------------------------------------------------- 1 | const Header = ({ name }: { name: string }) => { 2 | return
6 | Number of exercises{" "} 7 | {courseParts.reduce((carry, part) => carry + part.exerciseCount, 0)} 8 |
9 | ) 10 | } 11 | 12 | export default Total 13 | -------------------------------------------------------------------------------- /part7/bloglist/context-react-query/bloglist-frontend/src/services/login.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios") 2 | const baseUrl = "/api/login" 3 | 4 | const login = async credentials => { 5 | const response = await axios.post(baseUrl, credentials) 6 | return response.data 7 | } 8 | 9 | const loginService = { login } 10 | 11 | export default loginService 12 | -------------------------------------------------------------------------------- /part7/bloglist/redux/bloglist-backend/index.js: -------------------------------------------------------------------------------- 1 | const app = require("./app") 2 | const http = require("http") 3 | const config = require("./utils/config") 4 | const logger = require("./utils/logger") 5 | 6 | const server = http.createServer(app) 7 | 8 | server.listen(config.PORT, () => { 9 | logger.info(`Server running on port ${config.PORT}`) 10 | }) 11 | -------------------------------------------------------------------------------- /part7/bloglist/context-react-query/bloglist-backend/index.js: -------------------------------------------------------------------------------- 1 | const app = require("./app") 2 | const http = require("http") 3 | const config = require("./utils/config") 4 | const logger = require("./utils/logger") 5 | 6 | const server = http.createServer(app) 7 | 8 | server.listen(config.PORT, () => { 9 | logger.info(`Server running on port ${config.PORT}`) 10 | }) 11 | -------------------------------------------------------------------------------- /part7/bloglist/redux/bloglist-frontend/src/reducers/userReducer.js: -------------------------------------------------------------------------------- 1 | import { createSlice } from "@reduxjs/toolkit" 2 | 3 | const userSlice = createSlice({ 4 | name: "user", 5 | initialState: null, 6 | reducers: { 7 | setUser: (state, action) => action.payload, 8 | }, 9 | }) 10 | 11 | export default userSlice.reducer 12 | export const { setUser } = userSlice.actions 13 | -------------------------------------------------------------------------------- /part7/bloglist/redux/bloglist-frontend/src/reducers/usersReducer.js: -------------------------------------------------------------------------------- 1 | import { createSlice } from "@reduxjs/toolkit" 2 | 3 | const usersSlice = createSlice({ 4 | name: "users", 5 | initialState: [], 6 | reducers: { 7 | setUsers: (state, action) => action.payload, 8 | }, 9 | }) 10 | 11 | export default usersSlice.reducer 12 | export const { setUsers } = usersSlice.actions 13 | -------------------------------------------------------------------------------- /part9/flight-diary/backend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES6", 4 | "outDir": "./build/", 5 | "module": "commonjs", 6 | "strict": true, 7 | "noUnusedLocals": true, 8 | "noUnusedParameters": true, 9 | "noImplicitReturns": true, 10 | "noFallthroughCasesInSwitch": true, 11 | "esModuleInterop": true, 12 | "resolveJsonModule": true 13 | } 14 | } -------------------------------------------------------------------------------- /part4/bloglist/controllers/testing.js: -------------------------------------------------------------------------------- 1 | const testingRouter = require("express").Router() 2 | const Blog = require("../models/blog") 3 | const User = require("../models/user") 4 | 5 | testingRouter.post("/reset", async (request, response) => { 6 | await Blog.deleteMany({}) 7 | await User.deleteMany({}) 8 | 9 | response.status(204).end() 10 | }) 11 | 12 | module.exports = testingRouter 13 | -------------------------------------------------------------------------------- /part7/anecdotes-routed/src/hooks/index.js: -------------------------------------------------------------------------------- 1 | import { useState } from "react" 2 | 3 | export const useField = type => { 4 | const [value, setValue] = useState("") 5 | 6 | const onChange = event => { 7 | setValue(event.target.value) 8 | } 9 | 10 | const onReset = () => { 11 | setValue("") 12 | } 13 | 14 | return { 15 | type, 16 | value, 17 | onChange, 18 | onReset, 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /part6/anecdotes-redux/src/components/Notification.js: -------------------------------------------------------------------------------- 1 | import { useSelector } from "react-redux" 2 | 3 | const Notification = () => { 4 | const notification = useSelector(state => state.notification) 5 | 6 | const style = { 7 | border: "solid", 8 | padding: 10, 9 | borderWidth: 1, 10 | } 11 | return notification &&11 | {part.name} {part.exercises} 12 |
13 | ); 14 | 15 | const Content = ({ parts }) => 16 | parts.map((part) =>| 24 | | born | 25 |books | 26 |
|---|---|---|
| {a.name} | 30 |{a.born} | 31 |{a.bookCount} | 32 |
{HEALTHBAR_TEXTS[rating]}
: null} 38 |Something went wrong...
27 | } 28 | 29 | return ( 30 |ssh: {patient.ssn}
33 |occupation: {patient.occupation}
34 |gender: {patient.gender}
35 || 30 | | author | 31 |published | 32 |
|---|---|---|
| {book.title} | 36 |{book.author.name} | 37 |{book.published} | 38 |
8 | {props.part.name} {props.part.exercises} 9 |
10 | ) 11 | } 12 | 13 | const Content = props => { 14 | return ( 15 |26 | Number of exercises{" "} 27 | {props.course.parts[0].exercises + 28 | props.course.parts[1].exercises + 29 | props.course.parts[2].exercises} 30 |
31 | ) 32 | } 33 | 34 | const App = () => { 35 | const course = { 36 | name: "Half Stack application development", 37 | parts: [ 38 | { 39 | name: "Fundamentals of React", 40 | exercises: 10, 41 | }, 42 | { 43 | name: "Using props to pass data", 44 | exercises: 7, 45 | }, 46 | { 47 | name: "State of a component", 48 | exercises: 14, 49 | }, 50 | ], 51 | } 52 | 53 | return ( 54 |
14 |
15 | {part.name} {part.exerciseCount}
16 |
17 |
18 | {part.description}
19 |
24 |
25 | {part.name} {part.exerciseCount}
26 |
27 |
28 | project exercises {part.groupProjectCount}
29 |
34 |
35 | {part.name} {part.exerciseCount}
36 |
37 |
38 | {part.description}
39 |
40 | {part.backgroundMaterial}
41 |
46 |
47 | {part.name} {part.exerciseCount}
48 |
49 |
50 | {part.description}
51 | {part.requirements && part.requirements.join(", ")}
52 |