@zimezone/z-command 1.1.1 → 1.1.4

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.
Files changed (288) hide show
  1. package/README.md +13 -1
  2. package/dist/cli.js +1 -1
  3. package/dist/commands/init.d.ts.map +1 -1
  4. package/dist/commands/init.js +42 -10
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/platforms.d.ts.map +1 -1
  7. package/dist/platforms.js +11 -1
  8. package/dist/platforms.js.map +1 -1
  9. package/dist/types.d.ts +2 -0
  10. package/dist/types.d.ts.map +1 -1
  11. package/package.json +8 -3
  12. package/templates.zip +0 -0
  13. package/templates/agents/accessibility-expert.agent.md +0 -56
  14. package/templates/agents/ai-engineer.agent.md +0 -61
  15. package/templates/agents/angular-architect.agent.md +0 -49
  16. package/templates/agents/api-designer.agent.md +0 -40
  17. package/templates/agents/api-documenter.agent.md +0 -161
  18. package/templates/agents/architect-review.agent.md +0 -146
  19. package/templates/agents/arm-cortex-expert.agent.md +0 -288
  20. package/templates/agents/azure-infra-engineer.agent.md +0 -57
  21. package/templates/agents/backend-architect.agent.md +0 -309
  22. package/templates/agents/backend-developer.agent.md +0 -61
  23. package/templates/agents/backend-security-coder.agent.md +0 -152
  24. package/templates/agents/bash-pro.agent.md +0 -285
  25. package/templates/agents/blockchain-developer.agent.md +0 -57
  26. package/templates/agents/build-engineer.agent.md +0 -56
  27. package/templates/agents/business-analyst.agent.md +0 -47
  28. package/templates/agents/c-pro.agent.md +0 -35
  29. package/templates/agents/c4-code.agent.md +0 -320
  30. package/templates/agents/c4-component.agent.md +0 -227
  31. package/templates/agents/c4-container.agent.md +0 -248
  32. package/templates/agents/c4-context.agent.md +0 -235
  33. package/templates/agents/cli-developer.agent.md +0 -57
  34. package/templates/agents/cloud-architect.agent.md +0 -56
  35. package/templates/agents/code-architect.agent.md +0 -63
  36. package/templates/agents/code-reviewer.agent.md +0 -49
  37. package/templates/agents/competitive-analyst.agent.md +0 -48
  38. package/templates/agents/conductor-validator.agent.md +0 -245
  39. package/templates/agents/context-manager.agent.md +0 -55
  40. package/templates/agents/cpp-pro.agent.md +0 -59
  41. package/templates/agents/csharp-developer.agent.md +0 -57
  42. package/templates/agents/csharp-pro.agent.md +0 -38
  43. package/templates/agents/customer-support.agent.md +0 -148
  44. package/templates/agents/data-engineer.agent.md +0 -55
  45. package/templates/agents/data-researcher.agent.md +0 -55
  46. package/templates/agents/data-scientist.agent.md +0 -56
  47. package/templates/agents/database-admin.agent.md +0 -142
  48. package/templates/agents/database-administrator.agent.md +0 -50
  49. package/templates/agents/database-architect.agent.md +0 -238
  50. package/templates/agents/database-optimizer.agent.md +0 -144
  51. package/templates/agents/debugger.agent.md +0 -30
  52. package/templates/agents/deployment-engineer.agent.md +0 -0
  53. package/templates/agents/devops-engineer.agent.md +0 -59
  54. package/templates/agents/devops-troubleshooter.agent.md +0 -138
  55. package/templates/agents/django-developer.agent.md +0 -50
  56. package/templates/agents/django-pro.agent.md +0 -159
  57. package/templates/agents/docs-architect.agent.md +0 -77
  58. package/templates/agents/documentation-engineer.agent.md +0 -57
  59. package/templates/agents/dotnet-architect.agent.md +0 -175
  60. package/templates/agents/dx-optimizer.agent.md +0 -63
  61. package/templates/agents/electron-pro.agent.md +0 -56
  62. package/templates/agents/elixir-pro.agent.md +0 -38
  63. package/templates/agents/embedded-systems.agent.md +0 -55
  64. package/templates/agents/error-detective.agent.md +0 -32
  65. package/templates/agents/event-sourcing-architect.agent.md +0 -42
  66. package/templates/agents/fastapi-pro.agent.md +0 -171
  67. package/templates/agents/fintech-engineer.agent.md +0 -57
  68. package/templates/agents/firmware-analyst.agent.md +0 -330
  69. package/templates/agents/flutter-expert.agent.md +0 -50
  70. package/templates/agents/frontend-developer.agent.md +0 -59
  71. package/templates/agents/frontend-security-coder.agent.md +0 -149
  72. package/templates/agents/fullstack-developer.agent.md +0 -46
  73. package/templates/agents/git-workflow-manager.agent.md +0 -57
  74. package/templates/agents/golang-pro.agent.md +0 -50
  75. package/templates/agents/graphql-architect.agent.md +0 -48
  76. package/templates/agents/haskell-pro.agent.md +0 -37
  77. package/templates/agents/hr-pro.agent.md +0 -105
  78. package/templates/agents/incident-responder.agent.md +0 -190
  79. package/templates/agents/ios-developer.agent.md +0 -198
  80. package/templates/agents/iot-engineer.agent.md +0 -56
  81. package/templates/agents/java-architect.agent.md +0 -48
  82. package/templates/agents/java-pro.agent.md +0 -156
  83. package/templates/agents/javascript-pro.agent.md +0 -35
  84. package/templates/agents/julia-pro.agent.md +0 -187
  85. package/templates/agents/kotlin-specialist.agent.md +0 -50
  86. package/templates/agents/laravel-specialist.agent.md +0 -50
  87. package/templates/agents/legacy-modernizer.agent.md +0 -56
  88. package/templates/agents/legal-advisor.agent.md +0 -49
  89. package/templates/agents/llm-architect.agent.md +0 -58
  90. package/templates/agents/malware-analyst.agent.md +0 -272
  91. package/templates/agents/mcp-developer.agent.md +0 -54
  92. package/templates/agents/mermaid-expert.agent.md +0 -39
  93. package/templates/agents/microservices-architect.agent.md +0 -47
  94. package/templates/agents/minecraft-bukkit-pro.agent.md +0 -104
  95. package/templates/agents/ml-engineer.agent.md +0 -56
  96. package/templates/agents/mlops-engineer.agent.md +0 -56
  97. package/templates/agents/mobile-developer.agent.md +0 -45
  98. package/templates/agents/mobile-security-coder.agent.md +0 -163
  99. package/templates/agents/monorepo-architect.agent.md +0 -44
  100. package/templates/agents/multi-agent-coordinator.agent.md +0 -55
  101. package/templates/agents/network-engineer.agent.md +0 -57
  102. package/templates/agents/nextjs-developer.agent.md +0 -48
  103. package/templates/agents/nlp-engineer.agent.md +0 -58
  104. package/templates/agents/observability-engineer.agent.md +0 -228
  105. package/templates/agents/payment-integration.agent.md +0 -56
  106. package/templates/agents/performance-engineer.agent.md +0 -167
  107. package/templates/agents/performance-optimizer.agent.md +0 -57
  108. package/templates/agents/php-pro.agent.md +0 -43
  109. package/templates/agents/platform-engineer.agent.md +0 -57
  110. package/templates/agents/posix-shell-pro.agent.md +0 -284
  111. package/templates/agents/postgres-pro.agent.md +0 -58
  112. package/templates/agents/product-manager.agent.md +0 -55
  113. package/templates/agents/project-manager.agent.md +0 -57
  114. package/templates/agents/prompt-engineer.agent.md +0 -58
  115. package/templates/agents/python-pro.agent.md +0 -48
  116. package/templates/agents/quant-analyst.agent.md +0 -32
  117. package/templates/agents/rails-expert.agent.md +0 -50
  118. package/templates/agents/react-specialist.agent.md +0 -49
  119. package/templates/agents/refactoring-specialist.agent.md +0 -56
  120. package/templates/agents/reference-builder.agent.md +0 -167
  121. package/templates/agents/research-analyst.agent.md +0 -63
  122. package/templates/agents/reverse-engineer.agent.md +0 -202
  123. package/templates/agents/risk-manager.agent.md +0 -41
  124. package/templates/agents/ruby-pro.agent.md +0 -35
  125. package/templates/agents/rust-pro.agent.md +0 -156
  126. package/templates/agents/sales-automator.agent.md +0 -35
  127. package/templates/agents/scala-pro.agent.md +0 -60
  128. package/templates/agents/scrum-master.agent.md +0 -54
  129. package/templates/agents/search-specialist.agent.md +0 -59
  130. package/templates/agents/security-analyst.agent.md +0 -57
  131. package/templates/agents/security-auditor.agent.md +0 -138
  132. package/templates/agents/security-engineer.agent.md +0 -57
  133. package/templates/agents/seo-authority-builder.agent.md +0 -116
  134. package/templates/agents/seo-cannibalization-detector.agent.md +0 -103
  135. package/templates/agents/seo-content-auditor.agent.md +0 -63
  136. package/templates/agents/seo-content-planner.agent.md +0 -88
  137. package/templates/agents/seo-content-refresher.agent.md +0 -98
  138. package/templates/agents/seo-content-writer.agent.md +0 -76
  139. package/templates/agents/seo-keyword-strategist.agent.md +0 -75
  140. package/templates/agents/seo-meta-optimizer.agent.md +0 -72
  141. package/templates/agents/seo-snippet-hunter.agent.md +0 -94
  142. package/templates/agents/seo-specialist.agent.md +0 -57
  143. package/templates/agents/seo-structure-architect.agent.md +0 -88
  144. package/templates/agents/service-mesh-expert.agent.md +0 -41
  145. package/templates/agents/sql-pro.agent.md +0 -146
  146. package/templates/agents/sre-engineer.agent.md +0 -58
  147. package/templates/agents/swift-expert.agent.md +0 -49
  148. package/templates/agents/task-distributor.agent.md +0 -47
  149. package/templates/agents/tdd-orchestrator.agent.md +0 -183
  150. package/templates/agents/technical-writer.agent.md +0 -48
  151. package/templates/agents/temporal-python-pro.agent.md +0 -349
  152. package/templates/agents/terraform-engineer.agent.md +0 -57
  153. package/templates/agents/terraform-specialist.agent.md +0 -137
  154. package/templates/agents/test-automator.agent.md +0 -203
  155. package/templates/agents/test-engineer.agent.md +0 -55
  156. package/templates/agents/threat-modeling-expert.agent.md +0 -44
  157. package/templates/agents/trend-analyst.agent.md +0 -47
  158. package/templates/agents/tutorial-engineer.agent.md +0 -118
  159. package/templates/agents/typescript-pro.agent.md +0 -48
  160. package/templates/agents/ui-designer.agent.md +0 -48
  161. package/templates/agents/ui-ux-designer.agent.md +0 -188
  162. package/templates/agents/ui-visual-validator.agent.md +0 -192
  163. package/templates/agents/ux-researcher.agent.md +0 -48
  164. package/templates/agents/vector-database-engineer.agent.md +0 -43
  165. package/templates/agents/vue-expert.agent.md +0 -48
  166. package/templates/agents/websocket-engineer.agent.md +0 -49
  167. package/templates/agents/workflow-orchestrator.agent.md +0 -48
  168. package/templates/skills/angular-migration/SKILL.md +0 -410
  169. package/templates/skills/api-design-principles/SKILL.md +0 -528
  170. package/templates/skills/api-design-principles/assets/api-design-checklist.md +0 -155
  171. package/templates/skills/api-design-principles/assets/rest-api-template.py +0 -182
  172. package/templates/skills/api-design-principles/references/graphql-schema-design.md +0 -583
  173. package/templates/skills/api-design-principles/references/rest-best-practices.md +0 -408
  174. package/templates/skills/architecture-decision-records/SKILL.md +0 -428
  175. package/templates/skills/architecture-patterns/SKILL.md +0 -494
  176. package/templates/skills/async-python-patterns/SKILL.md +0 -694
  177. package/templates/skills/auth-implementation-patterns/SKILL.md +0 -634
  178. package/templates/skills/changelog-automation/SKILL.md +0 -552
  179. package/templates/skills/code-review/SKILL.md +0 -62
  180. package/templates/skills/code-review-excellence/SKILL.md +0 -520
  181. package/templates/skills/competitive-landscape/SKILL.md +0 -479
  182. package/templates/skills/context-driven-development/SKILL.md +0 -385
  183. package/templates/skills/cost-optimization/SKILL.md +0 -274
  184. package/templates/skills/cqrs-implementation/SKILL.md +0 -554
  185. package/templates/skills/data-quality-frameworks/SKILL.md +0 -587
  186. package/templates/skills/data-storytelling/SKILL.md +0 -453
  187. package/templates/skills/database-migration/SKILL.md +0 -424
  188. package/templates/skills/dbt-transformation-patterns/SKILL.md +0 -561
  189. package/templates/skills/debugging-strategies/SKILL.md +0 -527
  190. package/templates/skills/defi-protocol-templates/SKILL.md +0 -454
  191. package/templates/skills/dependency-upgrade/SKILL.md +0 -409
  192. package/templates/skills/deployment-pipeline-design/SKILL.md +0 -359
  193. package/templates/skills/distributed-tracing/SKILL.md +0 -438
  194. package/templates/skills/dotnet-backend-patterns/SKILL.md +0 -815
  195. package/templates/skills/dotnet-backend-patterns/assets/repository-template.cs +0 -523
  196. package/templates/skills/dotnet-backend-patterns/assets/service-template.cs +0 -336
  197. package/templates/skills/dotnet-backend-patterns/references/dapper-patterns.md +0 -544
  198. package/templates/skills/dotnet-backend-patterns/references/ef-core-best-practices.md +0 -355
  199. package/templates/skills/e2e-testing-patterns/SKILL.md +0 -547
  200. package/templates/skills/employment-contract-templates/SKILL.md +0 -507
  201. package/templates/skills/error-handling-patterns/SKILL.md +0 -636
  202. package/templates/skills/event-store-design/SKILL.md +0 -437
  203. package/templates/skills/fastapi-templates/SKILL.md +0 -567
  204. package/templates/skills/git-advanced-workflows/SKILL.md +0 -400
  205. package/templates/skills/github-actions-templates/SKILL.md +0 -333
  206. package/templates/skills/go-concurrency-patterns/SKILL.md +0 -655
  207. package/templates/skills/grafana-dashboards/SKILL.md +0 -369
  208. package/templates/skills/helm-chart-scaffolding/SKILL.md +0 -544
  209. package/templates/skills/helm-chart-scaffolding/assets/Chart.yaml.template +0 -42
  210. package/templates/skills/helm-chart-scaffolding/assets/values.yaml.template +0 -185
  211. package/templates/skills/helm-chart-scaffolding/references/chart-structure.md +0 -500
  212. package/templates/skills/helm-chart-scaffolding/scripts/validate-chart.sh +0 -244
  213. package/templates/skills/javascript-testing-patterns/SKILL.md +0 -1025
  214. package/templates/skills/langchain-architecture/SKILL.md +0 -338
  215. package/templates/skills/llm-evaluation/SKILL.md +0 -471
  216. package/templates/skills/microservices-patterns/SKILL.md +0 -595
  217. package/templates/skills/modern-javascript-patterns/SKILL.md +0 -911
  218. package/templates/skills/monorepo-management/SKILL.md +0 -622
  219. package/templates/skills/nextjs-app-router-patterns/SKILL.md +0 -544
  220. package/templates/skills/nodejs-backend-patterns/SKILL.md +0 -1020
  221. package/templates/skills/nx-workspace-patterns/SKILL.md +0 -452
  222. package/templates/skills/openapi-spec-generation/SKILL.md +0 -1028
  223. package/templates/skills/paypal-integration/SKILL.md +0 -467
  224. package/templates/skills/pci-compliance/SKILL.md +0 -466
  225. package/templates/skills/postgresql/SKILL.md +0 -204
  226. package/templates/skills/projection-patterns/SKILL.md +0 -490
  227. package/templates/skills/prometheus-configuration/SKILL.md +0 -392
  228. package/templates/skills/prompt-engineering-patterns/SKILL.md +0 -201
  229. package/templates/skills/prompt-engineering-patterns/assets/few-shot-examples.json +0 -106
  230. package/templates/skills/prompt-engineering-patterns/assets/prompt-template-library.md +0 -246
  231. package/templates/skills/prompt-engineering-patterns/references/chain-of-thought.md +0 -399
  232. package/templates/skills/prompt-engineering-patterns/references/few-shot-learning.md +0 -369
  233. package/templates/skills/prompt-engineering-patterns/references/prompt-optimization.md +0 -414
  234. package/templates/skills/prompt-engineering-patterns/references/prompt-templates.md +0 -470
  235. package/templates/skills/prompt-engineering-patterns/references/system-prompts.md +0 -189
  236. package/templates/skills/prompt-engineering-patterns/scripts/optimize-prompt.py +0 -279
  237. package/templates/skills/python-packaging/SKILL.md +0 -870
  238. package/templates/skills/python-performance-optimization/SKILL.md +0 -869
  239. package/templates/skills/python-testing-patterns/SKILL.md +0 -907
  240. package/templates/skills/rag-implementation/SKILL.md +0 -403
  241. package/templates/skills/react-modernization/SKILL.md +0 -513
  242. package/templates/skills/react-native-architecture/SKILL.md +0 -671
  243. package/templates/skills/react-state-management/SKILL.md +0 -429
  244. package/templates/skills/risk-metrics-calculation/SKILL.md +0 -555
  245. package/templates/skills/rust-async-patterns/SKILL.md +0 -517
  246. package/templates/skills/secrets-management/SKILL.md +0 -346
  247. package/templates/skills/security-requirement-extraction/SKILL.md +0 -677
  248. package/templates/skills/security-review/SKILL.md +0 -78
  249. package/templates/skills/shellcheck-configuration/SKILL.md +0 -454
  250. package/templates/skills/similarity-search-patterns/SKILL.md +0 -558
  251. package/templates/skills/slo-implementation/SKILL.md +0 -329
  252. package/templates/skills/sql-optimization-patterns/SKILL.md +0 -493
  253. package/templates/skills/stripe-integration/SKILL.md +0 -442
  254. package/templates/skills/systematic-debugging/SKILL.md +0 -57
  255. package/templates/skills/tailwind-design-system/SKILL.md +0 -666
  256. package/templates/skills/temporal-python-testing/SKILL.md +0 -158
  257. package/templates/skills/temporal-python-testing/resources/integration-testing.md +0 -455
  258. package/templates/skills/temporal-python-testing/resources/local-setup.md +0 -553
  259. package/templates/skills/temporal-python-testing/resources/replay-testing.md +0 -462
  260. package/templates/skills/temporal-python-testing/resources/unit-testing.md +0 -328
  261. package/templates/skills/terraform-module-library/SKILL.md +0 -249
  262. package/templates/skills/terraform-module-library/references/aws-modules.md +0 -63
  263. package/templates/skills/test-driven-development/SKILL.md +0 -46
  264. package/templates/skills/threat-mitigation-mapping/SKILL.md +0 -745
  265. package/templates/skills/track-management/SKILL.md +0 -593
  266. package/templates/skills/typescript-advanced-types/SKILL.md +0 -717
  267. package/templates/skills/ui-ux-pro-max/SKILL.md +0 -352
  268. package/templates/skills/ui-ux-pro-max/data/charts.csv +0 -26
  269. package/templates/skills/ui-ux-pro-max/data/colors.csv +0 -97
  270. package/templates/skills/ui-ux-pro-max/data/icons.csv +0 -101
  271. package/templates/skills/ui-ux-pro-max/data/landing.csv +0 -31
  272. package/templates/skills/ui-ux-pro-max/data/products.csv +0 -97
  273. package/templates/skills/ui-ux-pro-max/data/prompts.csv +0 -24
  274. package/templates/skills/ui-ux-pro-max/data/react-performance.csv +0 -45
  275. package/templates/skills/ui-ux-pro-max/data/styles.csv +0 -59
  276. package/templates/skills/ui-ux-pro-max/data/typography.csv +0 -58
  277. package/templates/skills/ui-ux-pro-max/data/ui-reasoning.csv +0 -101
  278. package/templates/skills/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  279. package/templates/skills/ui-ux-pro-max/data/web-interface.csv +0 -31
  280. package/templates/skills/ui-ux-pro-max/scripts/core.py +0 -258
  281. package/templates/skills/ui-ux-pro-max/scripts/design_system.py +0 -547
  282. package/templates/skills/ui-ux-pro-max/scripts/search.py +0 -76
  283. package/templates/skills/uv-package-manager/SKILL.md +0 -831
  284. package/templates/skills/vector-index-tuning/SKILL.md +0 -521
  285. package/templates/skills/wcag-audit-patterns/SKILL.md +0 -555
  286. package/templates/skills/workflow-orchestration-patterns/SKILL.md +0 -316
  287. package/templates/skills/workflow-patterns/SKILL.md +0 -623
  288. package/templates/skills/writing-plans/SKILL.md +0 -64
