feat: add superadmin member review and coupon ops

This commit is contained in:
2026-01-15 11:53:52 +08:00
parent 56082bad4f
commit 8419ddede7
11 changed files with 1254 additions and 96 deletions

View File

@@ -40,5 +40,55 @@ export const CouponService = {
total: data?.total ?? 0,
items: normalizeItems(data?.items)
};
},
async createCoupon(tenantID, form = {}) {
if (!tenantID) throw new Error('tenantID is required');
return requestJson(`/super/v1/tenants/${tenantID}/coupons`, {
method: 'POST',
body: normalizeCouponForm(form)
});
},
async getCoupon(tenantID, couponID) {
if (!tenantID) throw new Error('tenantID is required');
if (!couponID) throw new Error('couponID is required');
return requestJson(`/super/v1/tenants/${tenantID}/coupons/${couponID}`);
},
async updateCoupon(tenantID, couponID, form = {}) {
if (!tenantID) throw new Error('tenantID is required');
if (!couponID) throw new Error('couponID is required');
return requestJson(`/super/v1/tenants/${tenantID}/coupons/${couponID}`, {
method: 'PUT',
body: normalizeCouponForm(form)
});
},
async grantCoupon(tenantID, couponID, userIDs = []) {
if (!tenantID) throw new Error('tenantID is required');
if (!couponID) throw new Error('couponID is required');
if (!Array.isArray(userIDs) || userIDs.length === 0) throw new Error('userIDs is required');
return requestJson(`/super/v1/tenants/${tenantID}/coupons/${couponID}/grant`, {
method: 'POST',
body: { user_ids: userIDs }
});
}
};
function normalizeCouponForm(form) {
const iso = (d) => {
if (!d) return undefined;
const date = d instanceof Date ? d : new Date(d);
if (Number.isNaN(date.getTime())) return undefined;
return date.toISOString();
};
return {
title: form.title,
description: form.description,
type: form.type,
value: form.value,
min_order_amount: form.min_order_amount,
max_discount: form.max_discount,
total_quantity: form.total_quantity,
start_at: iso(form.start_at),
end_at: iso(form.end_at)
};
}

View File

@@ -38,5 +38,52 @@ export const CreatorService = {
total: data?.total ?? 0,
items: normalizeItems(data?.items)
};
},
async listJoinRequests({ page, limit, tenant_id, tenant_code, tenant_name, user_id, username, status, created_at_from, created_at_to } = {}) {
const iso = (d) => {
if (!d) return undefined;
const date = d instanceof Date ? d : new Date(d);
if (Number.isNaN(date.getTime())) return undefined;
return date.toISOString();
};
const query = {
page,
limit,
tenant_id,
tenant_code,
tenant_name,
user_id,
username,
status,
created_at_from: iso(created_at_from),
created_at_to: iso(created_at_to)
};
const data = await requestJson('/super/v1/tenant-join-requests', { query });
return {
page: data?.page ?? page ?? 1,
limit: data?.limit ?? limit ?? 10,
total: data?.total ?? 0,
items: normalizeItems(data?.items)
};
},
async reviewJoinRequest(requestID, { action, reason } = {}) {
if (!requestID) throw new Error('requestID is required');
return requestJson(`/super/v1/tenant-join-requests/${requestID}/review`, {
method: 'POST',
body: { action, reason }
});
},
async createInvite(tenantID, { max_uses, expires_at, remark } = {}) {
if (!tenantID) throw new Error('tenantID is required');
return requestJson(`/super/v1/tenants/${tenantID}/invites`, {
method: 'POST',
body: {
max_uses,
expires_at,
remark
}
});
}
};