Update Resources
parent
3c3ae7d8c9
commit
e962ffbb57
186
Resources.md
186
Resources.md
@ -1 +1,185 @@
|
||||
Welcome to the Wiki.
|
||||
# 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.
|
||||
Loading…
Reference in New Issue
Block a user