mintsoft 0.1.0

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.
@@ -0,0 +1,83 @@
1
+ # Mintsoft Documentation Index
2
+
3
+ ## 📋 Overview
4
+
5
+ Complete design documentation for the Mintsoft Ruby gem - a simplified API wrapper with manual token management for 5 essential endpoints.
6
+
7
+ ## 📚 Essential Documentation
8
+
9
+ ### 🔑 Authentication Design
10
+ - **[AUTH_CLIENT_DESIGN.md](AUTH_CLIENT_DESIGN.md)** - AuthClient with auth resource for clean token management
11
+ - **[MANUAL_TOKEN_DESIGN.md](MANUAL_TOKEN_DESIGN.md)** - Manual token management approach and patterns
12
+
13
+ ### 🏗️ Core Architecture
14
+ - **[TOKEN_ONLY_CLIENT_DESIGN.md](TOKEN_ONLY_CLIENT_DESIGN.md)** - Main client design accepting only pre-obtained tokens
15
+ - **[FINAL_SIMPLIFIED_DESIGN.md](FINAL_SIMPLIFIED_DESIGN.md)** - Complete simplified architecture with nested objects
16
+
17
+ ### 📋 Implementation & Usage
18
+ - **[MINIMAL_IMPLEMENTATION_PLAN.md](MINIMAL_IMPLEMENTATION_PLAN.md)** - Step-by-step implementation roadmap (7 days)
19
+ - **[USAGE_EXAMPLES.md](USAGE_EXAMPLES.md)** - Comprehensive usage examples and patterns
20
+
21
+ ## 🚀 Quick Start
22
+
23
+ ### For Implementation (Developers)
24
+ 1. **[FINAL_SIMPLIFIED_DESIGN.md](FINAL_SIMPLIFIED_DESIGN.md)** - Start here: Complete architecture overview
25
+ 2. **[AUTH_CLIENT_DESIGN.md](AUTH_CLIENT_DESIGN.md)** - Implement AuthClient first
26
+ 3. **[MINIMAL_IMPLEMENTATION_PLAN.md](MINIMAL_IMPLEMENTATION_PLAN.md)** - Follow 7-day roadmap
27
+ 4. **[USAGE_EXAMPLES.md](USAGE_EXAMPLES.md)** - Reference implementation patterns
28
+
29
+ ### For Integration (Users)
30
+ 1. **[USAGE_EXAMPLES.md](USAGE_EXAMPLES.md)** - Complete workflow examples
31
+ 2. **[AUTH_CLIENT_DESIGN.md](AUTH_CLIENT_DESIGN.md)** - Token management approach
32
+ 3. **[MANUAL_TOKEN_DESIGN.md](MANUAL_TOKEN_DESIGN.md)** - Token lifecycle strategies
33
+
34
+ ## 📊 Documentation Status
35
+
36
+ | Document | Status | Focus |
37
+ |----------|--------|-------|
38
+ | AUTH_CLIENT_DESIGN.md | ✅ Complete | Token management |
39
+ | TOKEN_ONLY_CLIENT_DESIGN.md | ✅ Complete | Main client design |
40
+ | FINAL_SIMPLIFIED_DESIGN.md | ✅ Complete | Overall architecture |
41
+ | MANUAL_TOKEN_DESIGN.md | ✅ Complete | Token lifecycle |
42
+ | USAGE_EXAMPLES.md | ✅ Complete | Implementation patterns |
43
+ | MINIMAL_IMPLEMENTATION_PLAN.md | ✅ Complete | 7-day roadmap |
44
+
45
+ ## 🎯 Design Summary
46
+
47
+ ### Key Principles
48
+ - **Manual Token Management**: Users handle authentication lifecycle
49
+ - **Simplified Architecture**: Only 5 essential API endpoints
50
+ - **Clean Separation**: AuthClient for tokens, Client for API operations
51
+ - **No Complex Features**: No auto-renewal, caching, or retry logic
52
+
53
+ ### API Endpoints
54
+ 1. `POST /api/auth` - Authentication (AuthClient)
55
+ 2. `GET /api/Order/Search` - Order search (Client)
56
+ 3. `GET /api/Return/Reasons` - Return reasons (Client)
57
+ 4. `POST /api/Return/CreateReturn/{OrderId}` - Create return (Client)
58
+ 5. `POST /api/Return/{id}/AddItem` - Add return item (Client)
59
+
60
+ ### Architecture
61
+ ```
62
+ AuthClient Client (token-only)
63
+ ├── Auth Resource ├── Orders Resource
64
+ └── AuthResponse Object └── Returns Resource
65
+
66
+ Objects: Order, Return (with nested items), ReturnReason
67
+ ```
68
+
69
+ ### Usage Pattern
70
+ ```ruby
71
+ # Step 1: Get token
72
+ auth_client = Mintsoft::AuthClient.new
73
+ token = auth_client.auth.authenticate("user", "pass")
74
+
75
+ # Step 2: Use token
76
+ client = Mintsoft::Client.new(token: token)
77
+ orders = client.orders.search("ORD-001")
78
+ ```
79
+
80
+ ---
81
+
82
+ **Generated by**: Claude Code `/sc:design` command
83
+ **Ready for Implementation**: Following MINIMAL_IMPLEMENTATION_PLAN.md
@@ -0,0 +1,316 @@
1
+ # Minimal Implementation Plan
2
+
3
+ ## Scope Clarification
4
+
5
+ Based on your requirements, we need exactly these 5 endpoints:
6
+
7
+ 1. `POST /api/auth` - Authentication
8
+ 2. `GET /api/Order/Search` - Search orders by order number
9
+ 3. `GET /api/Return/Reasons` - Get return reasons
10
+ 4. `POST /api/Return/CreateReturn/{OrderId}` - Create return for order
11
+ 5. `POST /api/Return/{id}/AddItem` - Add item to return
12
+
13
+ ## Implementation Order
14
+
15
+ ### Step 1: AuthClient for Token Management (Day 1-2)
16
+ ```ruby
17
+ # lib/mintsoft/auth_client.rb
18
+ class AuthClient
19
+ def initialize(base_url: BASE_URL)
20
+ def connection # Faraday connection
21
+ def auth # Auth resource
22
+ end
23
+
24
+ # Usage
25
+ auth_client = AuthClient.new
26
+ token = auth_client.auth.authenticate("user", "pass")
27
+ ```
28
+
29
+ ### Step 2: Faraday Client Setup (Day 1-2)
30
+ ```ruby
31
+ # lib/mintsoft/client.rb
32
+ require "faraday"
33
+ require "faraday/net_http"
34
+
35
+ class Client
36
+ BASE_URL = "https://api.mintsoft.com".freeze
37
+
38
+ def initialize(token:, base_url: BASE_URL, conn_opts: {})
39
+ @token = token
40
+ @base_url = base_url
41
+ @conn_opts = conn_opts
42
+ end
43
+
44
+ def connection
45
+ @connection ||= Faraday.new do |conn|
46
+ conn.url_prefix = @base_url
47
+ conn.options.merge!(@conn_opts)
48
+ conn.request :authorization, :Bearer, @token
49
+ conn.request :json
50
+ conn.response :json, content_type: "application/json"
51
+ end
52
+ end
53
+
54
+ def orders
55
+ @orders ||= Resources::Orders.new(self)
56
+ end
57
+
58
+ def returns
59
+ @returns ||= Resources::Returns.new(self)
60
+ end
61
+ end
62
+ ```
63
+
64
+ ### Step 3: BaseResource Pattern (Day 2-3)
65
+ ```ruby
66
+ # lib/mintsoft/resources/base_resource.rb
67
+ class BaseResource
68
+ def initialize(client)
69
+ def get_request(url, params: {})
70
+ def post_request(url, body: {})
71
+ def handle_response(response)
72
+ end
73
+
74
+ # Usage
75
+ client = Client.new(token: "api_token")
76
+ ```
77
+
78
+ ### Step 4: Orders Resource (Day 3-4)
79
+ ```ruby
80
+ # lib/mintsoft/resources/orders.rb
81
+ class OrderResource < BaseResource
82
+ def search(order_number)
83
+ validate_order_number!(order_number)
84
+
85
+ response = get_request('/api/Order/Search', params: { OrderNumber: order_number })
86
+
87
+ if response.success?
88
+ parse_orders(response.body)
89
+ else
90
+ []
91
+ end
92
+ end
93
+
94
+ private
95
+
96
+ def validate_order_number!(order_number)
97
+ raise ValidationError, "Order number required" if order_number.nil? || order_number.empty?
98
+ end
99
+
100
+ def parse_orders(data)
101
+ return [] unless data.is_a?(Array)
102
+ data.map { |order_data| Order.new(order_data) }
103
+ end
104
+ end
105
+
106
+ # lib/mintsoft/objects/order.rb
107
+ class Order < Base
108
+ def order_id
109
+ id || order_id
110
+ end
111
+
112
+ def order_ref
113
+ order_number || order_reference || ref
114
+ end
115
+ end
116
+ ```
117
+
118
+ ### Step 5: Returns Resource (Day 4-6)
119
+ ```ruby
120
+ # lib/mintsoft/resources/returns.rb
121
+ class Returns
122
+ def reasons
123
+ # GET /api/Return/Reasons
124
+ # Returns array of ReturnReason objects
125
+ end
126
+
127
+ def create(order_id)
128
+ # POST /api/Return/CreateReturn/{OrderId}
129
+ # Returns Return object
130
+ end
131
+
132
+ def add_item(return_id, item_attributes)
133
+ # POST /api/Return/{id}/AddItem
134
+ # Returns success/failure
135
+ end
136
+ end
137
+
138
+ # Objects
139
+ class Return
140
+ attr_reader :id, :order_id, :status
141
+ end
142
+
143
+ class ReturnReason
144
+ attr_reader :id, :name, :description
145
+ end
146
+ ```
147
+
148
+ ### Step 6: Error Handling (Day 6-7)
149
+ ```ruby
150
+ # lib/mintsoft/errors.rb
151
+ class Error < StandardError; end
152
+ class APIError < Error; end
153
+ class AuthenticationError < APIError; end
154
+ class NotFoundError < APIError; end
155
+ class ValidationError < APIError; end
156
+ ```
157
+
158
+ ### Step 7: BaseResource Pattern (Day 7)
159
+ ```ruby
160
+ # lib/mintsoft/resources/base_resource.rb
161
+ class BaseResource
162
+ def initialize(client)
163
+ def get_request(url, params: {})
164
+ def post_request(url, body: {})
165
+ def handle_response(response)
166
+ end
167
+ ```
168
+
169
+ ## Complete Usage Flow
170
+
171
+ ```ruby
172
+ require 'mintsoft'
173
+
174
+ # Step 1: Get token using AuthClient
175
+ auth_client = Mintsoft::AuthClient.new
176
+ token = auth_client.auth.authenticate(
177
+ ENV['MINTSOFT_USERNAME'],
178
+ ENV['MINTSOFT_PASSWORD']
179
+ )
180
+
181
+ # Step 2: Initialize client with token
182
+ client = Mintsoft::Client.new(token: token)
183
+
184
+ # 1. Search for order
185
+ orders = client.orders.search("ORD-2024-001")
186
+ order = orders.first
187
+ raise "Order not found" unless order
188
+
189
+ puts "Found order: #{order.order_number} (ID: #{order.id})"
190
+
191
+ # 2. Get available return reasons
192
+ reasons = client.returns.reasons
193
+ puts "Available reasons: #{reasons.map(&:name).join(', ')}"
194
+
195
+ # Select a reason (e.g., first one or by name)
196
+ selected_reason = reasons.first
197
+
198
+ # 3. Create return for the order
199
+ return_obj = client.returns.create(order.id)
200
+ puts "Created return ID: #{return_obj.id}"
201
+
202
+ # 4. Add item to the return
203
+ result = client.returns.add_item(return_obj.id, {
204
+ product_id: 123, # Product ID from order
205
+ quantity: 2, # Quantity to return
206
+ reason_id: selected_reason.id,
207
+ unit_value: 25.00, # Unit value
208
+ notes: "Damaged in shipping"
209
+ })
210
+
211
+ puts "Item added to return successfully" if result.success?
212
+ ```
213
+
214
+ ## File Creation Checklist
215
+
216
+ ### Core Files
217
+ - [ ] `lib/mintsoft.rb` - Main entry point
218
+ - [ ] `lib/mintsoft/version.rb` - Version constant
219
+ - [ ] `lib/mintsoft/client.rb` - Main client class (Faraday-based)
220
+ - [ ] `lib/mintsoft/auth_client.rb` - Authentication client
221
+ - [ ] `lib/mintsoft/base.rb` - Base OpenStruct object
222
+ - [ ] `lib/mintsoft/errors.rb` - Error classes
223
+
224
+ ### Resource Files
225
+ - [ ] `lib/mintsoft/resources/base_resource.rb` - Base resource pattern
226
+ - [ ] `lib/mintsoft/resources/orders.rb` - Orders search
227
+ - [ ] `lib/mintsoft/resources/returns.rb` - Returns operations
228
+
229
+ ### Object Files
230
+ - [ ] `lib/mintsoft/objects/order.rb` - Order object
231
+ - [ ] `lib/mintsoft/objects/return.rb` - Return object
232
+ - [ ] `lib/mintsoft/objects/return_reason.rb` - Return reason object
233
+
234
+ ### Test Files
235
+ - [ ] `spec/mintsoft/client_spec.rb`
236
+ - [ ] `spec/mintsoft/resources/orders_spec.rb`
237
+ - [ ] `spec/mintsoft/resources/returns_spec.rb`
238
+ - [ ] `spec/integration/workflow_spec.rb`
239
+
240
+ ## Gemspec Updates
241
+
242
+ Add required dependencies:
243
+ ```ruby
244
+ # mintsoft.gemspec
245
+ spec.add_dependency "faraday", "~> 2.0"
246
+ spec.add_dependency "faraday-net_http", "~> 3.0"
247
+ spec.add_dependency "active_support", "~> 7.0"
248
+
249
+ spec.add_development_dependency "rspec", "~> 3.0"
250
+ spec.add_development_dependency "vcr", "~> 6.0"
251
+ spec.add_development_dependency "webmock", "~> 3.0"
252
+ ```
253
+
254
+ ## Testing Approach
255
+
256
+ ### Unit Tests (Mock HTTP responses)
257
+ ```ruby
258
+ # spec/mintsoft/resources/orders_spec.rb
259
+ RSpec.describe Mintsoft::Orders do
260
+ it "searches for orders by order number" do
261
+ # Mock HTTP response
262
+ # Test order parsing
263
+ end
264
+ end
265
+ ```
266
+
267
+ ### Integration Tests (VCR cassettes)
268
+ ```ruby
269
+ # spec/integration/workflow_spec.rb
270
+ RSpec.describe "Complete workflow", :vcr do
271
+ it "completes order to return workflow" do
272
+ client = Mintsoft::Client.new(username: "test", password: "test")
273
+
274
+ # Test real API flow with recorded responses
275
+ orders = client.orders.search("TEST-ORDER")
276
+ # ... rest of workflow
277
+ end
278
+ end
279
+ ```
280
+
281
+ ## Error Scenarios to Handle
282
+
283
+ 1. **Authentication failures** (401)
284
+ 2. **Order not found** (404)
285
+ 3. **Invalid order number** (400)
286
+ 4. **Network timeouts**
287
+ 5. **Server errors** (500)
288
+ 6. **Token expiration** (automatic renewal)
289
+
290
+ ## Validation Rules
291
+
292
+ ### Orders.search
293
+ - Order number cannot be empty
294
+ - Order number max length validation
295
+
296
+ ### Returns.create
297
+ - Order ID must be positive integer
298
+
299
+ ### Returns.add_item
300
+ - Return ID required
301
+ - Product ID required
302
+ - Quantity must be positive
303
+ - Reason ID required
304
+ - Unit value cannot be negative
305
+
306
+ ## Success Criteria
307
+
308
+ - [ ] All 5 endpoints implemented and working
309
+ - [ ] Complete workflow from order search to return item addition
310
+ - [ ] Automatic authentication token management
311
+ - [ ] Proper error handling for common scenarios
312
+ - [ ] Unit tests for all components
313
+ - [ ] Integration test for complete workflow
314
+ - [ ] Documentation with usage examples
315
+
316
+ This minimal plan focuses only on the required functionality and provides a clear path to implementation in about 1 week.