From 7cb8c1aa24b2f3133a82eed9a170e631ce1238c8 Mon Sep 17 00:00:00 2001 From: Egor Date: Sat, 17 Jan 2026 04:36:34 +0300 Subject: [PATCH] Add files via upload --- src/api/promocodes.ts | 181 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 src/api/promocodes.ts diff --git a/src/api/promocodes.ts b/src/api/promocodes.ts new file mode 100644 index 0000000..f2589d9 --- /dev/null +++ b/src/api/promocodes.ts @@ -0,0 +1,181 @@ +import apiClient from './client' + +// ============== Types ============== + +export type PromoCodeType = 'balance' | 'subscription_days' | 'trial_subscription' | 'promo_group' + +export interface PromoCode { + id: number + code: string + type: PromoCodeType + balance_bonus_kopeks: number + balance_bonus_rubles: number + subscription_days: number + max_uses: number + current_uses: number + uses_left: number + is_active: boolean + is_valid: boolean + first_purchase_only: boolean + valid_from: string + valid_until: string | null + promo_group_id: number | null + created_by: number | null + created_at: string + updated_at: string +} + +export interface PromoCodeRecentUse { + id: number + user_id: number + user_username: string | null + user_full_name: string | null + user_telegram_id: number | null + used_at: string +} + +export interface PromoCodeDetail extends PromoCode { + total_uses: number + today_uses: number + recent_uses: PromoCodeRecentUse[] +} + +export interface PromoCodeListResponse { + items: PromoCode[] + total: number + limit: number + offset: number +} + +export interface PromoCodeCreateRequest { + code: string + type: PromoCodeType + balance_bonus_kopeks?: number + subscription_days?: number + max_uses?: number + valid_from?: string + valid_until?: string | null + is_active?: boolean + first_purchase_only?: boolean + promo_group_id?: number | null +} + +export interface PromoCodeUpdateRequest { + code?: string + type?: PromoCodeType + balance_bonus_kopeks?: number + subscription_days?: number + max_uses?: number + valid_from?: string + valid_until?: string | null + is_active?: boolean + first_purchase_only?: boolean + promo_group_id?: number | null +} + +// ============== PromoGroup Types ============== + +export interface PromoGroup { + id: number + name: string + server_discount_percent: number + traffic_discount_percent: number + device_discount_percent: number + period_discounts: Record + auto_assign_total_spent_kopeks: number | null + apply_discounts_to_addons: boolean + is_default: boolean + members_count: number + created_at: string | null + updated_at: string | null +} + +export interface PromoGroupListResponse { + items: PromoGroup[] + total: number + limit: number + offset: number +} + +export interface PromoGroupCreateRequest { + name: string + server_discount_percent?: number + traffic_discount_percent?: number + device_discount_percent?: number + period_discounts?: Record + auto_assign_total_spent_kopeks?: number | null + apply_discounts_to_addons?: boolean + is_default?: boolean +} + +export interface PromoGroupUpdateRequest { + name?: string + server_discount_percent?: number + traffic_discount_percent?: number + device_discount_percent?: number + period_discounts?: Record + auto_assign_total_spent_kopeks?: number | null + apply_discounts_to_addons?: boolean + is_default?: boolean +} + +// ============== API ============== + +export const promocodesApi = { + // Promocodes + getPromocodes: async (params?: { + limit?: number + offset?: number + is_active?: boolean + }): Promise => { + const response = await apiClient.get('/cabinet/admin/promocodes', { params }) + return response.data + }, + + getPromocode: async (id: number): Promise => { + const response = await apiClient.get(`/cabinet/admin/promocodes/${id}`) + return response.data + }, + + createPromocode: async (data: PromoCodeCreateRequest): Promise => { + const response = await apiClient.post('/cabinet/admin/promocodes', data) + return response.data + }, + + updatePromocode: async (id: number, data: PromoCodeUpdateRequest): Promise => { + const response = await apiClient.patch(`/cabinet/admin/promocodes/${id}`, data) + return response.data + }, + + deletePromocode: async (id: number): Promise => { + await apiClient.delete(`/cabinet/admin/promocodes/${id}`) + }, + + // Promo Groups + getPromoGroups: async (params?: { + limit?: number + offset?: number + }): Promise => { + const response = await apiClient.get('/cabinet/admin/promo-groups', { params }) + return response.data + }, + + getPromoGroup: async (id: number): Promise => { + const response = await apiClient.get(`/cabinet/admin/promo-groups/${id}`) + return response.data + }, + + createPromoGroup: async (data: PromoGroupCreateRequest): Promise => { + const response = await apiClient.post('/cabinet/admin/promo-groups', data) + return response.data + }, + + updatePromoGroup: async (id: number, data: PromoGroupUpdateRequest): Promise => { + const response = await apiClient.patch(`/cabinet/admin/promo-groups/${id}`, data) + return response.data + }, + + deletePromoGroup: async (id: number): Promise => { + await apiClient.delete(`/cabinet/admin/promo-groups/${id}`) + }, +}