unitysvc-services 0.1.0__tar.gz → 0.1.1__tar.gz

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 (60) hide show
  1. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/PKG-INFO +2 -1
  2. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/pyproject.toml +5 -8
  3. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/models/base.py +118 -34
  4. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/models/listing_v1.py +8 -4
  5. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/models/provider_v1.py +13 -3
  6. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/models/seller_v1.py +11 -7
  7. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/publisher.py +169 -209
  8. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/query.py +31 -13
  9. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/update.py +6 -1
  10. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/utils.py +110 -8
  11. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/validator.py +183 -18
  12. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services.egg-info/PKG-INFO +2 -1
  13. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services.egg-info/requires.txt +1 -0
  14. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/seller.json +1 -1
  15. unitysvc_services-0.1.1/tests/test_utils.py +223 -0
  16. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/test_validator.py +2 -2
  17. unitysvc_services-0.1.0/tests/test_utils.py +0 -102
  18. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/CONTRIBUTING.md +0 -0
  19. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/HISTORY.md +0 -0
  20. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/LICENSE +0 -0
  21. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/MANIFEST.in +0 -0
  22. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/README.md +0 -0
  23. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/docs/api-reference.md +0 -0
  24. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/docs/cli-reference.md +0 -0
  25. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/docs/contributing.md +0 -0
  26. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/docs/data-structure.md +0 -0
  27. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/docs/development.md +0 -0
  28. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/docs/file-schemas.md +0 -0
  29. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/docs/getting-started.md +0 -0
  30. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/docs/index.md +0 -0
  31. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/docs/installation.md +0 -0
  32. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/docs/usage.md +0 -0
  33. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/docs/workflows.md +0 -0
  34. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/setup.cfg +0 -0
  35. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/__init__.py +0 -0
  36. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/cli.py +0 -0
  37. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/format_data.py +0 -0
  38. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/list.py +0 -0
  39. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/models/__init__.py +0 -0
  40. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/models/service_v1.py +0 -0
  41. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/populate.py +0 -0
  42. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services/scaffold.py +0 -0
  43. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services.egg-info/SOURCES.txt +0 -0
  44. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services.egg-info/dependency_links.txt +0 -0
  45. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services.egg-info/entry_points.txt +0 -0
  46. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/src/unitysvc_services.egg-info/top_level.txt +0 -0
  47. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/__init__.py +0 -0
  48. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/README.md +0 -0
  49. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider1/README.md +0 -0
  50. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider1/provider.toml +0 -0
  51. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider1/services/service1/code-example.md +0 -0
  52. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider1/services/service1/service.toml +0 -0
  53. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider1/services/service1/svcreseller.toml +0 -0
  54. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider1/terms-of-service.md +0 -0
  55. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider2/README.md +0 -0
  56. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider2/provider.json +0 -0
  57. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider2/services/service2/code-example.md +0 -0
  58. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider2/services/service2/service.json +0 -0
  59. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider2/services/service2/svcreseller.json +0 -0
  60. {unitysvc_services-0.1.0 → unitysvc_services-0.1.1}/tests/example_data/provider2/terms-of-service.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: unitysvc-services
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: SDK for digital service providers on UnitySVC
5
5
  Author-email: Bo Peng <bo.peng@unitysvc.com>
6
6
  Maintainer-email: Bo Peng <bo.peng@unitysvc.com>
@@ -13,6 +13,7 @@ Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
14
  Requires-Dist: typer
15
15
  Requires-Dist: pydantic
16
+ Requires-Dist: email-validator
16
17
  Requires-Dist: jsonschema
17
18
  Requires-Dist: jinja2
18
19
  Requires-Dist: rich
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unitysvc-services"
3
- version = "0.1.0"
3
+ version = "0.1.1"
4
4
  description = "SDK for digital service providers on UnitySVC"
5
5
  readme = "README.md"
6
6
  authors = [{ name = "Bo Peng", email = "bo.peng@unitysvc.com" }]