@@ -1,336 +0,0 @@
1
- // Service Implementation Template for .NET 8+
2
- // This template demonstrates best practices for building robust services
3
-
4
- using System.Text.Json;
5
- using FluentValidation;
6
- using Microsoft.Extensions.Logging;
7
- using Microsoft.Extensions.Options;
8
-
9
- namespace YourNamespace.Application.Services;
10
-
11
- /// <summary>
12
- /// Configuration options for the service
13
- /// </summary>
14
- public class ProductServiceOptions
15
- {
16
- public const string SectionName = "ProductService";
17
-
18
- public int DefaultPageSize { get; set; } = 50;
19
- public int MaxPageSize { get; set; } = 200;
20
- public TimeSpan CacheDuration { get; set; } = TimeSpan.FromMinutes(15);
21
- public bool EnableEnrichment { get; set; } = true;
22
- }
23
-
24
- /// <summary>
25
- /// Generic result type for operations that can fail
26
- /// </summary>
27
- public class Result<T>
28
- {
29
- public bool IsSuccess { get; }
30
- public T? Value { get; }
31
- public string? Error { get; }
32
- public string? ErrorCode { get; }
33
-
34
- private Result(bool isSuccess, T? value, string? error, string? errorCode)
35
- {
36
- IsSuccess = isSuccess;
37
- Value = value;
38
- Error = error;
39
- ErrorCode = errorCode;
40
- }
41
-
42
- public static Result<T> Success(T value) => new(true, value, null, null);
43
- public static Result<T> Failure(string error, string? code = null) => new(false, default, error, code);
44
-
45
- public Result<TNew> Map<TNew>(Func<T, TNew> mapper) =>
46
- IsSuccess ? Result<TNew>.Success(mapper(Value!)) : Result<TNew>.Failure(Error!, ErrorCode);
47
- }
48
-
49
- /// <summary>
50
- /// Service interface - define the contract
51
- /// </summary>
52
- public interface IProductService
53
- {
54
- Task<Result<Product>> GetByIdAsync(string id, CancellationToken ct = default);
55
- Task<Result<PagedResult<Product>>> SearchAsync(ProductSearchRequest request, CancellationToken ct = default);
56
- Task<Result<Product>> CreateAsync(CreateProductRequest request, CancellationToken ct = default);
57
- Task<Result<Product>> UpdateAsync(string id, UpdateProductRequest request, CancellationToken ct = default);
58
- Task<Result<bool>> DeleteAsync(string id, CancellationToken ct = default);
59
- }
60
-
61
- /// <summary>
62
- /// Service implementation with full patterns
63
- /// </summary>
64
- public class ProductService : IProductService
65
- {
66
- private readonly IProductRepository _repository;
67
- private readonly ICacheService _cache;
68
- private readonly IValidator<CreateProductRequest> _createValidator;
69
- private readonly IValidator<UpdateProductRequest> _updateValidator;
70
- private readonly ILogger<ProductService> _logger;
71
- private readonly ProductServiceOptions _options;
72
-
73
- public ProductService(
74
- IProductRepository repository,
75
- ICacheService cache,
76
- IValidator<CreateProductRequest> createValidator,
77
- IValidator<UpdateProductRequest> updateValidator,
78
- ILogger<ProductService> logger,
79
- IOptions<ProductServiceOptions> options)
80
- {
81
- _repository = repository ?? throw new ArgumentNullException(nameof(repository));
82
- _cache = cache ?? throw new ArgumentNullException(nameof(cache));
83
- _createValidator = createValidator ?? throw new ArgumentNullException(nameof(createValidator));
84
- _updateValidator = updateValidator ?? throw new ArgumentNullException(nameof(updateValidator));
85
- _logger = logger ?? throw new ArgumentNullException(nameof(logger));
86
- _options = options?.Value ?? throw new ArgumentNullException(nameof(options));
87
- }
88
-
89
- public async Task<Result<Product>> GetByIdAsync(string id, CancellationToken ct = default)
90
- {
91
- if (string.IsNullOrWhiteSpace(id))
92
- return Result<Product>.Failure("Product ID is required", "INVALID_ID");
93
-
94
- try
95
- {
96
- // Try cache first
97
- var cacheKey = GetCacheKey(id);
98
- var cached = await _cache.GetAsync<Product>(cacheKey, ct);
99
-
100
- if (cached != null)
101
- {
102
- _logger.LogDebug("Cache hit for product {ProductId}", id);
103
- return Result<Product>.Success(cached);
104
- }
105
-
106
- // Fetch from repository
107
- var product = await _repository.GetByIdAsync(id, ct);
108
-
109
- if (product == null)
110
- {
111
- _logger.LogWarning("Product not found: {ProductId}", id);
112
- return Result<Product>.Failure($"Product '{id}' not found", "NOT_FOUND");
113
- }
114
-
115
- // Populate cache
116
- await _cache.SetAsync(cacheKey, product, _options.CacheDuration, ct);
117
-
118
- return Result<Product>.Success(product);
119
- }
120
- catch (Exception ex)
121
- {
122
- _logger.LogError(ex, "Error retrieving product {ProductId}", id);
123
- return Result<Product>.Failure("An error occurred while retrieving the product", "INTERNAL_ERROR");
124
- }
125
- }
126
-
127
- public async Task<Result<PagedResult<Product>>> SearchAsync(
128
- ProductSearchRequest request,
129
- CancellationToken ct = default)
130
- {
131
- try
132
- {
133
- // Sanitize pagination
134
- var pageSize = Math.Clamp(request.PageSize ?? _options.DefaultPageSize, 1, _options.MaxPageSize);
135
- var page = Math.Max(request.Page ?? 1, 1);
136
-
137
- var sanitizedRequest = request with
138
- {
139
- PageSize = pageSize,
140
- Page = page
141
- };
142
-
143
- // Execute search
144
- var (items, totalCount) = await _repository.SearchAsync(sanitizedRequest, ct);
145
-
146
- var result = new PagedResult<Product>
147
- {
148
- Items = items,
149
- TotalCount = totalCount,
150
- Page = page,
151
- PageSize = pageSize,
152
- TotalPages = (int)Math.Ceiling((double)totalCount / pageSize)
153
- };
154
-
155
- return Result<PagedResult<Product>>.Success(result);
156
- }
157
- catch (Exception ex)
158
- {
159
- _logger.LogError(ex, "Error searching products with request {@Request}", request);
160
- return Result<PagedResult<Product>>.Failure("An error occurred while searching products", "INTERNAL_ERROR");
161
- }
162
- }
163
-
164
- public async Task<Result<Product>> CreateAsync(CreateProductRequest request, CancellationToken ct = default)
165
- {
166
- // Validate
167
- var validation = await _createValidator.ValidateAsync(request, ct);
168
- if (!validation.IsValid)
169
- {
170
- var errors = string.Join("; ", validation.Errors.Select(e => e.ErrorMessage));
171
- return Result<Product>.Failure(errors, "VALIDATION_ERROR");
172
- }
173
-
174
- try
175
- {
176
- // Check for duplicates
177
- var existing = await _repository.GetBySkuAsync(request.Sku, ct);
178
- if (existing != null)
179
- return Result<Product>.Failure($"Product with SKU '{request.Sku}' already exists", "DUPLICATE_SKU");
180
-
181
- // Create entity
182
- var product = new Product
183
- {
184
- Id = Guid.NewGuid().ToString("N"),
185
- Name = request.Name,
186
- Sku = request.Sku,
187
- Price = request.Price,
188
- CategoryId = request.CategoryId,
189
- CreatedAt = DateTime.UtcNow
190
- };
191
-
192
- // Persist
193
- var created = await _repository.CreateAsync(product, ct);
194
-
195
- _logger.LogInformation("Created product {ProductId} with SKU {Sku}", created.Id, created.Sku);
196
-
197
- return Result<Product>.Success(created);
198
- }
199
- catch (Exception ex)
200
- {
201
- _logger.LogError(ex, "Error creating product with SKU {Sku}", request.Sku);
202
- return Result<Product>.Failure("An error occurred while creating the product", "INTERNAL_ERROR");
203
- }
204
- }
205
-
206
- public async Task<Result<Product>> UpdateAsync(
207
- string id,
208
- UpdateProductRequest request,
209
- CancellationToken ct = default)
210
- {
211
- if (string.IsNullOrWhiteSpace(id))
212
- return Result<Product>.Failure("Product ID is required", "INVALID_ID");
213
-
214
- // Validate
215
- var validation = await _updateValidator.ValidateAsync(request, ct);
216
- if (!validation.IsValid)
217
- {
218
- var errors = string.Join("; ", validation.Errors.Select(e => e.ErrorMessage));
219
- return Result<Product>.Failure(errors, "VALIDATION_ERROR");
220
- }
221
-
222
- try
223
- {
224
- // Fetch existing
225
- var existing = await _repository.GetByIdAsync(id, ct);
226
- if (existing == null)
227
- return Result<Product>.Failure($"Product '{id}' not found", "NOT_FOUND");
228
-
229
- // Apply updates (only non-null values)
230
- if (request.Name != null) existing.Name = request.Name;
231
- if (request.Price.HasValue) existing.Price = request.Price.Value;
232
- if (request.CategoryId.HasValue) existing.CategoryId = request.CategoryId.Value;
233
- existing.UpdatedAt = DateTime.UtcNow;
234
-
235
- // Persist
236
- var updated = await _repository.UpdateAsync(existing, ct);
237
-
238
- // Invalidate cache
239
- await _cache.RemoveAsync(GetCacheKey(id), ct);
240
-
241
- _logger.LogInformation("Updated product {ProductId}", id);
242
-
243
- return Result<Product>.Success(updated);
244
- }
245
- catch (Exception ex)
246
- {
247
- _logger.LogError(ex, "Error updating product {ProductId}", id);
248
- return Result<Product>.Failure("An error occurred while updating the product", "INTERNAL_ERROR");
249
- }
250
- }
251
-
252
- public async Task<Result<bool>> DeleteAsync(string id, CancellationToken ct = default)
253
- {
254
- if (string.IsNullOrWhiteSpace(id))
255
- return Result<bool>.Failure("Product ID is required", "INVALID_ID");
256
-
257
- try
258
- {
259
- var existing = await _repository.GetByIdAsync(id, ct);
260
- if (existing == null)
261
- return Result<bool>.Failure($"Product '{id}' not found", "NOT_FOUND");
262
-
263
- // Soft delete
264
- await _repository.DeleteAsync(id, ct);
265
-
266
- // Invalidate cache
267
- await _cache.RemoveAsync(GetCacheKey(id), ct);
268
-
269
- _logger.LogInformation("Deleted product {ProductId}", id);
270
-
271
- return Result<bool>.Success(true);
272
- }
273
- catch (Exception ex)
274
- {
275
- _logger.LogError(ex, "Error deleting product {ProductId}", id);
276
- return Result<bool>.Failure("An error occurred while deleting the product", "INTERNAL_ERROR");
277
- }
278
- }
279
-
280
- private static string GetCacheKey(string id) => $"product:{id}";
281
- }
282
-
283
- // Supporting types
284
- public record CreateProductRequest(string Name, string Sku, decimal Price, int CategoryId);
285
- public record UpdateProductRequest(string? Name = null, decimal? Price = null, int? CategoryId = null);
286
- public record ProductSearchRequest(
287
- string? SearchTerm = null,
288
- int? CategoryId = null,
289
- decimal? MinPrice = null,
290
- decimal? MaxPrice = null,
291
- int? Page = null,
292
- int? PageSize = null);
293
-
294
- public class PagedResult<T>
295
- {
296
- public IReadOnlyList<T> Items { get; init; } = Array.Empty<T>();
297
- public int TotalCount { get; init; }
298
- public int Page { get; init; }
299
- public int PageSize { get; init; }
300
- public int TotalPages { get; init; }
301
- public bool HasNextPage => Page < TotalPages;
302
- public bool HasPreviousPage => Page > 1;
303
- }
304
-
305
- public class Product
306
- {
307
- public string Id { get; set; } = string.Empty;
308
- public string Name { get; set; } = string.Empty;
309
- public string Sku { get; set; } = string.Empty;
310
- public decimal Price { get; set; }
311
- public int CategoryId { get; set; }
312
- public DateTime CreatedAt { get; set; }
313
- public DateTime? UpdatedAt { get; set; }
314
- }
315
-
316
- // Validators using FluentValidation
317
- public class CreateProductRequestValidator : AbstractValidator<CreateProductRequest>
318
- {
319
- public CreateProductRequestValidator()
320
- {
321
- RuleFor(x => x.Name)
322
- .NotEmpty().WithMessage("Name is required")
323
- .MaximumLength(200).WithMessage("Name must not exceed 200 characters");
324
-
325
- RuleFor(x => x.Sku)
326
- .NotEmpty().WithMessage("SKU is required")
327
- .MaximumLength(50).WithMessage("SKU must not exceed 50 characters")
328
- .Matches(@"^[A-Z0-9\-]+$").WithMessage("SKU must contain only uppercase letters, numbers, and hyphens");
329
-
330
- RuleFor(x => x.Price)
331
- .GreaterThan(0).WithMessage("Price must be greater than 0");
332
-
333
- RuleFor(x => x.CategoryId)
334
- .GreaterThan(0).WithMessage("Category is required");
335
- }
336
- }