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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.serena/memories/code_style_conventions.md +35 -0
- data/.serena/memories/codebase_structure.md +35 -0
- data/.serena/memories/development_environment.md +37 -0
- data/.serena/memories/project_overview.md +28 -0
- data/.serena/memories/suggested_commands.md +63 -0
- data/.serena/memories/task_completion_checklist.md +46 -0
- data/.serena/project.yml +68 -0
- data/.standard.yml +3 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/LICENSE.txt +21 -0
- data/README.md +165 -0
- data/Rakefile +10 -0
- data/claudedocs/AUTH_CLIENT_DESIGN.md +294 -0
- data/claudedocs/FINAL_SIMPLIFIED_DESIGN.md +553 -0
- data/claudedocs/IMPLEMENTATION_SUMMARY.md +140 -0
- data/claudedocs/INDEX.md +83 -0
- data/claudedocs/MINIMAL_IMPLEMENTATION_PLAN.md +316 -0
- data/claudedocs/TOKEN_ONLY_CLIENT_DESIGN.md +408 -0
- data/claudedocs/USAGE_EXAMPLES.md +482 -0
- data/examples/complete_workflow.rb +146 -0
- data/lib/mintsoft/auth_client.rb +104 -0
- data/lib/mintsoft/base.rb +44 -0
- data/lib/mintsoft/client.rb +37 -0
- data/lib/mintsoft/errors.rb +9 -0
- data/lib/mintsoft/objects/order.rb +16 -0
- data/lib/mintsoft/objects/return.rb +26 -0
- data/lib/mintsoft/objects/return_reason.rb +11 -0
- data/lib/mintsoft/resources/base_resource.rb +53 -0
- data/lib/mintsoft/resources/orders.rb +36 -0
- data/lib/mintsoft/resources/returns.rb +90 -0
- data/lib/mintsoft/version.rb +5 -0
- data/lib/mintsoft.rb +17 -0
- data/sig/mintsoft.rbs +4 -0
- metadata +161 -0
data/claudedocs/INDEX.md
ADDED
|
@@ -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.
|