@@ -12,6 +12,7 @@ license = { text = "MIT" }
12
12
  dependencies = [
13
13
  "typer",
14
14
  "pydantic",
15
+ "email-validator",
15
16
  "jsonschema",
16
17
  "jinja2",
17
18
  "rich",
@@ -38,11 +39,7 @@ dev = [
38
39
  "mkdocs-material",
39
40
  "mkdocs-autorefs",
40
41
  ]
41
- docs = [
42
- "mkdocs",
43
- "mkdocs-material",
44
- "mkdocs-autorefs",
45
- ]
42
+ docs = ["mkdocs", "mkdocs-material", "mkdocs-autorefs"]
46
43
 
47
44
  [project.urls]
48
45
  bugs = "https://github.com/unitysvc/unitysvc-services/issues"
@@ -70,8 +67,8 @@ select = [
70
67
  "UP", # pyupgrade
71
68
  ]
72
69
  ignore = [
73
- "B008", # Do not perform function calls in argument defaults (Typer pattern)
74
- "B904", # Within except clause raise with from err - not needed for CLI exit codes
70
+ "B008", # Do not perform function calls in argument defaults (Typer pattern)
71
+ "B904", # Within except clause raise with from err - not needed for CLI exit codes
75
72
  ]
76
73
 
77
74
  [tool.mypy]
@@ -206,16 +206,38 @@ class UpstreamStatusEnum(StrEnum):
206
206
  deprecated = "deprecated"
207
207
 
208
208
 
209
+ class ProviderStatusEnum(StrEnum):
210
+ """Provider status enum."""
211
+
212
+ active = "active"
213
+ disabled = "disabled"
214
+ incomplete = "incomplete" # Provider information is incomplete
215
+
216
+
217
+ class SellerStatusEnum(StrEnum):
218
+ """Seller status enum."""
219
+
220
+ active = "active"
221
+ disabled = "disabled"
222
+ incomplete = "incomplete" # Seller information is incomplete
223
+
224
+
209
225
  class Document(BaseModel):
210
226
  model_config = ConfigDict(extra="forbid")
211
227
 
212
228
  # fields that will be stored in backend database
213
229
  #
214
230
  title: str = Field(min_length=5, max_length=255, description="Document title")
215
- description: str | None = Field(default=None, max_length=500, description="Document description")
231
+ description: str | None = Field(
232
+ default=None, max_length=500, description="Document description"
233
+ )
216
234
  mime_type: MimeTypeEnum = Field(description="Document MIME type")
217
- version: str | None = Field(default=None, max_length=50, description="Document version")
218
- category: DocumentCategoryEnum = Field(description="Document category for organization and filtering")
235
+ version: str | None = Field(
236
+ default=None, max_length=50, description="Document version"
237
+ )
238
+ category: DocumentCategoryEnum = Field(
239
+ description="Document category for organization and filtering"
240
+ )
219
241
  meta: dict[str, Any] | None = Field(
220
242
  default=None,
221
243
  description="JSON containing operation stats",
@@ -249,8 +271,12 @@ class RateLimit(BaseModel):
249
271
  window: TimeWindowEnum = Field(description="Time window for the limit")
250
272
 
251
273
  # Optional additional info
252
- description: str | None = Field(default=None, max_length=255, description="Human-readable description")
253
- burst_limit: int | None = Field(default=None, description="Short-term burst allowance")
274
+ description: str | None = Field(
275
+ default=None, max_length=255, description="Human-readable description"
276
+ )
277
+ burst_limit: int | None = Field(
278
+ default=None, description="Short-term burst allowance"
279
+ )
254
280
 
255
281
  # Status
256
282
  is_active: bool = Field(default=True, description="Whether rate limit is active")
@@ -260,57 +286,105 @@ class ServiceConstraints(BaseModel):
260
286
  model_config = ConfigDict(extra="forbid")
261
287
 
262
288
  # Usage Quotas & Billing
263
- monthly_quota: int | None = Field(default=None, description="Monthly usage quota (requests, tokens, etc.)")
264
- daily_quota: int | None = Field(default=None, description="Daily usage quota (requests, tokens, etc.)")
265
- quota_unit: RateLimitUnitEnum | None = Field(default=None, description="Unit for quota limits")
266
- quota_reset_cycle: QuotaResetCycleEnum | None = Field(default=None, description="How often quotas reset")
267
- overage_policy: OveragePolicyEnum | None = Field(default=None, description="What happens when quota is exceeded")
289
+ monthly_quota: int | None = Field(
290
+ default=None, description="Monthly usage quota (requests, tokens, etc.)"
291
+ )
292
+ daily_quota: int | None = Field(
293
+ default=None, description="Daily usage quota (requests, tokens, etc.)"
294
+ )
295
+ quota_unit: RateLimitUnitEnum | None = Field(
296
+ default=None, description="Unit for quota limits"
297
+ )
298
+ quota_reset_cycle: QuotaResetCycleEnum | None = Field(
299
+ default=None, description="How often quotas reset"
300
+ )
301
+ overage_policy: OveragePolicyEnum | None = Field(
302
+ default=None, description="What happens when quota is exceeded"
303
+ )
268
304
 
269
305
  # Authentication & Security
270
- auth_methods: list[AuthMethodEnum] | None = Field(default=None, description="Supported authentication methods")
271
- ip_whitelist_required: bool | None = Field(default=None, description="Whether IP whitelisting is required")
272
- tls_version_min: str | None = Field(default=None, description="Minimum TLS version required")
306
+ auth_methods: list[AuthMethodEnum] | None = Field(
307
+ default=None, description="Supported authentication methods"
308
+ )
309
+ ip_whitelist_required: bool | None = Field(
310
+ default=None, description="Whether IP whitelisting is required"
311
+ )
312
+ tls_version_min: str | None = Field(
313
+ default=None, description="Minimum TLS version required"
314
+ )
273
315
 
274
316
  # Request/Response Constraints
275
- max_request_size_bytes: int | None = Field(default=None, description="Maximum request payload size in bytes")
276
- max_response_size_bytes: int | None = Field(default=None, description="Maximum response payload size in bytes")
277
- timeout_seconds: int | None = Field(default=None, description="Request timeout in seconds")
278
- max_batch_size: int | None = Field(default=None, description="Maximum number of items in batch requests")
317
+ max_request_size_bytes: int | None = Field(
318
+ default=None, description="Maximum request payload size in bytes"
319
+ )
320
+ max_response_size_bytes: int | None = Field(
321
+ default=None, description="Maximum response payload size in bytes"
322
+ )
323
+ timeout_seconds: int | None = Field(
324
+ default=None, description="Request timeout in seconds"
325
+ )
326
+ max_batch_size: int | None = Field(
327
+ default=None, description="Maximum number of items in batch requests"
328
+ )
279
329
 
280
330
  # Content & Model Restrictions
281
331
  content_filters: list[ContentFilterEnum] | None = Field(
282
332
  default=None, description="Active content filtering policies"
283
333
  )
284
- input_languages: list[str] | None = Field(default=None, description="Supported input languages (ISO 639-1 codes)")
285
- output_languages: list[str] | None = Field(default=None, description="Supported output languages (ISO 639-1 codes)")
286
- max_context_length: int | None = Field(default=None, description="Maximum context length in tokens")
334
+ input_languages: list[str] | None = Field(
335
+ default=None, description="Supported input languages (ISO 639-1 codes)"
336
+ )
337
+ output_languages: list[str] | None = Field(
338
+ default=None, description="Supported output languages (ISO 639-1 codes)"
339
+ )
340
+ max_context_length: int | None = Field(
341
+ default=None, description="Maximum context length in tokens"
342
+ )
287
343
  region_restrictions: list[str] | None = Field(
288
344
  default=None, description="Geographic restrictions (ISO country codes)"
289
345
  )
290
346
 
291
347
  # Availability & SLA
292
- uptime_sla_percent: float | None = Field(default=None, description="Uptime SLA percentage (e.g., 99.9)")
293
- response_time_sla_ms: int | None = Field(default=None, description="Response time SLA in milliseconds")
294
- maintenance_windows: list[str] | None = Field(default=None, description="Scheduled maintenance windows")
348
+ uptime_sla_percent: float | None = Field(
349
+ default=None, description="Uptime SLA percentage (e.g., 99.9)"
350
+ )
351
+ response_time_sla_ms: int | None = Field(
352
+ default=None, description="Response time SLA in milliseconds"
353
+ )
354
+ maintenance_windows: list[str] | None = Field(
355
+ default=None, description="Scheduled maintenance windows"
356
+ )
295
357
 
296
358
  # Concurrency & Connection Limits
297
- max_concurrent_requests: int | None = Field(default=None, description="Maximum concurrent requests allowed")
298
- connection_timeout_seconds: int | None = Field(default=None, description="Connection timeout in seconds")
299
- max_connections_per_ip: int | None = Field(default=None, description="Maximum connections per IP address")
359
+ max_concurrent_requests: int | None = Field(
360
+ default=None, description="Maximum concurrent requests allowed"
361
+ )
362
+ connection_timeout_seconds: int | None = Field(
363
+ default=None, description="Connection timeout in seconds"
364
+ )
365
+ max_connections_per_ip: int | None = Field(
366
+ default=None, description="Maximum connections per IP address"
367
+ )
300
368
 
301
369
 
302
370
  class AccessInterface(BaseModel):
303
371
  model_config = ConfigDict(extra="allow")
304
372
 
305
- access_method: AccessMethodEnum = Field(default=AccessMethodEnum.http, description="Type of access method")
373
+ access_method: AccessMethodEnum = Field(
374
+ default=AccessMethodEnum.http, description="Type of access method"
375
+ )
306
376
 
307
377
  api_endpoint: str = Field(max_length=500, description="API endpoint URL")
308
378
 
309
- api_key: str | None = Field(default=None, max_length=2000, description="API key if required")
379
+ api_key: str | None = Field(
380
+ default=None, max_length=2000, description="API key if required"
381
+ )
310
382
 
311
383
  name: str | None = Field(default=None, max_length=100, description="Interface name")
312
384
 
313
- description: str | None = Field(default=None, max_length=500, description="Interface description")
385
+ description: str | None = Field(
386
+ default=None, max_length=500, description="Interface description"
387
+ )
314
388
 
315
389
  request_transformer: dict[RequestTransformEnum, dict[str, Any]] | None = Field(
316
390
  default=None, description="Request transformation configuration"
@@ -324,9 +398,13 @@ class AccessInterface(BaseModel):
324
398
  default=None,
325
399
  description="Rate limit",
326
400
  )
327
- constraint: ServiceConstraints | None = Field(default=None, description="Service constraints and conditions")
401
+ constraint: ServiceConstraints | None = Field(
402
+ default=None, description="Service constraints and conditions"
403
+ )
328
404
  is_active: bool = Field(default=True, description="Whether interface is active")
329
- is_primary: bool = Field(default=False, description="Whether this is the primary interface")
405
+ is_primary: bool = Field(
406
+ default=False, description="Whether this is the primary interface"
407
+ )
330
408
  sort_order: int = Field(default=0, description="Display order")
331
409
 
332
410
 
@@ -334,9 +412,13 @@ class Pricing(BaseModel):
334
412
  model_config = ConfigDict(extra="forbid")
335
413
 
336
414
  # Pricing tier name (Basic, Pro, Enterprise, etc.)
337
- name: str | None = Field(default=None, description="Pricing tier name (e.g., Basic, Pro, Enterprise)")
415
+ name: str | None = Field(
416
+ default=None, description="Pricing tier name (e.g., Basic, Pro, Enterprise)"
417
+ )
338
418
 
339
- description: str | None = Field(default=None, description="Pricing model description")
419
+ description: str | None = Field(
420
+ default=None, description="Pricing model description"
421
+ )
340
422
 
341
423
  # Currency and description
342
424
  currency: str | None = Field(default=None, description="Currency code (e.g., USD)")
@@ -349,4 +431,6 @@ class Pricing(BaseModel):
349
431
  )
350
432
 
351
433
  # Optional reference to upstream pricing
352
- reference: str | None = Field(default=None, description="Reference URL to upstream pricing")
434
+ reference: str | None = Field(
435
+ default=None, description="Reference URL to upstream pricing"
436
+ )
@@ -17,7 +17,9 @@ class ListingV1(BaseModel):
17
17
  #
18
18
  # fields for business data collection and maintenance
19
19
  #
20
- schema_version: str = Field(default="listing_v1", description="Schema identifier", alias="schema")
20
+ schema_version: str = Field(
21
+ default="listing_v1", description="Schema identifier", alias="schema"
22
+ )
21
23
  time_created: datetime
22
24
 
23
25
  #
@@ -30,8 +32,8 @@ class ListingV1(BaseModel):
30
32
  ),
