From e962ffbb571138533a48a1da3592e4b0ad803fd0 Mon Sep 17 00:00:00 2001 From: Othmane Ataallah Date: Thu, 23 Jul 2026 14:15:16 +0200 Subject: [PATCH] Update Resources --- Resources.md | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 185 insertions(+), 1 deletion(-) diff --git a/Resources.md b/Resources.md index 5d08b7b..0376d8d 100644 --- a/Resources.md +++ b/Resources.md @@ -1 +1,185 @@ -Welcome to the Wiki. \ No newline at end of file +# Learning Resources + +*Curated for OUR stack β€” every dependency in the three projects has its reference here. +Found something great? Add it (this is a wiki). Found a dead link? Fix it.* + +## How to use this page (read first) + +1. **Project docs beat external docs.** Your repo's `README.md` + `ARCHITECTURE.md` answer + "how do WE do it" β€” external links answer "how does the tool work". Read in that order. +2. Three kinds of links: πŸŽ“ **Learn** (sit down and do it once, early) Β· πŸ“– **Reference** + (bookmark, open when stuck) Β· πŸŽ₯ **Watch** (background learning, commutes). +3. **Timebox learning.** πŸŽ“ items say roughly how long they deserve. You are paid to build + with 70% understanding, not to reach 100% before starting β€” the issues are designed for that. +4. The **30-minute rule** applies to being stuck on docs too. And when you ask, ask well: + [How do I ask a good question?](https://stackoverflow.com/help/how-to-ask) β€” what you tried, + exact error, minimal example. (Same format as our bug template. Not a coincidence.) +5. French speakers: [OpenClassrooms](https://openclassrooms.com) and + [Grafikart](https://grafikart.fr) mirror many fundamentals in French β€” fine as a first pass, + but the canonical docs below stay the reference. + +--- + +## 🧰 Everyone (shared foundations) + +| | Resource | Why | +|---|---|---| +| πŸŽ“ | [Learn Git Branching](https://learngitbranching.js.org) *(2–3h, interactive)* | Branching/rebasing finally clicks β€” do levels 1–4 + "Moving work around" | +| πŸŽ“ | [Pro Git book β€” ch. 2 & 3](https://git-scm.com/book) *(2h)* | The mental model under our git-strategy.md | +| πŸ“– | [Conventional Commits](https://www.conventionalcommits.org) | Our commit format, one page | +| πŸ“– | [Dangit, Git!?](https://dangitgit.com) | "I did the wrong git thing" β†’ the fix, recipe-style | +| πŸŽ“ | [MDN β€” HTTP overview](https://developer.mozilla.org/en-US/docs/Web/HTTP) *(1h)* | Methods, headers, cookies β€” the vocabulary of our API | +| πŸ“– | [MDN β€” HTTP status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) | What 401 vs 403 vs 409 vs 422 mean (our spec uses them precisely) | +| πŸŽ“ | [JWT introduction](https://jwt.io/introduction) *(30min)* | What's inside our access tokens; paste one in the debugger | +| πŸ“– | [learn.openapis.org](https://learn.openapis.org) + the API's own Swagger UI (`/api/v1/swagger-ui.html`, springdoc) | Reading `openapi.yaml` fluently β€” it's the contract | +| πŸŽ“ | [PostgreSQL Tutorial](https://www.postgresqltutorial.com) *(pick per need)* + [pgexercises](https://pgexercises.com) *(practice)* | SQL you'll actually meet; API dev goes deepest, everyone benefits | +| πŸ“– | [PostgreSQL manual](https://www.postgresql.org/docs/current/) | The authority when the tutorial isn't enough | + +--- + +## β˜• API dev β€” Java 25 Β· Spring Boot 4.1 Β· PostgreSQL + +**Week-1 path (in order):** + +1. πŸŽ“ [dev.java β€” Learn Java](https://dev.java/learn/) *(refresh selectively: records, streams, optionals β€” 3–4h)* +2. πŸŽ“ [Spring Academy](https://spring.academy) β€” free "Building a REST API with Spring Boot" course *(4–6h; the single best Spring on-ramp)* +3. πŸŽ“ [Spring guide: Building REST services](https://spring.io/guides) *(1h, hands-on)* +4. πŸŽ“ Our starter's auth code + tests (the code-tour issue) β€” with the + [Spring Security reference](https://docs.spring.io/spring-security/reference/) open beside it +5. πŸŽ“ [Baeldung β€” Spring Boot series](https://www.baeldung.com/spring-boot) *(skim the index; read per need)* + +**The shelf β€” one row per thing in `pom.xml`:** + +| Dependency | Reference | +|---|---| +| Spring Boot 4.1 (web, validation) | [Boot reference docs](https://docs.spring.io/spring-boot/) Β· most tutorials online still show Boot 3 β€” for our usage they're ~identical; when something differs, check the [Boot release notes/wiki](https://github.com/spring-projects/spring-boot/wiki) | +| Spring Security + jjwt | [Security reference](https://docs.spring.io/spring-security/reference/) Β· [Baeldung Security](https://www.baeldung.com/security-spring) Β· [jjwt README](https://github.com/jwtk/jjwt) | +| Spring Data JPA / Hibernate | [Data JPA reference](https://docs.spring.io/spring-data/jpa/reference/) Β· [Baeldung JPA](https://www.baeldung.com/learn-jpa-hibernate) Β· perf & N+1: [Vlad Mihalcea](https://vladmihalcea.com) | +| Flyway | [Flyway docs](https://documentation.red-gate.com/flyway) | +| MapStruct | [MapStruct reference](https://mapstruct.org/documentation/) β€” esp. "unmapped target policy"; our mappers live at the DTO edge | +| Lombok | [Feature list](https://projectlombok.org/features/) β€” we use the boring ones (@Getter/@Builder/@RequiredArgsConstructor); ask before exotic ones | +| springdoc-openapi | [springdoc.org](https://springdoc.org) β€” annotations that keep Swagger UI honest | +| Spring Data Redis | [Data Redis reference](https://docs.spring.io/spring-data/redis/reference/) Β· [Redis docs](https://redis.io/docs/latest/) | +| WebSocket / STOMP | [Spring guide: STOMP messaging](https://spring.io/guides/gs/messaging-stomp-websocket/) Β· [Framework WebSocket reference](https://docs.spring.io/spring-framework/reference/web/websocket.html) | +| Mail + Thymeleaf (email templates) | [Baeldung: Spring email](https://www.baeldung.com/spring-email) Β· [Thymeleaf docs](https://www.thymeleaf.org/documentation.html) | +| AWS SDK S3 (MinIO) | [AWS SDK for Java v2 guide](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/) Β· [MinIO docs](https://min.io/docs/) (S3-compatible β€” same SDK, custom endpoint) | +| Testcontainers | [java.testcontainers.org](https://java.testcontainers.org) + Boot's `@ServiceConnection` support in the [Boot testing docs](https://docs.spring.io/spring-boot/) | +| Actuator | Boot reference β†’ Actuator chapter (health/metrics endpoints) | + +**When stuck on… β†’ look here:** + +| Milestone problem | Resource | +|---|---| +| M1–M2 Β· error handling / @RestControllerAdvice | [Baeldung: error handling for REST](https://www.baeldung.com/exception-handling-for-rest-with-spring) | +| M2 Β· pagination & filtering | Data JPA reference β†’ `Pageable`/`Specification` Β· [Baeldung: REST pagination](https://www.baeldung.com/rest-api-pagination-in-spring) | +| M3 Β· JPA relationships (assignments, comments, tags) | [Baeldung JPA](https://www.baeldung.com/learn-jpa-hibernate) relationship articles + Vlad on `@ManyToMany` pitfalls | +| M4 Β· dates, timezones, recurrence | dev.java Date-Time trail Β· we store `TIMESTAMPTZ` + `OffsetDateTime`, always | +| M5 Β· overlap/conflict constraints | [PostgreSQL exclusion constraints](https://www.postgresql.org/docs/current/ddl-constraints.html) (`EXCLUDE USING gist`) β€” issue API-33 | +| M6 Β· slow queries / N+1 | [Vlad Mihalcea](https://vladmihalcea.com) β€” N+1 detection & fixes | + +πŸŽ₯ Background: [Amigoscode](https://www.youtube.com/@amigoscode) (Spring Boot full courses) Β· +[Dan Vega](https://www.youtube.com/@DanVega) (short, current Spring topics) Β· +[SpringDeveloper](https://www.youtube.com/@SpringSourceDev) (official) + +--- + +## βš›οΈ Web dev β€” React 19 Β· TypeScript Β· Tailwind 4 Β· shadcn/ui + +**Week-1 path (in order):** + +1. πŸŽ“ [react.dev β€” Learn](https://react.dev/learn) *(the "Describing/Adding Interactivity/Managing State" chapters β€” 4–6h; skip what you know)* +2. πŸŽ“ [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/intro.html) *(2–3h)* + πŸ“– [React TypeScript Cheatsheet](https://react-typescript-cheatsheet.netlify.app) +3. πŸŽ“ [TanStack Query β€” quick start + "Important defaults"](https://tanstack.com/query/latest) *(2h)* then πŸ“– [TkDodo's Practical React Query](https://tkdodo.eu/blog/practical-react-query) *(the canonical deep dive β€” read over the first weeks)* +4. πŸŽ“ [Tailwind docs β€” core concepts](https://tailwindcss.com/docs) *(2h: utility-first, states, responsive)* + how [shadcn/ui](https://ui.shadcn.com/docs) components come into the repo (they're copied in, not installed β€” read "Introduction") +5. πŸŽ“ Our starter's `api/client.ts` + `AuthContext` with the README's auth-flow section + +**The shelf β€” one row per thing in `package.json`:** + +| Dependency | Reference | +|---|---| +| React 19 | [react.dev](https://react.dev) β€” reference tab for every hook | +| React Router 7 | [reactrouter.com](https://reactrouter.com) | +| TanStack Query 5 | [tanstack.com/query](https://tanstack.com/query/latest) Β· [TkDodo's blog](https://tkdodo.eu/blog/practical-react-query) | +| zustand | [zustand docs](https://zustand.docs.pmnd.rs) β€” CLIENT state only; server data stays in Query (see ARCHITECTURE.md) | +| axios | [axios-http.com/docs](https://axios-http.com/docs/intro) β€” but go through OUR `api/client.ts`, never raw | +| react-hook-form + zod + @hookform/resolvers | [react-hook-form.com](https://react-hook-form.com) Β· [zod.dev](https://zod.dev) β€” schema per form, server `details[]` mapped to fields | +| Tailwind CSS 4 (+ tailwind-merge, tw-animate-css, prettier plugin) | [tailwindcss.com/docs](https://tailwindcss.com/docs) | +| shadcn/ui + radix-ui + cva + clsx + lucide | [ui.shadcn.com](https://ui.shadcn.com/docs) Β· [Radix primitives](https://www.radix-ui.com/primitives) (a11y behavior under shadcn) Β· [cva](https://cva.style) Β· [lucide.dev](https://lucide.dev) | +| FullCalendar (react, daygrid, timegrid, list, interaction) | [fullcalendar.io/docs/react](https://fullcalendar.io/docs/react) β€” M4's workhorse | +| dnd-kit | [docs.dndkit.com](https://docs.dndkit.com) β€” task board drag & drop | +| recharts | [recharts.org](https://recharts.org) β€” M6 dashboards | +| date-fns 4 | [date-fns.org](https://date-fns.org) β€” format at render time only | +| @stomp/stompjs + sockjs | [stomp-js docs](https://stomp-js.github.io) β€” live notifications; topic names come from the API dev | +| motion Β· sonner Β· input-otp Β· fontsource | [motion.dev](https://motion.dev) Β· [sonner](https://sonner.emilkowal.ski) Β· [input-otp](https://input-otp.rodz.dev) Β· [fontsource.org](https://fontsource.org) | +| openapi-typescript | [openapi-ts.dev](https://openapi-ts.dev) β€” `npm run generate:api` regenerates types from the spec; NEVER edit `api.generated.ts` by hand | +| vitest + Testing Library | [vitest.dev](https://vitest.dev) Β· [testing-library.com](https://testing-library.com/docs/react-testing-library/intro/) | +| eslint + prettier + husky + lint-staged | [eslint.org](https://eslint.org/docs/latest/) Β· [prettier.io](https://prettier.io/docs/) Β· [husky](https://typicode.github.io/husky/) β€” pre-wired; format-on-save and forget | + +**When stuck on… β†’ look here:** + +| Milestone problem | Resource | +|---|---| +| M1 Β· layout/CSS fundamentals under Tailwind | [web.dev β€” Learn CSS](https://web.dev/learn/css) Β· [Josh Comeau's blog](https://www.joshwcomeau.com) (flexbox/grid mental models) | +| M2 Β· complex forms & validation UX | react-hook-form docs + zod; server-error mapping pattern in ARCHITECTURE.md Β§4 | +| M3 Β· lists: filters, pagination, cache invalidation | TanStack Query docs (paginated queries) + TkDodo on query keys | +| M4 Β· calendar views & date math | FullCalendar react docs Β· date-fns | +| M4 Β· live notifications | stomp-js docs + the API's WebSocket topic contract (ask, don't guess) | +| M6 Β· charts | recharts examples gallery | +| JS fundamentals gap (closures, promises, async) | [javascript.info](https://javascript.info) β€” best JS course on the internet, free | + +--- + +## πŸ“± Mobile dev β€” Flutter Β· Riverpod 3 Β· codegen + +**Week-1 path (in order):** + +1. πŸŽ“ [Dart language docs](https://dart.dev/language) *(3–4h if Dart is new β€” null safety, futures/async, pattern matching)* +2. πŸŽ“ [Flutter docs β€” get started + first codelab](https://docs.flutter.dev) *(3h)* Β· keep the [cookbook](https://docs.flutter.dev/cookbook) bookmarked +3. πŸŽ“ [Riverpod docs](https://riverpod.dev) *("Getting started" β†’ "Providers" β†’ the annotation/codegen pages β€” 4h; this is our state management, learn it properly)* +4. πŸŽ“ The codegen trio we use everywhere β€” [freezed](https://pub.dev/packages/freezed) (models), [json_serializable](https://docs.flutter.dev/data-and-backend/serialization/json) (fromJson), [retrofit](https://pub.dev/packages/retrofit) (API client) β€” *(2h reading + keep `dart run build_runner watch --delete-conflicting-outputs` running while you code)* +5. πŸŽ“ [go_router](https://pub.dev/packages/go_router) *(1–2h: routes, ShellRoute for the bottom nav, redirect for the auth guard)* + +**The shelf β€” one row per group in `pubspec.yaml`:** + +| Dependency | Reference | +|---|---| +| flutter_riverpod + riverpod_annotation/generator | [riverpod.dev](https://riverpod.dev) β€” providers, `AsyncValue`, codegen syntax | +| freezed + json_annotation/serializable + build_runner | [freezed](https://pub.dev/packages/freezed) Β· [JSON serialization guide](https://docs.flutter.dev/data-and-backend/serialization/json) Β· [build_runner](https://dart.dev/tools/build_runner) | +| dio + retrofit + connectivity_plus | [dio](https://pub.dev/packages/dio) Β· [retrofit](https://pub.dev/packages/retrofit) Β· [connectivity_plus](https://pub.dev/packages/connectivity_plus) | +| go_router + app_links (deep links) | [go_router](https://pub.dev/packages/go_router) Β· [Flutter deep linking](https://docs.flutter.dev/ui/navigation/deep-linking) Β· [app_links](https://pub.dev/packages/app_links) | +| flutter_secure_storage + jwt_decoder + local_auth | [flutter_secure_storage](https://pub.dev/packages/flutter_secure_storage) Β· [jwt_decoder](https://pub.dev/packages/jwt_decoder) Β· [local_auth](https://pub.dev/packages/local_auth) (biometrics) | +| firebase_core + firebase_messaging + flutter_local_notifications | [Firebase Flutter setup](https://firebase.google.com/docs/flutter/setup) Β· [FCM for Flutter](https://firebase.google.com/docs/cloud-messaging/flutter/client) Β· [flutter_local_notifications](https://pub.dev/packages/flutter_local_notifications) | +| stomp_dart_client | [stomp_dart_client](https://pub.dev/packages/stomp_dart_client) β€” in-app realtime; topic names from the API dev | +| drift (+ drift_dev) + shared_preferences | [drift docs](https://drift.simonbinder.eu) (local DB) Β· [shared_preferences](https://pub.dev/packages/shared_preferences) | +| table_calendar Β· fl_chart | [table_calendar](https://pub.dev/packages/table_calendar) (M4 agenda) Β· [fl_chart](https://pub.dev/packages/fl_chart) (M6 dashboards) | +| reactive_forms Β· omni_datetime_picker Β· input pickers | [reactive_forms](https://pub.dev/packages/reactive_forms) Β· [omni_datetime_picker](https://pub.dev/packages/omni_datetime_picker) Β· [image_picker](https://pub.dev/packages/image_picker) / [file_picker](https://pub.dev/packages/file_picker) / [open_filex](https://pub.dev/packages/open_filex) | +| infinite_scroll_pagination Β· flutter_slidable Β· reorderable_grid | [infinite_scroll_pagination](https://pub.dev/packages/infinite_scroll_pagination) (M3 lists) Β· [flutter_slidable](https://pub.dev/packages/flutter_slidable) Β· [reorderable_grid](https://pub.dev/packages/reorderable_grid) | +| UI polish: google_fonts, flutter_svg, cached_network_image, shimmer, flutter_animate, toastification | their [pub.dev](https://pub.dev) pages β€” README + example tab is the doc | +| intl Β· dartz Β· dotenv Β· device/package_info | [intl](https://pub.dev/packages/intl) Β· [dartz](https://pub.dev/packages/dartz) (`Either` for errors β€” copy the pattern already in the codebase) Β· [flutter_dotenv](https://pub.dev/packages/flutter_dotenv) | +| Material 3 | [m3.material.io](https://m3.material.io) β€” the design language under our theme | + +**When stuck on… β†’ look here:** + +| Milestone problem | Resource | +|---|---| +| M1 Β· nav shell, auth guard | go_router docs: `ShellRoute` + `redirect` | +| M1 Β· codegen "it won't generate" | re-run `dart run build_runner build --delete-conflicting-outputs`; freezed README troubleshooting | +| M2 Β· forms & validation | [reactive_forms](https://pub.dev/packages/reactive_forms) README (it's a full manual) | +| M3 Β· infinite lists + pull-to-refresh | [infinite_scroll_pagination](https://pub.dev/packages/infinite_scroll_pagination) + cookbook lists | +| M4 Β· calendar & dates | table_calendar README Β· [intl](https://pub.dev/packages/intl) formatting | +| M4 Β· push notifications end-to-end | FCM Flutter guide β€” and coordinate with the API dev (device-token registration needs an API endpoint β€” flag it, don't invent it) | +| Any Β· widget testing | [Flutter testing docs](https://docs.flutter.dev/testing/overview) | + +πŸŽ₯ Background: [Flutter official channel](https://www.youtube.com/@flutterdev) β€” the +**Widget of the Week** playlist (2-min videos, weirdly effective) Β· Riverpod author's +site [riverpod.dev](https://riverpod.dev) has linked talks. + +--- + +## House rules for this page + +- Add anything that unblocked you (with one line saying when it's useful). Remove nothing + without asking β€” someone may be mid-course. +- Paid courses: ask the PM first β€” many of the above cover 95% free. +- If a resource contradicts our `ARCHITECTURE.md` or agreements, the agreement wins β€” + or open the discussion (ADR) if you think the resource is right. \ No newline at end of file