@cfxlabsinc/b2b-services
    Preparing search index...

    Admin-tier CRUD over product_limit_rule. Accepts any rule type (admin-global, admin-for-customer, or customer).

    Identity / version split: see ProductLimitRuleAdminService (this file). Edits insert a new version row and re-point currentVersionId in one transaction.

    Duplicate-matcher detection is enforced by the partial unique index product_limit_rule_unique_tuple — see ProductActivationRuleAdminService for the rationale. matcherHash is denormalized onto the identity row; service code maintains identity.matcherHash = currentVersion.matcherHash on every version bump and translates the unique-violation back into DUPLICATE_MATCHER.

    Hierarchy

    Index
    • Parameters

      • __namedParameters: {
            db: B2bDatabase;
            internalEventPublisher: InternalEventPublisher | null;
            valkeyClient: ValkeyClient | null;
        }
        • db: B2bDatabase
        • internalEventPublisher: InternalEventPublisher | null

          Publishes product.limitRule.*; null publishes nothing (scripts, tests).

        • valkeyClient: ValkeyClient | null

      Returns ProductLimitRuleAdminService

    cache: ServiceCache<CachedSearchPage<AdminProductLimitRule>>
    db: B2bDatabase
    instance: (...args: []) => ProductLimitRuleAdminService = ...

    The process default: built from each dependency's own instance().

    • Parameters

      • input: {
            customerId?: string;
            description?: string;
            effectiveFrom?: Instant;
            label?: string;
            matcher?: Matcher | undefined;
            priority: number;
            type?: "CUSTOMER" | "ADMIN";
        } & (LimitRuleScopeInput & LimitFields)
        • OptionalcustomerId?: string
        • Optionaldescription?: string
        • OptionaleffectiveFrom?: Instant

          When this version becomes effective. Defaults to now() at the DB layer when omitted. Pass a future Temporal.Instant to schedule a change (e.g. Reg E 30-day notice).

        • Optionallabel?: string
        • Optionalmatcher?: Matcher | undefined
        • priority: number
        • Optionaltype?: "CUSTOMER" | "ADMIN"

      Returns Promise<
          | { ok: true; value: AdminProductLimitRule }
          | { error: ServiceError; ok: false },
      >

    • Clear each customer's membership tag and each record tag wherever cached, and always this namespace's collection tag. keys are exact deletes in this instance's key space: the only bust a null client honours.

      Parameters

      • __namedParameters: {
            customerIds: readonly string[];
            keys?: readonly CacheKey[];
            records?: readonly string[];
        }

      Returns Promise<void>

    • Parameters

      • input: {
            createdAt?: DbTimestampCriteria<Instant>;
            customerIds?: string[];
            ids?: string[];
            orderBy?: RuleOrderByCriterion[];
            page?: number;
            pageSize?: number;
            productCategories?: ProductCategory[];
            routeIds?: string[];
            statuses?: ("ACTIVE" | "DISABLED")[];
            types?: ("CUSTOMER" | "ADMIN")[];
            updatedAt?: DbTimestampCriteria<Instant>;
        }
        • OptionalcreatedAt?: DbTimestampCriteria<Instant>
        • OptionalcustomerIds?: string[]
        • Optionalids?: string[]
        • OptionalorderBy?: RuleOrderByCriterion[]
        • Optionalpage?: number
        • OptionalpageSize?: number
        • OptionalproductCategories?: ProductCategory[]

          Matches category rules only.

        • OptionalrouteIds?: string[]

          Matches route rules only.

        • Optionalstatuses?: ("ACTIVE" | "DISABLED")[]
        • Optionaltypes?: ("CUSTOMER" | "ADMIN")[]
        • OptionalupdatedAt?: DbTimestampCriteria<Instant>

      Returns Promise<
          {
              ok: true;
              value: { hasNext: boolean; items: AdminProductLimitRule[]; total: number };
          },
      >

    • Tags for a page: the scope its query searched (each customer's membership tag, else the collection tag), so an empty page is bustable too, plus the records it projects and the fields that chose or ordered its rows.

      Parameters

      • __namedParameters: {
            customerIds: readonly string[] | undefined;
            fields?: readonly string[];
            records?: readonly string[];
        }

      Returns string[]

    • The rule's scope (route or category) is fixed at create.

      Parameters

      • input: {
            data: {
                description?: string | null;
                effectiveFrom?: Instant;
                label?: string | null;
                matcher?: Matcher;
                priority?: number;
                status?: "ACTIVE" | "DISABLED";
            } & {
                limit24hMaxCount?: BigNumber
                | null;
                limit24hMaxUsd?: BigNumber | null;
                limit30dMaxCount?: BigNumber | null;
                limit30dMaxUsd?: BigNumber | null;
                limit7dMaxCount?: BigNumber | null;
                limit7dMaxUsd?: BigNumber | null;
                limitCalendarMonthMaxCount?: BigNumber | null;
                limitCalendarMonthMaxUsd?: BigNumber | null;
                transactionMaxUsd?: BigNumber | null;
                transactionMinUsd?: BigNumber | null;
            };
            id: string;
        }

      Returns Promise<
          | { error: ServiceError; ok: false }
          | { ok: true; value: AdminProductLimitRule },
      >