31
33
  )
32
34
 
33
- seller_name: str = Field(
34
- description="Name of the seller offering this service listing"
35
+ seller_name: str | None = Field(
36
+ default=None, description="Name of the seller offering this service listing"
35
37
  )
36
38
 
37
39
  # unique name for each provider, usually following upstream naming convention
@@ -48,7 +50,9 @@ class ListingV1(BaseModel):
48
50
  # - code_examples
49
51
  # multiple access interfaces can be provided, for example, if the service
50
52
  # is available through multiple interfaces or service groups
51
- user_access_interfaces: list[AccessInterface] = Field(description="Dictionary of user access interfaces")
53
+ user_access_interfaces: list[AccessInterface] = Field(
54
+ description="Dictionary of user access interfaces"
55
+ )
52
56
 
53
57
  #
54
58
  # how upstream charges for their services, which can include
@@ -3,7 +3,7 @@ from typing import Any
3
3
 
4
4
  from pydantic import BaseModel, ConfigDict, EmailStr, Field, HttpUrl
5
5
 
6
- from unitysvc_services.models.base import AccessInterface, Document
6
+ from unitysvc_services.models.base import AccessInterface, Document, ProviderStatusEnum
7
7
 
8
8
 
9
9
  class ProviderV1(BaseModel):
@@ -12,13 +12,17 @@ class ProviderV1(BaseModel):
12
12
  #
13
13
  # fields for business data collection and maintenance
14
14
  #
15
- schema_version: str = Field(default="provider_v1", description="Schema identifier", alias="schema")
15
+ schema_version: str = Field(
16
+ default="provider_v1", description="Schema identifier", alias="schema"
17
+ )
16
18
  time_created: datetime
17
19
  # how to automatically populate service data, if available
18
20
  services_populator: dict[str, Any] | None = None
19
21
  # parameters for accessing service provider, which typically
20
22
  # include "api_endpoint" and "api_key"
21
- provider_access_info: AccessInterface = Field(description="Dictionary of upstream access interface")
23
+ provider_access_info: AccessInterface = Field(
24
+ description="Dictionary of upstream access interface"
25
+ )
22
26
  #
23
27
  # fields that will be stored in backend database
24
28
  #
@@ -51,3 +55,9 @@ class ProviderV1(BaseModel):
51
55
  homepage: HttpUrl
52
56
  contact_email: EmailStr
53
57
  secondary_contact_email: EmailStr | None = None
58
+
59
+ # Status field to track provider state
60
+ status: ProviderStatusEnum = Field(
61
+ default=ProviderStatusEnum.active,
62
+ description="Provider status: active, disabled, or incomplete",
63
+ )
@@ -2,7 +2,7 @@ from datetime import datetime
2
2
 
3
3
  from pydantic import BaseModel, ConfigDict, EmailStr, Field, HttpUrl
4
4
 
5
- from unitysvc_services.models.base import Document, SellerTypeEnum
5
+ from unitysvc_services.models.base import Document, SellerStatusEnum, SellerTypeEnum
6
6
 
7
7
 
8
8
  class SellerV1(BaseModel):
@@ -17,7 +17,9 @@ class SellerV1(BaseModel):
17
17
  #
18
18
  # fields for business data collection and maintenance
19
19
  #
20
- schema_version: str = Field(default="seller_v1", description="Schema identifier", alias="schema")
20
+ schema_version: str = Field(
21
+ default="seller_v1", description="Schema identifier", alias="schema"
22
+ )
21
23
  time_created: datetime
22
24
 
23
25
  #
@@ -47,7 +49,9 @@ class SellerV1(BaseModel):
47
49
  # Contact information
48
50
  contact_email: EmailStr = Field(description="Primary contact email for the seller")
49
51
 
50
- secondary_contact_email: EmailStr | None = Field(default=None, description="Secondary contact email")
52
+ secondary_contact_email: EmailStr | None = Field(
53
+ default=None, description="Secondary contact email"
54
+ )
51
55
 
52
56
  # Account manager
53
57
  account_manager: str | None = Field(
@@ -98,10 +102,10 @@ class SellerV1(BaseModel):
98
102
  # fields for business operation purposes
99
103
  #
100
104
 
101
- # Status flags - these would typically be set by the backend
102
- is_active: bool = Field(
103
- default=True,
104
- description="Whether the seller is active on the marketplace",
105
+ # Status field to track seller state
106
+ status: SellerStatusEnum = Field(
107
+ default=SellerStatusEnum.active,
108
+ description="Seller status: active, disabled, or incomplete",
105
109
  )
106
110
 
107
111
  is_verified: bool = Field(