VendorService (Provisions Slice)
core/services/vendor_service.dart · getProvisions / createProvision / deleteProvision / upsertBookingPolicy / …
Overview
Large data-layer class wrapping every /vendor/* endpoint. The provisions slice consumed by this feature: getProvisions, getProvision, createProvision, updateProvision, updateProductOption, updateProductVariant, deleteProvision, getBookingPolicy, upsertBookingPolicy. Plus member helpers for assignment.
User Flow
- Every method uses DioHelper and tags requests with feature='seller/…' RequestTrace.
- createProvision: POST /vendor/provisions; updateProvision/updateOption/updateVariant: PATCH-style POSTs.
- deleteProvision: DELETE /vendor/provisions/{id}.
- getBookingPolicy: GET /vendor/bookings/policy/{productId}; upsertBookingPolicy: POST /vendor/bookings/policy.
- Member helpers (getMembers, assignProvisionsToMember, updateMemberProvision) are how schedules attach to a provision.
Cases & Edge Cases
- All paths start with /vendor/ → DioHelper auth interceptor attaches the seller token automatically.
- upsertBookingPolicy is idempotent — calling it on an existing policy replaces it (server-side merge).
- deleteProvision may return 409 if a future booking references it — the controller surfaces the message verbatim.
Code References
- lib/src/core/services/vendor_service.dart:21 // getProvisions
- lib/src/core/services/vendor_service.dart:57 // createProvision
- lib/src/core/services/vendor_service.dart:140 // deleteProvision
- lib/src/core/services/vendor_service.dart:292 // assignProvisionsToMember
- lib/src/core/services/vendor_service.dart:624 // upsertBookingPolicy
- lib/src/core/services/vendor_service.dart:769 // getBookingPolicy
API Calls
- GET
/vendor/provisionsno statusList the seller's provisions (services), including proposed + published.
Response{ products: Product[] /* seller-scoped */ }lib/src/features/seller/services/services.dart // via vendor_service.dart:21auth: seller.
- GET
/vendor/products/:idno statusProvision detail (preload for the service-details screen).
Response{ product: { id, title, description, options: [...], variants: [...], metadata, status } }lib/src/features/seller/service_details/service_details.dartauth: seller.
- POST
/vendor/provisionsno statusCreate a new provision (3-step wizard's main submit).
Request{ title, subtitle?, description, status: 'proposed', is_giftcard, discountable, handle, thumbnail, images: [{ url }], options: [{ title, values: [...] }], variants: [{ title, sku, prices: [{ currency_code, amount }], options: { <optionTitle>: <value> } }] }Response{ product: Product }lib/src/features/seller/add-prestation/add-prestation.dart // CreatePrestationScreenauth: seller.
- POST
/vendor/provisions/:idno statusUpdate a provision (partial).
RequestPartial product fields
Response{ product: Product }lib/src/features/seller/service_details/edit_provision_screen.dartauth: seller.
- POST
/vendor/products/:id/options/:optionIdno statusUpdate a product option (title + values).
Request{ title: string, values: string[] }Response{ option: ProductOption }lib/src/features/seller/service_details/edit_provision_screen.dartauth: seller.
- POST
/vendor/products/:id/variants/:variantIdno statusUpdate a variant (prices, title, sku).
Request{ prices: [...], title?: string, sku?: string }Response{ variant: Variant }lib/src/features/seller/service_details/edit_provision_screen.dartauth: seller.
- DELETE
/vendor/provisions/:idno statusDelete a provision (services screen).
Response200 (no body)
Errors- ·409 — active future bookings reference this provision
lib/src/features/seller/services/services.dart // Delete confirmauth: seller.
- GET
/vendor/membersno statusList the seller's members for the member-assignment step.
Response{ members: [{ id: string, ... }] }lib/src/features/seller/add-prestation/add-prestation.dart // member assignment stepauth: seller.
- POST
/vendor/members/:memberId/provisionsno statusBind selected provisions to a member with their working hours, slot duration, exceptions and location.
Request{ provision_ids: string[], workingHour: { week: { mon: [{ start, end }], tue: [...], ..., sun: [] } }, slotDuration: number /* minutes */, exceptions: { 'YYYY-MM-DD': [{ start, end }] | [] }, location: { lat, lng } }Response{ ... }lib/src/features/seller/add-prestation/add-prestation.dart // step 3 submit, via vendor_service.dart:292auth: seller.
- POST
/vendor/product-location/:productIdno statusPin a geographic location on the provision (post member-assign).
Request{ lat: number, lng: number, address?: string }Response{ ... }lib/src/features/seller/add-prestation/add-prestation.dart // post-assign stepauth: seller.
- GET
/vendor/bookings/policy/:productIdno statusRead the booking policy attached to a provision (deposit %, cancellation window, refund rules).
Response{ policy: { id, deposit_percentage, max_cancellation_delay_hours, rules: [{ hours_before, refund_percentage }, ...] } }Errors- ·404 — no policy set yet
lib/src/features/seller/service_details/service_details.dart (read), edit_provision_screen.dart (preload)auth: seller.
- POST
/vendor/bookings/policyno statusCreate or update the booking policy for a provision.
Request{ product_id: string, deposit_percentage: number, max_cancellation_delay_hours: number, rules: [{ hours_before, refund_percentage }, ...] }Response{ policy: BookingPolicy }lib/src/features/seller/add-prestation/add-prestation.dart (final step), edit_provision_screen.dart (policy editor)auth: seller.
Notes
VendorService is the elephant — 700+ lines covering provisions, products, members, files, calendar. Treat the provisions slice as one logical area, the products slice as another (see seller-products).