aigroup-workflow 2.2.1 → 2.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/fix-build.md +10 -5
- package/.claude/commands/init-project.md +13 -8
- package/.claude/commands/plan.md +15 -8
- package/.claude/commands/review.md +12 -6
- package/.claude/commands/tdd.md +11 -5
- package/.claude/commands/workflow-start.md +20 -11
- package/.claude/settings.json +28 -0
- package/.codex/agents/architect.toml +207 -0
- package/.codex/agents/build-error-resolver.toml +110 -0
- package/.codex/agents/code-reviewer.toml +233 -0
- package/.codex/agents/doc-updater.toml +103 -0
- package/.codex/agents/e2e-runner.toml +103 -0
- package/.codex/agents/get-current-datetime.toml +23 -0
- package/.codex/agents/init-architect.toml +181 -0
- package/.codex/agents/planner.toml +208 -0
- package/.codex/agents/refactor-cleaner.toml +81 -0
- package/.codex/agents/rust-reviewer.toml +90 -0
- package/.codex/agents/security-reviewer.toml +104 -0
- package/.codex/agents/tdd-guide.toml +87 -0
- package/AGENTS.md +2 -2
- package/CLAUDE.md +23 -1
- package/LICENSE +20 -20
- package/README.md +333 -333
- package/agents/a11y-architect.md +141 -141
- package/agents/architect.md +211 -211
- package/agents/build-error-resolver.md +114 -114
- package/agents/chief-of-staff.md +151 -151
- package/agents/code-architect.md +71 -71
- package/agents/code-explorer.md +69 -69
- package/agents/code-reviewer.md +237 -237
- package/agents/code-simplifier.md +47 -47
- package/agents/comment-analyzer.md +45 -45
- package/agents/conversation-analyzer.md +52 -52
- package/agents/cpp-build-resolver.md +90 -90
- package/agents/cpp-reviewer.md +72 -72
- package/agents/csharp-reviewer.md +101 -101
- package/agents/dart-build-resolver.md +201 -201
- package/agents/database-reviewer.md +91 -91
- package/agents/doc-updater.md +107 -107
- package/agents/docs-lookup.md +68 -68
- package/agents/e2e-runner.md +107 -107
- package/agents/flutter-reviewer.md +243 -243
- package/agents/gan-evaluator.md +209 -209
- package/agents/gan-generator.md +131 -131
- package/agents/gan-planner.md +99 -99
- package/agents/get-current-datetime.md +26 -26
- package/agents/go-build-resolver.md +94 -94
- package/agents/go-reviewer.md +76 -76
- package/agents/harness-optimizer.md +35 -35
- package/agents/healthcare-reviewer.md +83 -83
- package/agents/java-build-resolver.md +153 -153
- package/agents/java-reviewer.md +92 -92
- package/agents/kotlin-build-resolver.md +118 -118
- package/agents/kotlin-reviewer.md +159 -159
- package/agents/loop-operator.md +36 -36
- package/agents/opensource-forker.md +198 -198
- package/agents/opensource-packager.md +249 -249
- package/agents/opensource-sanitizer.md +188 -188
- package/agents/performance-optimizer.md +446 -446
- package/agents/planner.md +212 -212
- package/agents/pr-test-analyzer.md +45 -45
- package/agents/python-reviewer.md +98 -98
- package/agents/pytorch-build-resolver.md +120 -120
- package/agents/refactor-cleaner.md +85 -85
- package/agents/rust-build-resolver.md +148 -148
- package/agents/rust-reviewer.md +94 -94
- package/agents/security-reviewer.md +108 -108
- package/agents/seo-specialist.md +59 -59
- package/agents/silent-failure-hunter.md +50 -50
- package/agents/tdd-guide.md +91 -91
- package/agents/type-design-analyzer.md +41 -41
- package/agents/typescript-reviewer.md +112 -112
- package/cli/commands/update.mjs +1 -1
- package/cli/utils/scaffold.mjs +53 -0
- package/docs/rules/agents.md +166 -50
- package/docs/rules/cpp/coding-style.md +44 -44
- package/docs/rules/cpp/hooks.md +39 -39
- package/docs/rules/cpp/patterns.md +51 -51
- package/docs/rules/cpp/security.md +51 -51
- package/docs/rules/cpp/testing.md +44 -44
- package/docs/rules/csharp/coding-style.md +72 -72
- package/docs/rules/csharp/hooks.md +25 -25
- package/docs/rules/csharp/patterns.md +50 -50
- package/docs/rules/csharp/security.md +58 -58
- package/docs/rules/csharp/testing.md +46 -46
- package/docs/rules/dart/coding-style.md +159 -159
- package/docs/rules/dart/hooks.md +66 -66
- package/docs/rules/dart/patterns.md +261 -261
- package/docs/rules/dart/security.md +135 -135
- package/docs/rules/dart/testing.md +215 -215
- package/docs/rules/golang/coding-style.md +32 -32
- package/docs/rules/golang/hooks.md +17 -17
- package/docs/rules/golang/patterns.md +45 -45
- package/docs/rules/golang/security.md +34 -34
- package/docs/rules/golang/testing.md +31 -31
- package/docs/rules/java/coding-style.md +114 -114
- package/docs/rules/java/hooks.md +18 -18
- package/docs/rules/java/patterns.md +146 -146
- package/docs/rules/java/security.md +100 -100
- package/docs/rules/java/testing.md +131 -131
- package/docs/rules/kotlin/coding-style.md +86 -86
- package/docs/rules/kotlin/hooks.md +17 -17
- package/docs/rules/kotlin/patterns.md +146 -146
- package/docs/rules/kotlin/security.md +82 -82
- package/docs/rules/kotlin/testing.md +128 -128
- package/docs/rules/perl/coding-style.md +46 -46
- package/docs/rules/perl/hooks.md +22 -22
- package/docs/rules/perl/patterns.md +76 -76
- package/docs/rules/perl/security.md +69 -69
- package/docs/rules/perl/testing.md +54 -54
- package/docs/rules/php/coding-style.md +40 -40
- package/docs/rules/php/hooks.md +24 -24
- package/docs/rules/php/patterns.md +33 -33
- package/docs/rules/php/security.md +37 -37
- package/docs/rules/php/testing.md +39 -39
- package/docs/rules/python/coding-style.md +42 -42
- package/docs/rules/python/hooks.md +19 -19
- package/docs/rules/python/patterns.md +39 -39
- package/docs/rules/python/security.md +30 -30
- package/docs/rules/python/testing.md +38 -38
- package/docs/rules/rust/coding-style.md +151 -151
- package/docs/rules/rust/hooks.md +16 -16
- package/docs/rules/rust/patterns.md +168 -168
- package/docs/rules/rust/security.md +141 -141
- package/docs/rules/rust/testing.md +154 -154
- package/docs/rules/swift/coding-style.md +47 -47
- package/docs/rules/swift/hooks.md +20 -20
- package/docs/rules/swift/patterns.md +66 -66
- package/docs/rules/swift/security.md +33 -33
- package/docs/rules/swift/testing.md +45 -45
- package/docs/rules/typescript/coding-style.md +199 -199
- package/docs/rules/typescript/hooks.md +22 -22
- package/docs/rules/typescript/patterns.md +52 -52
- package/docs/rules/typescript/security.md +28 -28
- package/docs/rules/typescript/testing.md +18 -18
- package/docs/rules/web/coding-style.md +96 -96
- package/docs/rules/web/design-quality.md +62 -62
- package/docs/rules/web/hooks.md +120 -120
- package/docs/rules/web/patterns.md +79 -79
- package/docs/rules/web/performance.md +64 -64
- package/docs/rules/web/security.md +57 -57
- package/docs/rules/web/testing.md +55 -55
- package/docs/templates/README.md +36 -36
- package/docs/templates/ai-project-final.md +124 -124
- package/docs/templates/ai-project.md +105 -105
- package/docs/templates/api.md +157 -157
- package/docs/templates/bug.md +62 -62
- package/docs/templates/code-review.md +87 -87
- package/docs/templates/generic.md +116 -116
- package/docs/templates/implementation-plan.md +1 -1
- package/docs/templates/meeting.md +68 -68
- package/docs/templates/prd.md +98 -98
- package/docs/templates/ui.md +134 -134
- package/docs/workflow-pipeline.md +5 -5
- package/package.json +40 -39
- package/skills/SUPERPOWERS-LICENSE +21 -21
- package/skills/ai-ml/fine-tuning-expert/SKILL.md +162 -162
- package/skills/ai-ml/fine-tuning-expert/references/dataset-preparation.md +540 -540
- package/skills/ai-ml/fine-tuning-expert/references/deployment-optimization.md +673 -673
- package/skills/ai-ml/fine-tuning-expert/references/evaluation-metrics.md +597 -597
- package/skills/ai-ml/fine-tuning-expert/references/hyperparameter-tuning.md +565 -565
- package/skills/ai-ml/fine-tuning-expert/references/lora-peft.md +347 -347
- package/skills/ai-ml/ml-pipeline/SKILL.md +159 -159
- package/skills/ai-ml/ml-pipeline/references/experiment-tracking.md +833 -833
- package/skills/ai-ml/ml-pipeline/references/feature-engineering.md +631 -631
- package/skills/ai-ml/ml-pipeline/references/model-validation.md +978 -978
- package/skills/ai-ml/ml-pipeline/references/pipeline-orchestration.md +907 -907
- package/skills/ai-ml/ml-pipeline/references/training-pipelines.md +782 -782
- package/skills/ai-ml/rag-architect/SKILL.md +194 -194
- package/skills/ai-ml/rag-architect/references/chunking-strategies.md +878 -878
- package/skills/ai-ml/rag-architect/references/embedding-models.md +561 -561
- package/skills/ai-ml/rag-architect/references/rag-evaluation.md +833 -833
- package/skills/ai-ml/rag-architect/references/retrieval-optimization.md +795 -795
- package/skills/ai-ml/rag-architect/references/vector-databases.md +589 -589
- package/skills/ai-ml/spark-engineer/SKILL.md +148 -148
- package/skills/ai-ml/spark-engineer/references/partitioning-caching.md +543 -543
- package/skills/ai-ml/spark-engineer/references/performance-tuning.md +544 -544
- package/skills/ai-ml/spark-engineer/references/rdd-operations.md +599 -599
- package/skills/ai-ml/spark-engineer/references/spark-sql-dataframes.md +474 -474
- package/skills/ai-ml/spark-engineer/references/streaming-patterns.md +786 -786
- package/skills/backend/api-designer/SKILL.md +217 -217
- package/skills/backend/api-designer/references/error-handling.md +541 -541
- package/skills/backend/api-designer/references/openapi.md +824 -824
- package/skills/backend/api-designer/references/pagination.md +494 -494
- package/skills/backend/api-designer/references/rest-patterns.md +335 -335
- package/skills/backend/api-designer/references/versioning.md +391 -391
- package/skills/backend/architecture-designer/SKILL.md +117 -117
- package/skills/backend/architecture-designer/references/adr-template.md +116 -116
- package/skills/backend/architecture-designer/references/architecture-patterns.md +111 -111
- package/skills/backend/architecture-designer/references/database-selection.md +102 -102
- package/skills/backend/architecture-designer/references/nfr-checklist.md +112 -112
- package/skills/backend/architecture-designer/references/system-design.md +100 -100
- package/skills/backend/code-documenter/SKILL.md +147 -147
- package/skills/backend/code-documenter/references/api-docs-fastapi-django.md +166 -166
- package/skills/backend/code-documenter/references/api-docs-nestjs-express.md +220 -220
- package/skills/backend/code-documenter/references/coverage-reports.md +125 -125
- package/skills/backend/code-documenter/references/documentation-systems.md +333 -333
- package/skills/backend/code-documenter/references/interactive-api-docs.md +531 -531
- package/skills/backend/code-documenter/references/python-docstrings.md +121 -121
- package/skills/backend/code-documenter/references/typescript-jsdoc.md +145 -145
- package/skills/backend/code-documenter/references/user-guides-tutorials.md +530 -530
- package/skills/backend/debugging-wizard/SKILL.md +105 -105
- package/skills/backend/debugging-wizard/references/common-patterns.md +132 -132
- package/skills/backend/debugging-wizard/references/debugging-tools.md +140 -140
- package/skills/backend/debugging-wizard/references/quick-fixes.md +177 -177
- package/skills/backend/debugging-wizard/references/strategies.md +142 -142
- package/skills/backend/debugging-wizard/references/systematic-debugging.md +367 -367
- package/skills/backend/feature-forge/SKILL.md +98 -98
- package/skills/backend/feature-forge/references/acceptance-criteria.md +104 -104
- package/skills/backend/feature-forge/references/ears-syntax.md +99 -99
- package/skills/backend/feature-forge/references/interview-questions.md +150 -150
- package/skills/backend/feature-forge/references/pre-discovery-subagents.md +54 -54
- package/skills/backend/feature-forge/references/specification-template.md +103 -103
- package/skills/backend/fullstack-guardian/SKILL.md +105 -105
- package/skills/backend/fullstack-guardian/references/api-design-standards.md +307 -307
- package/skills/backend/fullstack-guardian/references/architecture-decisions.md +350 -350
- package/skills/backend/fullstack-guardian/references/backend-patterns.md +237 -237
- package/skills/backend/fullstack-guardian/references/common-patterns.md +134 -134
- package/skills/backend/fullstack-guardian/references/deliverables-checklist.md +354 -354
- package/skills/backend/fullstack-guardian/references/design-template.md +91 -91
- package/skills/backend/fullstack-guardian/references/error-handling.md +135 -135
- package/skills/backend/fullstack-guardian/references/frontend-patterns.md +340 -340
- package/skills/backend/fullstack-guardian/references/integration-patterns.md +333 -333
- package/skills/backend/fullstack-guardian/references/security-checklist.md +106 -106
- package/skills/backend/graphql-architect/SKILL.md +146 -146
- package/skills/backend/graphql-architect/references/federation.md +418 -418
- package/skills/backend/graphql-architect/references/migration-from-rest.md +1141 -1141
- package/skills/backend/graphql-architect/references/resolvers.md +425 -425
- package/skills/backend/graphql-architect/references/schema-design.md +393 -393
- package/skills/backend/graphql-architect/references/security.md +569 -569
- package/skills/backend/graphql-architect/references/subscriptions.md +510 -510
- package/skills/backend/legacy-modernizer/SKILL.md +137 -137
- package/skills/backend/legacy-modernizer/references/legacy-testing.md +381 -381
- package/skills/backend/legacy-modernizer/references/migration-strategies.md +423 -423
- package/skills/backend/legacy-modernizer/references/refactoring-patterns.md +395 -395
- package/skills/backend/legacy-modernizer/references/strangler-fig-pattern.md +281 -281
- package/skills/backend/legacy-modernizer/references/system-assessment.md +487 -487
- package/skills/backend/microservices-architect/SKILL.md +164 -164
- package/skills/backend/microservices-architect/references/communication.md +499 -499
- package/skills/backend/microservices-architect/references/data.md +721 -721
- package/skills/backend/microservices-architect/references/decomposition.md +344 -344
- package/skills/backend/microservices-architect/references/observability.md +805 -805
- package/skills/backend/microservices-architect/references/patterns.md +603 -603
- package/skills/database/database-optimizer/SKILL.md +147 -147
- package/skills/database/database-optimizer/references/index-strategies.md +331 -331
- package/skills/database/database-optimizer/references/monitoring-analysis.md +501 -501
- package/skills/database/database-optimizer/references/mysql-tuning.md +452 -452
- package/skills/database/database-optimizer/references/postgresql-tuning.md +413 -413
- package/skills/database/database-optimizer/references/query-optimization.md +251 -251
- package/skills/database/postgres-pro/SKILL.md +152 -152
- package/skills/database/postgres-pro/references/extensions.md +404 -404
- package/skills/database/postgres-pro/references/jsonb.md +321 -321
- package/skills/database/postgres-pro/references/maintenance.md +481 -481
- package/skills/database/postgres-pro/references/performance.md +265 -265
- package/skills/database/postgres-pro/references/replication.md +446 -446
- package/skills/database/sql-pro/SKILL.md +129 -129
- package/skills/database/sql-pro/references/database-design.md +402 -402
- package/skills/database/sql-pro/references/dialect-differences.md +419 -419
- package/skills/database/sql-pro/references/optimization.md +384 -384
- package/skills/database/sql-pro/references/query-patterns.md +285 -285
- package/skills/database/sql-pro/references/window-functions.md +328 -328
- package/skills/dotnet/csharp-developer/SKILL.md +125 -125
- package/skills/dotnet/csharp-developer/references/aspnet-core.md +394 -394
- package/skills/dotnet/csharp-developer/references/blazor.md +553 -553
- package/skills/dotnet/csharp-developer/references/entity-framework.md +409 -409
- package/skills/dotnet/csharp-developer/references/modern-csharp.md +248 -248
- package/skills/dotnet/csharp-developer/references/performance.md +498 -498
- package/skills/dotnet/dotnet-core-expert/SKILL.md +138 -138
- package/skills/dotnet/dotnet-core-expert/references/authentication.md +546 -546
- package/skills/dotnet/dotnet-core-expert/references/clean-architecture.md +455 -455
- package/skills/dotnet/dotnet-core-expert/references/cloud-native.md +548 -548
- package/skills/dotnet/dotnet-core-expert/references/entity-framework.md +440 -440
- package/skills/dotnet/dotnet-core-expert/references/minimal-apis.md +319 -319
- package/skills/frontend/angular-architect/SKILL.md +152 -152
- package/skills/frontend/angular-architect/references/components.md +297 -297
- package/skills/frontend/angular-architect/references/ngrx.md +401 -401
- package/skills/frontend/angular-architect/references/routing.md +361 -361
- package/skills/frontend/angular-architect/references/rxjs.md +319 -319
- package/skills/frontend/angular-architect/references/testing.md +405 -405
- package/skills/frontend/design-commands/design.md +91 -91
- package/skills/frontend/design-commands/handoff.md +97 -97
- package/skills/frontend/design-commands/prototype.md +120 -120
- package/skills/frontend/design-commands/spec.md +160 -160
- package/skills/frontend/design-commands/style.md +78 -78
- package/skills/frontend/flutter-expert/SKILL.md +138 -138
- package/skills/frontend/flutter-expert/references/bloc-state.md +259 -259
- package/skills/frontend/flutter-expert/references/gorouter-navigation.md +119 -119
- package/skills/frontend/flutter-expert/references/performance.md +99 -99
- package/skills/frontend/flutter-expert/references/project-structure.md +118 -118
- package/skills/frontend/flutter-expert/references/riverpod-state.md +130 -130
- package/skills/frontend/flutter-expert/references/widget-patterns.md +123 -123
- package/skills/frontend/nextjs-developer/SKILL.md +143 -143
- package/skills/frontend/nextjs-developer/references/app-router.md +311 -311
- package/skills/frontend/nextjs-developer/references/data-fetching.md +482 -482
- package/skills/frontend/nextjs-developer/references/deployment.md +545 -545
- package/skills/frontend/nextjs-developer/references/server-actions.md +462 -462
- package/skills/frontend/nextjs-developer/references/server-components.md +384 -384
- package/skills/frontend/react-expert/SKILL.md +149 -149
- package/skills/frontend/react-expert/references/hooks-patterns.md +162 -162
- package/skills/frontend/react-expert/references/migration-class-to-modern.md +1119 -1119
- package/skills/frontend/react-expert/references/performance.md +168 -168
- package/skills/frontend/react-expert/references/react-19-features.md +174 -174
- package/skills/frontend/react-expert/references/server-components.md +143 -143
- package/skills/frontend/react-expert/references/state-management.md +171 -171
- package/skills/frontend/react-expert/references/testing-react.md +174 -174
- package/skills/frontend/react-native-expert/SKILL.md +185 -185
- package/skills/frontend/react-native-expert/references/expo-router.md +187 -187
- package/skills/frontend/react-native-expert/references/list-optimization.md +204 -204
- package/skills/frontend/react-native-expert/references/platform-handling.md +188 -188
- package/skills/frontend/react-native-expert/references/project-structure.md +171 -171
- package/skills/frontend/react-native-expert/references/storage-hooks.md +173 -173
- package/skills/frontend/senior-frontend/SKILL.md +477 -477
- package/skills/frontend/senior-frontend/references/frontend_best_practices.md +806 -806
- package/skills/frontend/senior-frontend/references/nextjs_optimization_guide.md +724 -724
- package/skills/frontend/senior-frontend/references/react_patterns.md +746 -746
- package/skills/frontend/senior-frontend/scripts/bundle_analyzer.py +407 -407
- package/skills/frontend/senior-frontend/scripts/component_generator.py +329 -329
- package/skills/frontend/senior-frontend/scripts/frontend_scaffolder.py +1005 -1005
- package/skills/frontend/ui-ux-pro-max/SKILL.md +386 -386
- package/skills/frontend/ui-ux-pro-max/data/charts.csv +26 -26
- package/skills/frontend/ui-ux-pro-max/data/colors.csv +97 -97
- package/skills/frontend/ui-ux-pro-max/data/icons.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/landing.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/data/products.csv +96 -96
- package/skills/frontend/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/skills/frontend/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/skills/frontend/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/skills/frontend/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/skills/frontend/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/skills/frontend/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/skills/frontend/ui-ux-pro-max/data/styles.csv +68 -68
- package/skills/frontend/ui-ux-pro-max/data/typography.csv +57 -57
- package/skills/frontend/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/skills/frontend/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/scripts/core.py +253 -253
- package/skills/frontend/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/skills/frontend/ui-ux-pro-max/scripts/search.py +114 -114
- package/skills/frontend/vue-expert/SKILL.md +98 -98
- package/skills/frontend/vue-expert/references/build-tooling.md +480 -480
- package/skills/frontend/vue-expert/references/components.md +448 -448
- package/skills/frontend/vue-expert/references/composition-api.md +299 -299
- package/skills/frontend/vue-expert/references/mobile-hybrid.md +636 -636
- package/skills/frontend/vue-expert/references/nuxt.md +669 -669
- package/skills/frontend/vue-expert/references/state-management.md +449 -449
- package/skills/frontend/vue-expert/references/typescript.md +584 -584
- package/skills/frontend/vue-expert-js/SKILL.md +167 -167
- package/skills/frontend/vue-expert-js/references/component-architecture.md +219 -219
- package/skills/frontend/vue-expert-js/references/composables-patterns.md +183 -183
- package/skills/frontend/vue-expert-js/references/jsdoc-typing.md +535 -535
- package/skills/frontend/vue-expert-js/references/state-management.md +249 -249
- package/skills/frontend/vue-expert-js/references/testing-patterns.md +237 -237
- package/skills/go-rust-cpp/cpp-pro/SKILL.md +115 -115
- package/skills/go-rust-cpp/cpp-pro/references/build-tooling.md +440 -440
- package/skills/go-rust-cpp/cpp-pro/references/concurrency.md +437 -437
- package/skills/go-rust-cpp/cpp-pro/references/memory-performance.md +397 -397
- package/skills/go-rust-cpp/cpp-pro/references/modern-cpp.md +304 -304
- package/skills/go-rust-cpp/cpp-pro/references/templates.md +357 -357
- package/skills/go-rust-cpp/golang-pro/SKILL.md +122 -122
- package/skills/go-rust-cpp/golang-pro/references/concurrency.md +329 -329
- package/skills/go-rust-cpp/golang-pro/references/generics.md +442 -442
- package/skills/go-rust-cpp/golang-pro/references/interfaces.md +432 -432
- package/skills/go-rust-cpp/golang-pro/references/project-structure.md +477 -477
- package/skills/go-rust-cpp/golang-pro/references/testing.md +451 -451
- package/skills/go-rust-cpp/rust-engineer/SKILL.md +167 -167
- package/skills/go-rust-cpp/rust-engineer/references/async.md +458 -458
- package/skills/go-rust-cpp/rust-engineer/references/error-handling.md +334 -334
- package/skills/go-rust-cpp/rust-engineer/references/ownership.md +278 -278
- package/skills/go-rust-cpp/rust-engineer/references/testing.md +470 -470
- package/skills/go-rust-cpp/rust-engineer/references/traits.md +413 -413
- package/skills/infra/cli-developer/SKILL.md +113 -113
- package/skills/infra/cli-developer/references/design-patterns.md +221 -221
- package/skills/infra/cli-developer/references/go-cli.md +540 -540
- package/skills/infra/cli-developer/references/node-cli.md +383 -383
- package/skills/infra/cli-developer/references/python-cli.md +422 -422
- package/skills/infra/cli-developer/references/ux-patterns.md +448 -448
- package/skills/infra/cloud-architect/SKILL.md +216 -216
- package/skills/infra/cloud-architect/references/aws.md +394 -394
- package/skills/infra/cloud-architect/references/azure.md +562 -562
- package/skills/infra/cloud-architect/references/cost.md +582 -582
- package/skills/infra/cloud-architect/references/gcp.md +633 -633
- package/skills/infra/cloud-architect/references/multi-cloud.md +483 -483
- package/skills/infra/devops-engineer/SKILL.md +144 -144
- package/skills/infra/devops-engineer/references/deployment-strategies.md +241 -241
- package/skills/infra/devops-engineer/references/docker-patterns.md +113 -113
- package/skills/infra/devops-engineer/references/github-actions.md +139 -139
- package/skills/infra/devops-engineer/references/incident-response.md +331 -331
- package/skills/infra/devops-engineer/references/kubernetes.md +154 -154
- package/skills/infra/devops-engineer/references/platform-engineering.md +417 -417
- package/skills/infra/devops-engineer/references/release-automation.md +527 -527
- package/skills/infra/devops-engineer/references/terraform-iac.md +141 -141
- package/skills/infra/kubernetes-specialist/SKILL.md +241 -241
- package/skills/infra/kubernetes-specialist/references/configuration.md +452 -452
- package/skills/infra/kubernetes-specialist/references/cost-optimization.md +458 -458
- package/skills/infra/kubernetes-specialist/references/custom-operators.md +563 -563
- package/skills/infra/kubernetes-specialist/references/gitops.md +530 -530
- package/skills/infra/kubernetes-specialist/references/helm-charts.md +912 -912
- package/skills/infra/kubernetes-specialist/references/multi-cluster.md +507 -507
- package/skills/infra/kubernetes-specialist/references/networking.md +447 -447
- package/skills/infra/kubernetes-specialist/references/service-mesh.md +459 -459
- package/skills/infra/kubernetes-specialist/references/storage.md +535 -535
- package/skills/infra/kubernetes-specialist/references/troubleshooting.md +414 -414
- package/skills/infra/kubernetes-specialist/references/workloads.md +377 -377
- package/skills/infra/mcp-developer/SKILL.md +143 -143
- package/skills/infra/mcp-developer/references/protocol.md +244 -244
- package/skills/infra/mcp-developer/references/python-sdk.md +367 -367
- package/skills/infra/mcp-developer/references/resources.md +554 -554
- package/skills/infra/mcp-developer/references/tools.md +480 -480
- package/skills/infra/mcp-developer/references/typescript-sdk.md +350 -350
- package/skills/infra/monitoring-expert/SKILL.md +176 -176
- package/skills/infra/monitoring-expert/references/alerting-rules.md +141 -141
- package/skills/infra/monitoring-expert/references/application-profiling.md +331 -331
- package/skills/infra/monitoring-expert/references/capacity-planning.md +344 -344
- package/skills/infra/monitoring-expert/references/dashboards.md +126 -126
- package/skills/infra/monitoring-expert/references/opentelemetry.md +123 -123
- package/skills/infra/monitoring-expert/references/performance-testing.md +269 -269
- package/skills/infra/monitoring-expert/references/prometheus-metrics.md +136 -136
- package/skills/infra/monitoring-expert/references/structured-logging.md +142 -142
- package/skills/infra/sre-engineer/SKILL.md +181 -181
- package/skills/infra/sre-engineer/references/automation-toil.md +492 -492
- package/skills/infra/sre-engineer/references/error-budget-policy.md +334 -334
- package/skills/infra/sre-engineer/references/incident-chaos.md +576 -576
- package/skills/infra/sre-engineer/references/monitoring-alerting.md +424 -424
- package/skills/infra/sre-engineer/references/slo-sli-management.md +238 -238
- package/skills/infra/terraform-engineer/SKILL.md +143 -143
- package/skills/infra/terraform-engineer/references/best-practices.md +583 -583
- package/skills/infra/terraform-engineer/references/module-patterns.md +297 -297
- package/skills/infra/terraform-engineer/references/providers.md +452 -452
- package/skills/infra/terraform-engineer/references/state-management.md +371 -371
- package/skills/infra/terraform-engineer/references/testing.md +486 -486
- package/skills/infra/websocket-engineer/SKILL.md +168 -168
- package/skills/infra/websocket-engineer/references/alternatives.md +391 -391
- package/skills/infra/websocket-engineer/references/patterns.md +400 -400
- package/skills/infra/websocket-engineer/references/protocol.md +195 -195
- package/skills/infra/websocket-engineer/references/scaling.md +333 -333
- package/skills/infra/websocket-engineer/references/security.md +474 -474
- package/skills/java/java-architect/SKILL.md +132 -132
- package/skills/java/java-architect/references/jpa-optimization.md +393 -393
- package/skills/java/java-architect/references/reactive-webflux.md +356 -356
- package/skills/java/java-architect/references/spring-boot-setup.md +269 -269
- package/skills/java/java-architect/references/spring-security.md +445 -445
- package/skills/java/java-architect/references/testing-patterns.md +500 -500
- package/skills/java/kotlin-specialist/SKILL.md +147 -147
- package/skills/java/kotlin-specialist/references/android-compose.md +419 -419
- package/skills/java/kotlin-specialist/references/coroutines-flow.md +276 -276
- package/skills/java/kotlin-specialist/references/dsl-idioms.md +421 -421
- package/skills/java/kotlin-specialist/references/ktor-server.md +426 -426
- package/skills/java/kotlin-specialist/references/multiplatform-kmp.md +380 -380
- package/skills/java/spring-boot-engineer/SKILL.md +195 -195
- package/skills/java/spring-boot-engineer/references/cloud.md +498 -498
- package/skills/java/spring-boot-engineer/references/data.md +381 -381
- package/skills/java/spring-boot-engineer/references/security.md +459 -459
- package/skills/java/spring-boot-engineer/references/testing.md +545 -545
- package/skills/java/spring-boot-engineer/references/web.md +295 -295
- package/skills/javascript/javascript-pro/SKILL.md +132 -132
- package/skills/javascript/javascript-pro/references/async-patterns.md +334 -334
- package/skills/javascript/javascript-pro/references/browser-apis.md +398 -398
- package/skills/javascript/javascript-pro/references/modern-syntax.md +272 -272
- package/skills/javascript/javascript-pro/references/modules.md +357 -357
- package/skills/javascript/javascript-pro/references/node-essentials.md +471 -471
- package/skills/javascript/nestjs-expert/SKILL.md +206 -206
- package/skills/javascript/nestjs-expert/references/authentication.md +166 -166
- package/skills/javascript/nestjs-expert/references/controllers-routing.md +111 -111
- package/skills/javascript/nestjs-expert/references/dtos-validation.md +153 -153
- package/skills/javascript/nestjs-expert/references/migration-from-express.md +1237 -1237
- package/skills/javascript/nestjs-expert/references/services-di.md +140 -140
- package/skills/javascript/nestjs-expert/references/testing-patterns.md +186 -186
- package/skills/javascript/typescript-pro/SKILL.md +145 -145
- package/skills/javascript/typescript-pro/references/advanced-types.md +259 -259
- package/skills/javascript/typescript-pro/references/configuration.md +445 -445
- package/skills/javascript/typescript-pro/references/patterns.md +484 -484
- package/skills/javascript/typescript-pro/references/type-guards.md +352 -352
- package/skills/javascript/typescript-pro/references/utility-types.md +329 -329
- package/skills/php/laravel-specialist/SKILL.md +262 -262
- package/skills/php/laravel-specialist/references/eloquent.md +351 -351
- package/skills/php/laravel-specialist/references/livewire.md +512 -512
- package/skills/php/laravel-specialist/references/queues.md +423 -423
- package/skills/php/laravel-specialist/references/routing.md +362 -362
- package/skills/php/laravel-specialist/references/testing.md +522 -522
- package/skills/php/php-pro/SKILL.md +206 -206
- package/skills/php/php-pro/references/async-patterns.md +412 -412
- package/skills/php/php-pro/references/laravel-patterns.md +377 -377
- package/skills/php/php-pro/references/modern-php-features.md +323 -323
- package/skills/php/php-pro/references/symfony-patterns.md +466 -466
- package/skills/php/php-pro/references/testing-quality.md +466 -466
- package/skills/product/competitive-analysis/SKILL.md +257 -257
- package/skills/product/meeting-notes/SKILL.md +266 -266
- package/skills/product/prd-template/SKILL.md +150 -150
- package/skills/product/stakeholder-update/SKILL.md +225 -225
- package/skills/product/user-research-synthesis/SKILL.md +235 -235
- package/skills/python/django-expert/SKILL.md +162 -162
- package/skills/python/django-expert/references/authentication.md +145 -145
- package/skills/python/django-expert/references/drf-serializers.md +148 -148
- package/skills/python/django-expert/references/models-orm.md +151 -151
- package/skills/python/django-expert/references/testing-django.md +204 -204
- package/skills/python/django-expert/references/viewsets-views.md +153 -153
- package/skills/python/fastapi-expert/SKILL.md +185 -185
- package/skills/python/fastapi-expert/references/async-sqlalchemy.md +146 -146
- package/skills/python/fastapi-expert/references/authentication.md +159 -159
- package/skills/python/fastapi-expert/references/endpoints-routing.md +142 -142
- package/skills/python/fastapi-expert/references/migration-from-django.md +996 -996
- package/skills/python/fastapi-expert/references/pydantic-v2.md +135 -135
- package/skills/python/fastapi-expert/references/testing-async.md +159 -159
- package/skills/python/pandas-pro/SKILL.md +178 -178
- package/skills/python/pandas-pro/references/aggregation-groupby.md +545 -545
- package/skills/python/pandas-pro/references/data-cleaning.md +500 -500
- package/skills/python/pandas-pro/references/dataframe-operations.md +420 -420
- package/skills/python/pandas-pro/references/merging-joining.md +596 -596
- package/skills/python/pandas-pro/references/performance-optimization.md +597 -597
- package/skills/python/python-pro/SKILL.md +177 -177
- package/skills/python/python-pro/references/async-patterns.md +356 -356
- package/skills/python/python-pro/references/packaging.md +460 -460
- package/skills/python/python-pro/references/standard-library.md +378 -378
- package/skills/python/python-pro/references/testing.md +404 -404
- package/skills/python/python-pro/references/type-system.md +290 -290
- package/skills/quality/chaos-engineer/SKILL.md +182 -182
- package/skills/quality/chaos-engineer/references/chaos-tools.md +511 -511
- package/skills/quality/chaos-engineer/references/experiment-design.md +229 -229
- package/skills/quality/chaos-engineer/references/game-days.md +434 -434
- package/skills/quality/chaos-engineer/references/infrastructure-chaos.md +348 -348
- package/skills/quality/chaos-engineer/references/kubernetes-chaos.md +432 -432
- package/skills/quality/code-reviewer/SKILL.md +119 -119
- package/skills/quality/code-reviewer/references/common-issues.md +142 -142
- package/skills/quality/code-reviewer/references/feedback-examples.md +144 -144
- package/skills/quality/code-reviewer/references/receiving-feedback.md +238 -238
- package/skills/quality/code-reviewer/references/report-template.md +109 -109
- package/skills/quality/code-reviewer/references/review-checklist.md +88 -88
- package/skills/quality/code-reviewer/references/spec-compliance-review.md +258 -258
- package/skills/quality/playwright-expert/SKILL.md +169 -169
- package/skills/quality/playwright-expert/references/api-mocking.md +140 -140
- package/skills/quality/playwright-expert/references/configuration.md +155 -155
- package/skills/quality/playwright-expert/references/debugging-flaky.md +150 -150
- package/skills/quality/playwright-expert/references/page-object-model.md +152 -152
- package/skills/quality/playwright-expert/references/selectors-locators.md +119 -119
- package/skills/quality/secure-code-guardian/SKILL.md +191 -191
- package/skills/quality/secure-code-guardian/references/authentication.md +136 -136
- package/skills/quality/secure-code-guardian/references/input-validation.md +146 -146
- package/skills/quality/secure-code-guardian/references/owasp-prevention.md +135 -135
- package/skills/quality/secure-code-guardian/references/security-headers.md +133 -133
- package/skills/quality/secure-code-guardian/references/xss-csrf.md +157 -157
- package/skills/quality/security-reviewer/SKILL.md +103 -103
- package/skills/quality/security-reviewer/references/infrastructure-security.md +268 -268
- package/skills/quality/security-reviewer/references/penetration-testing.md +268 -268
- package/skills/quality/security-reviewer/references/report-template.md +170 -170
- package/skills/quality/security-reviewer/references/sast-tools.md +117 -117
- package/skills/quality/security-reviewer/references/secret-scanning.md +125 -125
- package/skills/quality/security-reviewer/references/vulnerability-patterns.md +152 -152
- package/skills/quality/senior-qa/README.md +196 -196
- package/skills/quality/senior-qa/SKILL.md +399 -399
- package/skills/quality/senior-qa/references/qa_best_practices.md +964 -964
- package/skills/quality/senior-qa/references/test_automation_patterns.md +1009 -1009
- package/skills/quality/senior-qa/references/testing_strategies.md +649 -649
- package/skills/quality/senior-qa/scripts/coverage_analyzer.py +836 -836
- package/skills/quality/senior-qa/scripts/e2e_test_scaffolder.py +820 -820
- package/skills/quality/senior-qa/scripts/test_suite_generator.py +605 -605
- package/skills/quality/tdd-guide/HOW_TO_USE.md +313 -313
- package/skills/quality/tdd-guide/README.md +680 -680
- package/skills/quality/tdd-guide/SKILL.md +122 -122
- package/skills/quality/tdd-guide/assets/expected_output.json +77 -77
- package/skills/quality/tdd-guide/assets/sample_input_python.json +39 -39
- package/skills/quality/tdd-guide/assets/sample_input_typescript.json +36 -36
- package/skills/quality/tdd-guide/references/ci-integration.md +195 -195
- package/skills/quality/tdd-guide/references/framework-guide.md +206 -206
- package/skills/quality/tdd-guide/references/tdd-best-practices.md +128 -128
- package/skills/quality/tdd-guide/scripts/coverage_analyzer.py +434 -434
- package/skills/quality/tdd-guide/scripts/fixture_generator.py +440 -440
- package/skills/quality/tdd-guide/scripts/format_detector.py +384 -384
- package/skills/quality/tdd-guide/scripts/framework_adapter.py +428 -428
- package/skills/quality/tdd-guide/scripts/metrics_calculator.py +456 -456
- package/skills/quality/tdd-guide/scripts/output_formatter.py +354 -354
- package/skills/quality/tdd-guide/scripts/tdd_workflow.py +474 -474
- package/skills/quality/tdd-guide/scripts/test_generator.py +438 -438
- package/skills/quality/test-master/SKILL.md +94 -94
- package/skills/quality/test-master/references/automation-frameworks.md +294 -294
- package/skills/quality/test-master/references/e2e-testing.md +128 -128
- package/skills/quality/test-master/references/integration-testing.md +120 -120
- package/skills/quality/test-master/references/performance-testing.md +118 -118
- package/skills/quality/test-master/references/qa-methodology.md +247 -247
- package/skills/quality/test-master/references/security-testing.md +127 -127
- package/skills/quality/test-master/references/tdd-iron-laws.md +174 -174
- package/skills/quality/test-master/references/test-reports.md +104 -104
- package/skills/quality/test-master/references/testing-anti-patterns.md +231 -231
- package/skills/quality/test-master/references/unit-testing.md +113 -113
- package/skills/ruby/rails-expert/SKILL.md +154 -154
- package/skills/ruby/rails-expert/references/active-record.md +244 -244
- package/skills/ruby/rails-expert/references/api-development.md +401 -401
- package/skills/ruby/rails-expert/references/background-jobs.md +272 -272
- package/skills/ruby/rails-expert/references/hotwire-turbo.md +228 -228
- package/skills/ruby/rails-expert/references/rspec-testing.md +367 -367
- package/skills/swift/swift-expert/SKILL.md +163 -163
- package/skills/swift/swift-expert/references/async-concurrency.md +360 -360
- package/skills/swift/swift-expert/references/memory-performance.md +377 -377
- package/skills/swift/swift-expert/references/protocol-oriented.md +354 -354
- package/skills/swift/swift-expert/references/swiftui-patterns.md +291 -291
- package/skills/swift/swift-expert/references/testing-patterns.md +399 -399
- package/skills/workflow/brainstorming/SKILL.md +164 -164
- package/skills/workflow/brainstorming/scripts/frame-template.html +214 -214
- package/skills/workflow/brainstorming/scripts/helper.js +88 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +354 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +148 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +56 -56
- package/skills/workflow/brainstorming/spec-document-reviewer-prompt.md +49 -49
- package/skills/workflow/brainstorming/visual-companion.md +287 -287
- package/skills/workflow/documentation/SKILL.md +45 -45
- package/skills/workflow/entropy-management/SKILL.md +115 -115
- package/skills/workflow/executing-plans/SKILL.md +70 -70
- package/skills/workflow/finishing-a-development-branch/SKILL.md +200 -200
- package/skills/workflow/receiving-code-review/SKILL.md +213 -213
- package/skills/workflow/requesting-code-review/SKILL.md +105 -105
- package/skills/workflow/requesting-code-review/code-reviewer.md +146 -146
- package/skills/workflow/requirement-engineering/SKILL.md +111 -111
- package/skills/workflow/systematic-debugging/CREATION-LOG.md +119 -119
- package/skills/workflow/systematic-debugging/SKILL.md +296 -296
- package/skills/workflow/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/skills/workflow/systematic-debugging/condition-based-waiting.md +115 -115
- package/skills/workflow/systematic-debugging/defense-in-depth.md +122 -122
- package/skills/workflow/systematic-debugging/find-polluter.sh +63 -63
- package/skills/workflow/systematic-debugging/root-cause-tracing.md +169 -169
- package/skills/workflow/systematic-debugging/test-academic.md +14 -14
- package/skills/workflow/systematic-debugging/test-pressure-1.md +58 -58
- package/skills/workflow/systematic-debugging/test-pressure-2.md +68 -68
- package/skills/workflow/systematic-debugging/test-pressure-3.md +69 -69
- package/skills/workflow/using-git-worktrees/SKILL.md +218 -218
- package/skills/workflow/verification-before-completion/SKILL.md +139 -139
- package/skills/workflow/writing-plans/SKILL.md +151 -151
- package/skills/workflow/writing-plans/plan-document-reviewer-prompt.md +49 -49
- package/skills/workflow/writing-skills/SKILL.md +655 -655
- package/skills/workflow/writing-skills/anthropic-best-practices.md +1150 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -189
- package/skills/workflow/writing-skills/persuasion-principles.md +187 -187
- package/skills/workflow/writing-skills/render-graphs.js +168 -168
- package/skills/workflow/writing-skills/testing-skills-with-subagents.md +384 -384
|
@@ -1,295 +1,295 @@
|
|
|
1
|
-
# Web Layer - Controllers & REST APIs
|
|
2
|
-
|
|
3
|
-
## REST Controller Pattern
|
|
4
|
-
|
|
5
|
-
```java
|
|
6
|
-
@RestController
|
|
7
|
-
@RequestMapping("/api/v1/users")
|
|
8
|
-
@Validated
|
|
9
|
-
@RequiredArgsConstructor
|
|
10
|
-
public class UserController {
|
|
11
|
-
private final UserService userService;
|
|
12
|
-
|
|
13
|
-
@GetMapping
|
|
14
|
-
public ResponseEntity<Page<UserResponse>> getUsers(
|
|
15
|
-
@PageableDefault(size = 20, sort = "createdAt") Pageable pageable) {
|
|
16
|
-
Page<UserResponse> users = userService.findAll(pageable);
|
|
17
|
-
return ResponseEntity.ok(users);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
@GetMapping("/{id}")
|
|
21
|
-
public ResponseEntity<UserResponse> getUser(@PathVariable Long id) {
|
|
22
|
-
UserResponse user = userService.findById(id);
|
|
23
|
-
return ResponseEntity.ok(user);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
@PostMapping
|
|
27
|
-
public ResponseEntity<UserResponse> createUser(
|
|
28
|
-
@Valid @RequestBody UserCreateRequest request) {
|
|
29
|
-
UserResponse user = userService.create(request);
|
|
30
|
-
URI location = ServletUriComponentsBuilder
|
|
31
|
-
.fromCurrentRequest()
|
|
32
|
-
.path("/{id}")
|
|
33
|
-
.buildAndExpand(user.id())
|
|
34
|
-
.toUri();
|
|
35
|
-
return ResponseEntity.created(location).body(user);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
@PutMapping("/{id}")
|
|
39
|
-
public ResponseEntity<UserResponse> updateUser(
|
|
40
|
-
@PathVariable Long id,
|
|
41
|
-
@Valid @RequestBody UserUpdateRequest request) {
|
|
42
|
-
UserResponse user = userService.update(id, request);
|
|
43
|
-
return ResponseEntity.ok(user);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
@DeleteMapping("/{id}")
|
|
47
|
-
@ResponseStatus(HttpStatus.NO_CONTENT)
|
|
48
|
-
public void deleteUser(@PathVariable Long id) {
|
|
49
|
-
userService.delete(id);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Request DTOs with Validation
|
|
55
|
-
|
|
56
|
-
```java
|
|
57
|
-
public record UserCreateRequest(
|
|
58
|
-
@NotBlank(message = "Email is required")
|
|
59
|
-
@Email(message = "Email must be valid")
|
|
60
|
-
String email,
|
|
61
|
-
|
|
62
|
-
@NotBlank(message = "Password is required")
|
|
63
|
-
@Size(min = 8, max = 100, message = "Password must be 8-100 characters")
|
|
64
|
-
@Pattern(regexp = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).*$",
|
|
65
|
-
message = "Password must contain uppercase, lowercase, and digit")
|
|
66
|
-
String password,
|
|
67
|
-
|
|
68
|
-
@NotBlank(message = "Username is required")
|
|
69
|
-
@Size(min = 3, max = 50)
|
|
70
|
-
@Pattern(regexp = "^[a-zA-Z0-9_]+$", message = "Username must be alphanumeric")
|
|
71
|
-
String username,
|
|
72
|
-
|
|
73
|
-
@Min(value = 18, message = "Must be at least 18")
|
|
74
|
-
@Max(value = 120, message = "Must be at most 120")
|
|
75
|
-
Integer age
|
|
76
|
-
) {}
|
|
77
|
-
|
|
78
|
-
public record UserUpdateRequest(
|
|
79
|
-
@Email(message = "Email must be valid")
|
|
80
|
-
String email,
|
|
81
|
-
|
|
82
|
-
@Size(min = 3, max = 50)
|
|
83
|
-
String username
|
|
84
|
-
) {}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Response DTOs
|
|
88
|
-
|
|
89
|
-
```java
|
|
90
|
-
public record UserResponse(
|
|
91
|
-
Long id,
|
|
92
|
-
String email,
|
|
93
|
-
String username,
|
|
94
|
-
Integer age,
|
|
95
|
-
Boolean active,
|
|
96
|
-
LocalDateTime createdAt,
|
|
97
|
-
LocalDateTime updatedAt
|
|
98
|
-
) {
|
|
99
|
-
public static UserResponse from(User user) {
|
|
100
|
-
return new UserResponse(
|
|
101
|
-
user.getId(),
|
|
102
|
-
user.getEmail(),
|
|
103
|
-
user.getUsername(),
|
|
104
|
-
user.getAge(),
|
|
105
|
-
user.getActive(),
|
|
106
|
-
user.getCreatedAt(),
|
|
107
|
-
user.getUpdatedAt()
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
## Global Exception Handling
|
|
114
|
-
|
|
115
|
-
```java
|
|
116
|
-
@RestControllerAdvice
|
|
117
|
-
@Slf4j
|
|
118
|
-
public class GlobalExceptionHandler {
|
|
119
|
-
|
|
120
|
-
@ExceptionHandler(ResourceNotFoundException.class)
|
|
121
|
-
public ResponseEntity<ErrorResponse> handleNotFound(
|
|
122
|
-
ResourceNotFoundException ex, WebRequest request) {
|
|
123
|
-
log.error("Resource not found: {}", ex.getMessage());
|
|
124
|
-
ErrorResponse error = new ErrorResponse(
|
|
125
|
-
HttpStatus.NOT_FOUND.value(),
|
|
126
|
-
ex.getMessage(),
|
|
127
|
-
request.getDescription(false),
|
|
128
|
-
LocalDateTime.now()
|
|
129
|
-
);
|
|
130
|
-
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
@ExceptionHandler(MethodArgumentNotValidException.class)
|
|
134
|
-
public ResponseEntity<ValidationErrorResponse> handleValidation(
|
|
135
|
-
MethodArgumentNotValidException ex) {
|
|
136
|
-
Map<String, String> errors = ex.getBindingResult()
|
|
137
|
-
.getFieldErrors()
|
|
138
|
-
.stream()
|
|
139
|
-
.collect(Collectors.toMap(
|
|
140
|
-
FieldError::getField,
|
|
141
|
-
error -> error.getDefaultMessage() != null
|
|
142
|
-
? error.getDefaultMessage()
|
|
143
|
-
: "Invalid value"
|
|
144
|
-
));
|
|
145
|
-
|
|
146
|
-
ValidationErrorResponse response = new ValidationErrorResponse(
|
|
147
|
-
HttpStatus.BAD_REQUEST.value(),
|
|
148
|
-
"Validation failed",
|
|
149
|
-
errors,
|
|
150
|
-
LocalDateTime.now()
|
|
151
|
-
);
|
|
152
|
-
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
@ExceptionHandler(DataIntegrityViolationException.class)
|
|
156
|
-
public ResponseEntity<ErrorResponse> handleDataIntegrity(
|
|
157
|
-
DataIntegrityViolationException ex, WebRequest request) {
|
|
158
|
-
log.error("Data integrity violation", ex);
|
|
159
|
-
ErrorResponse error = new ErrorResponse(
|
|
160
|
-
HttpStatus.CONFLICT.value(),
|
|
161
|
-
"Data integrity violation - resource may already exist",
|
|
162
|
-
request.getDescription(false),
|
|
163
|
-
LocalDateTime.now()
|
|
164
|
-
);
|
|
165
|
-
return new ResponseEntity<>(error, HttpStatus.CONFLICT);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
@ExceptionHandler(Exception.class)
|
|
169
|
-
public ResponseEntity<ErrorResponse> handleGlobalException(
|
|
170
|
-
Exception ex, WebRequest request) {
|
|
171
|
-
log.error("Unexpected error", ex);
|
|
172
|
-
ErrorResponse error = new ErrorResponse(
|
|
173
|
-
HttpStatus.INTERNAL_SERVER_ERROR.value(),
|
|
174
|
-
"An unexpected error occurred",
|
|
175
|
-
request.getDescription(false),
|
|
176
|
-
LocalDateTime.now()
|
|
177
|
-
);
|
|
178
|
-
return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
record ErrorResponse(
|
|
183
|
-
int status,
|
|
184
|
-
String message,
|
|
185
|
-
String path,
|
|
186
|
-
LocalDateTime timestamp
|
|
187
|
-
) {}
|
|
188
|
-
|
|
189
|
-
record ValidationErrorResponse(
|
|
190
|
-
int status,
|
|
191
|
-
String message,
|
|
192
|
-
Map<String, String> errors,
|
|
193
|
-
LocalDateTime timestamp
|
|
194
|
-
) {}
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
## Custom Validation
|
|
198
|
-
|
|
199
|
-
```java
|
|
200
|
-
@Target({ElementType.FIELD, ElementType.PARAMETER})
|
|
201
|
-
@Retention(RetentionPolicy.RUNTIME)
|
|
202
|
-
@Constraint(validatedBy = UniqueEmailValidator.class)
|
|
203
|
-
public @interface UniqueEmail {
|
|
204
|
-
String message() default "Email already exists";
|
|
205
|
-
Class<?>[] groups() default {};
|
|
206
|
-
Class<? extends Payload>[] payload() default {};
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
@Component
|
|
210
|
-
@RequiredArgsConstructor
|
|
211
|
-
public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {
|
|
212
|
-
private final UserRepository userRepository;
|
|
213
|
-
|
|
214
|
-
@Override
|
|
215
|
-
public boolean isValid(String email, ConstraintValidatorContext context) {
|
|
216
|
-
if (email == null) return true;
|
|
217
|
-
return !userRepository.existsByEmail(email);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
## WebClient for External APIs
|
|
223
|
-
|
|
224
|
-
```java
|
|
225
|
-
@Configuration
|
|
226
|
-
public class WebClientConfig {
|
|
227
|
-
@Bean
|
|
228
|
-
public WebClient webClient(WebClient.Builder builder) {
|
|
229
|
-
return builder
|
|
230
|
-
.baseUrl("https://api.example.com")
|
|
231
|
-
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|
|
232
|
-
.filter(logRequest())
|
|
233
|
-
.build();
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
private ExchangeFilterFunction logRequest() {
|
|
237
|
-
return ExchangeFilterFunction.ofRequestProcessor(request -> {
|
|
238
|
-
log.info("Request: {} {}", request.method(), request.url());
|
|
239
|
-
return Mono.just(request);
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
@Service
|
|
245
|
-
@RequiredArgsConstructor
|
|
246
|
-
public class ExternalApiService {
|
|
247
|
-
private final WebClient webClient;
|
|
248
|
-
|
|
249
|
-
public Mono<ExternalDataResponse> fetchData(String id) {
|
|
250
|
-
return webClient
|
|
251
|
-
.get()
|
|
252
|
-
.uri("/data/{id}", id)
|
|
253
|
-
.retrieve()
|
|
254
|
-
.onStatus(HttpStatusCode::is4xxClientError, response ->
|
|
255
|
-
Mono.error(new ResourceNotFoundException("External resource not found")))
|
|
256
|
-
.onStatus(HttpStatusCode::is5xxServerError, response ->
|
|
257
|
-
Mono.error(new ServiceUnavailableException("External service unavailable")))
|
|
258
|
-
.bodyToMono(ExternalDataResponse.class)
|
|
259
|
-
.timeout(Duration.ofSeconds(5))
|
|
260
|
-
.retry(3);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
## CORS Configuration
|
|
266
|
-
|
|
267
|
-
```java
|
|
268
|
-
@Configuration
|
|
269
|
-
public class WebConfig implements WebMvcConfigurer {
|
|
270
|
-
|
|
271
|
-
@Override
|
|
272
|
-
public void addCorsMappings(CorsRegistry registry) {
|
|
273
|
-
registry.addMapping("/api/**")
|
|
274
|
-
.allowedOrigins("http://localhost:3000", "https://example.com")
|
|
275
|
-
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
|
|
276
|
-
.allowedHeaders("*")
|
|
277
|
-
.allowCredentials(true)
|
|
278
|
-
.maxAge(3600);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
## Quick Reference
|
|
284
|
-
|
|
285
|
-
| Annotation | Purpose |
|
|
286
|
-
|------------|---------|
|
|
287
|
-
| `@RestController` | Marks class as REST controller (combines @Controller + @ResponseBody) |
|
|
288
|
-
| `@RequestMapping` | Maps HTTP requests to handler methods |
|
|
289
|
-
| `@GetMapping/@PostMapping` | HTTP method-specific mappings |
|
|
290
|
-
| `@PathVariable` | Extracts values from URI path |
|
|
291
|
-
| `@RequestParam` | Extracts query parameters |
|
|
292
|
-
| `@RequestBody` | Binds request body to method parameter |
|
|
293
|
-
| `@Valid` | Triggers validation on request body |
|
|
294
|
-
| `@RestControllerAdvice` | Global exception handling for REST controllers |
|
|
295
|
-
| `@ResponseStatus` | Sets HTTP status code for method |
|
|
1
|
+
# Web Layer - Controllers & REST APIs
|
|
2
|
+
|
|
3
|
+
## REST Controller Pattern
|
|
4
|
+
|
|
5
|
+
```java
|
|
6
|
+
@RestController
|
|
7
|
+
@RequestMapping("/api/v1/users")
|
|
8
|
+
@Validated
|
|
9
|
+
@RequiredArgsConstructor
|
|
10
|
+
public class UserController {
|
|
11
|
+
private final UserService userService;
|
|
12
|
+
|
|
13
|
+
@GetMapping
|
|
14
|
+
public ResponseEntity<Page<UserResponse>> getUsers(
|
|
15
|
+
@PageableDefault(size = 20, sort = "createdAt") Pageable pageable) {
|
|
16
|
+
Page<UserResponse> users = userService.findAll(pageable);
|
|
17
|
+
return ResponseEntity.ok(users);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@GetMapping("/{id}")
|
|
21
|
+
public ResponseEntity<UserResponse> getUser(@PathVariable Long id) {
|
|
22
|
+
UserResponse user = userService.findById(id);
|
|
23
|
+
return ResponseEntity.ok(user);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@PostMapping
|
|
27
|
+
public ResponseEntity<UserResponse> createUser(
|
|
28
|
+
@Valid @RequestBody UserCreateRequest request) {
|
|
29
|
+
UserResponse user = userService.create(request);
|
|
30
|
+
URI location = ServletUriComponentsBuilder
|
|
31
|
+
.fromCurrentRequest()
|
|
32
|
+
.path("/{id}")
|
|
33
|
+
.buildAndExpand(user.id())
|
|
34
|
+
.toUri();
|
|
35
|
+
return ResponseEntity.created(location).body(user);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@PutMapping("/{id}")
|
|
39
|
+
public ResponseEntity<UserResponse> updateUser(
|
|
40
|
+
@PathVariable Long id,
|
|
41
|
+
@Valid @RequestBody UserUpdateRequest request) {
|
|
42
|
+
UserResponse user = userService.update(id, request);
|
|
43
|
+
return ResponseEntity.ok(user);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@DeleteMapping("/{id}")
|
|
47
|
+
@ResponseStatus(HttpStatus.NO_CONTENT)
|
|
48
|
+
public void deleteUser(@PathVariable Long id) {
|
|
49
|
+
userService.delete(id);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Request DTOs with Validation
|
|
55
|
+
|
|
56
|
+
```java
|
|
57
|
+
public record UserCreateRequest(
|
|
58
|
+
@NotBlank(message = "Email is required")
|
|
59
|
+
@Email(message = "Email must be valid")
|
|
60
|
+
String email,
|
|
61
|
+
|
|
62
|
+
@NotBlank(message = "Password is required")
|
|
63
|
+
@Size(min = 8, max = 100, message = "Password must be 8-100 characters")
|
|
64
|
+
@Pattern(regexp = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).*$",
|
|
65
|
+
message = "Password must contain uppercase, lowercase, and digit")
|
|
66
|
+
String password,
|
|
67
|
+
|
|
68
|
+
@NotBlank(message = "Username is required")
|
|
69
|
+
@Size(min = 3, max = 50)
|
|
70
|
+
@Pattern(regexp = "^[a-zA-Z0-9_]+$", message = "Username must be alphanumeric")
|
|
71
|
+
String username,
|
|
72
|
+
|
|
73
|
+
@Min(value = 18, message = "Must be at least 18")
|
|
74
|
+
@Max(value = 120, message = "Must be at most 120")
|
|
75
|
+
Integer age
|
|
76
|
+
) {}
|
|
77
|
+
|
|
78
|
+
public record UserUpdateRequest(
|
|
79
|
+
@Email(message = "Email must be valid")
|
|
80
|
+
String email,
|
|
81
|
+
|
|
82
|
+
@Size(min = 3, max = 50)
|
|
83
|
+
String username
|
|
84
|
+
) {}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Response DTOs
|
|
88
|
+
|
|
89
|
+
```java
|
|
90
|
+
public record UserResponse(
|
|
91
|
+
Long id,
|
|
92
|
+
String email,
|
|
93
|
+
String username,
|
|
94
|
+
Integer age,
|
|
95
|
+
Boolean active,
|
|
96
|
+
LocalDateTime createdAt,
|
|
97
|
+
LocalDateTime updatedAt
|
|
98
|
+
) {
|
|
99
|
+
public static UserResponse from(User user) {
|
|
100
|
+
return new UserResponse(
|
|
101
|
+
user.getId(),
|
|
102
|
+
user.getEmail(),
|
|
103
|
+
user.getUsername(),
|
|
104
|
+
user.getAge(),
|
|
105
|
+
user.getActive(),
|
|
106
|
+
user.getCreatedAt(),
|
|
107
|
+
user.getUpdatedAt()
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Global Exception Handling
|
|
114
|
+
|
|
115
|
+
```java
|
|
116
|
+
@RestControllerAdvice
|
|
117
|
+
@Slf4j
|
|
118
|
+
public class GlobalExceptionHandler {
|
|
119
|
+
|
|
120
|
+
@ExceptionHandler(ResourceNotFoundException.class)
|
|
121
|
+
public ResponseEntity<ErrorResponse> handleNotFound(
|
|
122
|
+
ResourceNotFoundException ex, WebRequest request) {
|
|
123
|
+
log.error("Resource not found: {}", ex.getMessage());
|
|
124
|
+
ErrorResponse error = new ErrorResponse(
|
|
125
|
+
HttpStatus.NOT_FOUND.value(),
|
|
126
|
+
ex.getMessage(),
|
|
127
|
+
request.getDescription(false),
|
|
128
|
+
LocalDateTime.now()
|
|
129
|
+
);
|
|
130
|
+
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@ExceptionHandler(MethodArgumentNotValidException.class)
|
|
134
|
+
public ResponseEntity<ValidationErrorResponse> handleValidation(
|
|
135
|
+
MethodArgumentNotValidException ex) {
|
|
136
|
+
Map<String, String> errors = ex.getBindingResult()
|
|
137
|
+
.getFieldErrors()
|
|
138
|
+
.stream()
|
|
139
|
+
.collect(Collectors.toMap(
|
|
140
|
+
FieldError::getField,
|
|
141
|
+
error -> error.getDefaultMessage() != null
|
|
142
|
+
? error.getDefaultMessage()
|
|
143
|
+
: "Invalid value"
|
|
144
|
+
));
|
|
145
|
+
|
|
146
|
+
ValidationErrorResponse response = new ValidationErrorResponse(
|
|
147
|
+
HttpStatus.BAD_REQUEST.value(),
|
|
148
|
+
"Validation failed",
|
|
149
|
+
errors,
|
|
150
|
+
LocalDateTime.now()
|
|
151
|
+
);
|
|
152
|
+
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
@ExceptionHandler(DataIntegrityViolationException.class)
|
|
156
|
+
public ResponseEntity<ErrorResponse> handleDataIntegrity(
|
|
157
|
+
DataIntegrityViolationException ex, WebRequest request) {
|
|
158
|
+
log.error("Data integrity violation", ex);
|
|
159
|
+
ErrorResponse error = new ErrorResponse(
|
|
160
|
+
HttpStatus.CONFLICT.value(),
|
|
161
|
+
"Data integrity violation - resource may already exist",
|
|
162
|
+
request.getDescription(false),
|
|
163
|
+
LocalDateTime.now()
|
|
164
|
+
);
|
|
165
|
+
return new ResponseEntity<>(error, HttpStatus.CONFLICT);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@ExceptionHandler(Exception.class)
|
|
169
|
+
public ResponseEntity<ErrorResponse> handleGlobalException(
|
|
170
|
+
Exception ex, WebRequest request) {
|
|
171
|
+
log.error("Unexpected error", ex);
|
|
172
|
+
ErrorResponse error = new ErrorResponse(
|
|
173
|
+
HttpStatus.INTERNAL_SERVER_ERROR.value(),
|
|
174
|
+
"An unexpected error occurred",
|
|
175
|
+
request.getDescription(false),
|
|
176
|
+
LocalDateTime.now()
|
|
177
|
+
);
|
|
178
|
+
return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
record ErrorResponse(
|
|
183
|
+
int status,
|
|
184
|
+
String message,
|
|
185
|
+
String path,
|
|
186
|
+
LocalDateTime timestamp
|
|
187
|
+
) {}
|
|
188
|
+
|
|
189
|
+
record ValidationErrorResponse(
|
|
190
|
+
int status,
|
|
191
|
+
String message,
|
|
192
|
+
Map<String, String> errors,
|
|
193
|
+
LocalDateTime timestamp
|
|
194
|
+
) {}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Custom Validation
|
|
198
|
+
|
|
199
|
+
```java
|
|
200
|
+
@Target({ElementType.FIELD, ElementType.PARAMETER})
|
|
201
|
+
@Retention(RetentionPolicy.RUNTIME)
|
|
202
|
+
@Constraint(validatedBy = UniqueEmailValidator.class)
|
|
203
|
+
public @interface UniqueEmail {
|
|
204
|
+
String message() default "Email already exists";
|
|
205
|
+
Class<?>[] groups() default {};
|
|
206
|
+
Class<? extends Payload>[] payload() default {};
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
@Component
|
|
210
|
+
@RequiredArgsConstructor
|
|
211
|
+
public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {
|
|
212
|
+
private final UserRepository userRepository;
|
|
213
|
+
|
|
214
|
+
@Override
|
|
215
|
+
public boolean isValid(String email, ConstraintValidatorContext context) {
|
|
216
|
+
if (email == null) return true;
|
|
217
|
+
return !userRepository.existsByEmail(email);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## WebClient for External APIs
|
|
223
|
+
|
|
224
|
+
```java
|
|
225
|
+
@Configuration
|
|
226
|
+
public class WebClientConfig {
|
|
227
|
+
@Bean
|
|
228
|
+
public WebClient webClient(WebClient.Builder builder) {
|
|
229
|
+
return builder
|
|
230
|
+
.baseUrl("https://api.example.com")
|
|
231
|
+
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|
|
232
|
+
.filter(logRequest())
|
|
233
|
+
.build();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
private ExchangeFilterFunction logRequest() {
|
|
237
|
+
return ExchangeFilterFunction.ofRequestProcessor(request -> {
|
|
238
|
+
log.info("Request: {} {}", request.method(), request.url());
|
|
239
|
+
return Mono.just(request);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
@Service
|
|
245
|
+
@RequiredArgsConstructor
|
|
246
|
+
public class ExternalApiService {
|
|
247
|
+
private final WebClient webClient;
|
|
248
|
+
|
|
249
|
+
public Mono<ExternalDataResponse> fetchData(String id) {
|
|
250
|
+
return webClient
|
|
251
|
+
.get()
|
|
252
|
+
.uri("/data/{id}", id)
|
|
253
|
+
.retrieve()
|
|
254
|
+
.onStatus(HttpStatusCode::is4xxClientError, response ->
|
|
255
|
+
Mono.error(new ResourceNotFoundException("External resource not found")))
|
|
256
|
+
.onStatus(HttpStatusCode::is5xxServerError, response ->
|
|
257
|
+
Mono.error(new ServiceUnavailableException("External service unavailable")))
|
|
258
|
+
.bodyToMono(ExternalDataResponse.class)
|
|
259
|
+
.timeout(Duration.ofSeconds(5))
|
|
260
|
+
.retry(3);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## CORS Configuration
|
|
266
|
+
|
|
267
|
+
```java
|
|
268
|
+
@Configuration
|
|
269
|
+
public class WebConfig implements WebMvcConfigurer {
|
|
270
|
+
|
|
271
|
+
@Override
|
|
272
|
+
public void addCorsMappings(CorsRegistry registry) {
|
|
273
|
+
registry.addMapping("/api/**")
|
|
274
|
+
.allowedOrigins("http://localhost:3000", "https://example.com")
|
|
275
|
+
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
|
|
276
|
+
.allowedHeaders("*")
|
|
277
|
+
.allowCredentials(true)
|
|
278
|
+
.maxAge(3600);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Quick Reference
|
|
284
|
+
|
|
285
|
+
| Annotation | Purpose |
|
|
286
|
+
|------------|---------|
|
|
287
|
+
| `@RestController` | Marks class as REST controller (combines @Controller + @ResponseBody) |
|
|
288
|
+
| `@RequestMapping` | Maps HTTP requests to handler methods |
|
|
289
|
+
| `@GetMapping/@PostMapping` | HTTP method-specific mappings |
|
|
290
|
+
| `@PathVariable` | Extracts values from URI path |
|
|
291
|
+
| `@RequestParam` | Extracts query parameters |
|
|
292
|
+
| `@RequestBody` | Binds request body to method parameter |
|
|
293
|
+
| `@Valid` | Triggers validation on request body |
|
|
294
|
+
| `@RestControllerAdvice` | Global exception handling for REST controllers |
|
|
295
|
+
| `@ResponseStatus` | Sets HTTP status code for method |
|