arch-atlas

VendorService (Provisions Slice)

core/services/vendor_service.dart · getProvisions / createProvision / deleteProvision / upsertBookingPolicy / …

data

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

  1. Every method uses DioHelper and tags requests with feature='seller/…' RequestTrace.
  2. createProvision: POST /vendor/provisions; updateProvision/updateOption/updateVariant: PATCH-style POSTs.
  3. deleteProvision: DELETE /vendor/provisions/{id}.
  4. getBookingPolicy: GET /vendor/bookings/policy/{productId}; upsertBookingPolicy: POST /vendor/bookings/policy.
  5. 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 status

    List the seller's provisions (services), including proposed + published.

    Response
    { products: Product[] /* seller-scoped */ }
    lib/src/features/seller/services/services.dart // via vendor_service.dart:21

    auth: seller.

  • GET/vendor/products/:idno status

    Provision detail (preload for the service-details screen).

    Response
    { product: { id, title, description, options: [...], variants: [...], metadata, status } }
    lib/src/features/seller/service_details/service_details.dart

    auth: seller.

  • POST/vendor/provisionsno status

    Create 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 // CreatePrestationScreen

    auth: seller.

  • POST/vendor/provisions/:idno status

    Update a provision (partial).

    Request
    Partial product fields
    Response
    { product: Product }
    lib/src/features/seller/service_details/edit_provision_screen.dart

    auth: seller.

  • POST/vendor/products/:id/options/:optionIdno status

    Update a product option (title + values).

    Request
    { title: string, values: string[] }
    Response
    { option: ProductOption }
    lib/src/features/seller/service_details/edit_provision_screen.dart

    auth: seller.

  • POST/vendor/products/:id/variants/:variantIdno status

    Update a variant (prices, title, sku).

    Request
    { prices: [...], title?: string, sku?: string }
    Response
    { variant: Variant }
    lib/src/features/seller/service_details/edit_provision_screen.dart

    auth: seller.

  • DELETE/vendor/provisions/:idno status

    Delete a provision (services screen).

    Response
    200 (no body)
    Errors
    • ·409 — active future bookings reference this provision
    lib/src/features/seller/services/services.dart // Delete confirm

    auth: seller.

  • GET/vendor/membersno status

    List the seller's members for the member-assignment step.

    Response
    { members: [{ id: string, ... }] }
    lib/src/features/seller/add-prestation/add-prestation.dart // member assignment step

    auth: seller.

  • POST/vendor/members/:memberId/provisionsno status

    Bind 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:292

    auth: seller.

  • POST/vendor/product-location/:productIdno status

    Pin 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 step

    auth: seller.

  • GET/vendor/bookings/policy/:productIdno status

    Read 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 status

    Create 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).