FIx api url
This commit is contained in:
@@ -1 +1 @@
|
||||
VITE_API_BASE_URL=https://api.wheel.montzar.ir/api
|
||||
VITE_API_BASE_URL=https://api.wheel.montest.ir/api
|
||||
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
import{c as at,I as ig,d as pI,j as dI,k as gI,a as Ce,b as X,l as yI,w as gt,e as mt,f as he,i as mI,h as Vl,m as _I,n as SI,r as na,o as ve,R as ym,T as mm,L as xI,U as _m,t as $t,P as Sm,p as bI,v as wI,q as Di,s as $h,A as xm,F as bm,x as TI,C as AI,y as CI,z as DI,E as MI,_ as II}from"./index-Dx9ODHpC.js";import{t as tr,f as Xe}from"./farsi-number-stB7JMN0.js";import{P as wm}from"./PlusCircleOutlined-46hEPOWa.js";import{T as LI}from"./TeamOutlined-D0tX_kEo.js";import{G as Tm}from"./GiftOutlined-B8oIapKF.js";var PI={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M868 545.5L536.1 163a31.96 31.96 0 00-48.3 0L156 545.5a7.97 7.97 0 006 13.2h81c4.6 0 9-2 12.1-5.5L474 300.9V864c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V300.9l218.9 252.3c3 3.5 7.4 5.5 12.1 5.5h81c6.8 0 10.5-8 6-13.2z"}}]},name:"arrow-up",theme:"outlined"};function Am(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},a=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(a=a.concat(Object.getOwnPropertySymbols(t).filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),a.forEach(function(n){RI(r,n,t[n])})}return r}function RI(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var uf=function(e,t){var a=Am({},e,t.attrs);return at(ig,Am({},a,{icon:PI}),null)};uf.displayName="ArrowUpOutlined";uf.inheritAttrs=!1;var EI={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M855.7 210.8l-42.4-42.4a8.03 8.03 0 00-11.3 0L168.3 801.9a8.03 8.03 0 000 11.3l42.4 42.4c3.1 3.1 8.2 3.1 11.3 0L855.6 222c3.2-3 3.2-8.1.1-11.2zM304 448c79.4 0 144-64.6 144-144s-64.6-144-144-144-144 64.6-144 144 64.6 144 144 144zm0-216c39.7 0 72 32.3 72 72s-32.3 72-72 72-72-32.3-72-72 32.3-72 72-72zm416 344c-79.4 0-144 64.6-144 144s64.6 144 144 144 144-64.6 144-144-64.6-144-144-144zm0 216c-39.7 0-72-32.3-72-72s32.3-72 72-72 72 32.3 72 72-32.3 72-72 72z"}}]},name:"percentage",theme:"outlined"};function Cm(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},a=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(a=a.concat(Object.getOwnPropertySymbols(t).filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),a.forEach(function(n){kI(r,n,t[n])})}return r}function kI(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var og=function(e,t){var a=Cm({},e,t.attrs);return at(ig,Cm({},a,{icon:EI}),null)};og.displayName="PercentageOutlined";og.inheritAttrs=!1;var OI={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M848 359.3H627.7L825.8 109c4.1-5.3.4-13-6.3-13H436c-2.8 0-5.5 1.5-6.9 4L170 547.5c-3.1 5.3.7 12 6.9 12h174.4l-89.4 357.6c-1.9 7.8 7.5 13.3 13.3 7.7L853.5 373c5.2-4.9 1.7-13.7-5.5-13.7zM378.2 732.5l60.3-241H281.1l189.6-327.4h224.6L487 427.4h211L378.2 732.5z"}}]},name:"thunderbolt",theme:"outlined"};function Dm(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},a=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(a=a.concat(Object.getOwnPropertySymbols(t).filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),a.forEach(function(n){NI(r,n,t[n])})}return r}function NI(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var sg=function(e,t){var a=Dm({},e,t.attrs);return at(ig,Dm({},a,{icon:OI}),null)};sg.displayName="ThunderboltOutlined";sg.inheritAttrs=!1;/*! *****************************************************************************
|
||||
import{c as at,I as ig,d as pI,j as dI,k as gI,a as Ce,b as X,l as yI,w as gt,e as mt,f as he,i as mI,h as Vl,m as _I,n as SI,r as na,o as ve,R as ym,T as mm,L as xI,U as _m,t as $t,P as Sm,p as bI,v as wI,q as Di,s as $h,A as xm,F as bm,x as TI,C as AI,y as CI,z as DI,E as MI,_ as II}from"./index-iu4REYcj.js";import{t as tr,f as Xe}from"./farsi-number-stB7JMN0.js";import{P as wm}from"./PlusCircleOutlined-D0DwpFnG.js";import{T as LI}from"./TeamOutlined-BXroJ-y-.js";import{G as Tm}from"./GiftOutlined-Du5L-j2h.js";var PI={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M868 545.5L536.1 163a31.96 31.96 0 00-48.3 0L156 545.5a7.97 7.97 0 006 13.2h81c4.6 0 9-2 12.1-5.5L474 300.9V864c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V300.9l218.9 252.3c3 3.5 7.4 5.5 12.1 5.5h81c6.8 0 10.5-8 6-13.2z"}}]},name:"arrow-up",theme:"outlined"};function Am(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},a=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(a=a.concat(Object.getOwnPropertySymbols(t).filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),a.forEach(function(n){RI(r,n,t[n])})}return r}function RI(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var uf=function(e,t){var a=Am({},e,t.attrs);return at(ig,Am({},a,{icon:PI}),null)};uf.displayName="ArrowUpOutlined";uf.inheritAttrs=!1;var EI={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M855.7 210.8l-42.4-42.4a8.03 8.03 0 00-11.3 0L168.3 801.9a8.03 8.03 0 000 11.3l42.4 42.4c3.1 3.1 8.2 3.1 11.3 0L855.6 222c3.2-3 3.2-8.1.1-11.2zM304 448c79.4 0 144-64.6 144-144s-64.6-144-144-144-144 64.6-144 144 64.6 144 144 144zm0-216c39.7 0 72 32.3 72 72s-32.3 72-72 72-72-32.3-72-72 32.3-72 72-72zm416 344c-79.4 0-144 64.6-144 144s64.6 144 144 144 144-64.6 144-144-64.6-144-144-144zm0 216c-39.7 0-72-32.3-72-72s32.3-72 72-72 72 32.3 72 72-32.3 72-72 72z"}}]},name:"percentage",theme:"outlined"};function Cm(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},a=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(a=a.concat(Object.getOwnPropertySymbols(t).filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),a.forEach(function(n){kI(r,n,t[n])})}return r}function kI(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var og=function(e,t){var a=Cm({},e,t.attrs);return at(ig,Cm({},a,{icon:EI}),null)};og.displayName="PercentageOutlined";og.inheritAttrs=!1;var OI={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M848 359.3H627.7L825.8 109c4.1-5.3.4-13-6.3-13H436c-2.8 0-5.5 1.5-6.9 4L170 547.5c-3.1 5.3.7 12 6.9 12h174.4l-89.4 357.6c-1.9 7.8 7.5 13.3 13.3 7.7L853.5 373c5.2-4.9 1.7-13.7-5.5-13.7zM378.2 732.5l60.3-241H281.1l189.6-327.4h224.6L487 427.4h211L378.2 732.5z"}}]},name:"thunderbolt",theme:"outlined"};function Dm(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},a=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(a=a.concat(Object.getOwnPropertySymbols(t).filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),a.forEach(function(n){NI(r,n,t[n])})}return r}function NI(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var sg=function(e,t){var a=Dm({},e,t.attrs);return at(ig,Dm({},a,{icon:OI}),null)};sg.displayName="ThunderboltOutlined";sg.inheritAttrs=!1;/*! *****************************************************************************
|
||||
Copyright (c) Microsoft Corporation.
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
import{c as f,I as u}from"./index-Dx9ODHpC.js";var l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M880 310H732.4c13.6-21.4 21.6-46.8 21.6-74 0-76.1-61.9-138-138-138-41.4 0-78.7 18.4-104 47.4-25.3-29-62.6-47.4-104-47.4-76.1 0-138 61.9-138 138 0 27.2 7.9 52.6 21.6 74H144c-17.7 0-32 14.3-32 32v200c0 4.4 3.6 8 8 8h40v344c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V550h40c4.4 0 8-3.6 8-8V342c0-17.7-14.3-32-32-32zm-334-74c0-38.6 31.4-70 70-70s70 31.4 70 70-31.4 70-70 70h-70v-70zm-138-70c38.6 0 70 31.4 70 70v70h-70c-38.6 0-70-31.4-70-70s31.4-70 70-70zM180 482V378h298v104H180zm48 68h250v308H228V550zm568 308H546V550h250v308zm48-376H546V378h298v104z"}}]},name:"gift",theme:"outlined"};function a(r){for(var t=1;t<arguments.length;t++){var e=arguments[t]!=null?Object(arguments[t]):{},n=Object.keys(e);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(e).filter(function(c){return Object.getOwnPropertyDescriptor(e,c).enumerable}))),n.forEach(function(c){o(r,c,e[c])})}return r}function o(r,t,e){return t in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}var i=function(t,e){var n=a({},t,e.attrs);return f(u,a({},n,{icon:l}),null)};i.displayName="GiftOutlined";i.inheritAttrs=!1;export{i as G};
|
||||
import{c as f,I as u}from"./index-iu4REYcj.js";var l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M880 310H732.4c13.6-21.4 21.6-46.8 21.6-74 0-76.1-61.9-138-138-138-41.4 0-78.7 18.4-104 47.4-25.3-29-62.6-47.4-104-47.4-76.1 0-138 61.9-138 138 0 27.2 7.9 52.6 21.6 74H144c-17.7 0-32 14.3-32 32v200c0 4.4 3.6 8 8 8h40v344c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V550h40c4.4 0 8-3.6 8-8V342c0-17.7-14.3-32-32-32zm-334-74c0-38.6 31.4-70 70-70s70 31.4 70 70-31.4 70-70 70h-70v-70zm-138-70c38.6 0 70 31.4 70 70v70h-70c-38.6 0-70-31.4-70-70s31.4-70 70-70zM180 482V378h298v104H180zm48 68h250v308H228V550zm568 308H546V550h250v308zm48-376H546V378h298v104z"}}]},name:"gift",theme:"outlined"};function a(r){for(var t=1;t<arguments.length;t++){var e=arguments[t]!=null?Object(arguments[t]):{},n=Object.keys(e);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(e).filter(function(c){return Object.getOwnPropertyDescriptor(e,c).enumerable}))),n.forEach(function(c){o(r,c,e[c])})}return r}function o(r,t,e){return t in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}var i=function(t,e){var n=a({},t,e.attrs);return f(u,a({},n,{icon:l}),null)};i.displayName="GiftOutlined";i.inheritAttrs=!1;export{i as G};
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
import{c as i,I as l}from"./index-Dx9ODHpC.js";var u={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM332 240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224H332V240zm460 600H232V536h560v304zM484 701v53c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-53a48.01 48.01 0 10-56 0z"}}]},name:"lock",theme:"outlined"};function a(r){for(var t=1;t<arguments.length;t++){var e=arguments[t]!=null?Object(arguments[t]):{},n=Object.keys(e);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(e).filter(function(c){return Object.getOwnPropertyDescriptor(e,c).enumerable}))),n.forEach(function(c){f(r,c,e[c])})}return r}function f(r,t,e){return t in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}var o=function(t,e){var n=a({},t,e.attrs);return i(l,a({},n,{icon:u}),null)};o.displayName="LockOutlined";o.inheritAttrs=!1;export{o as L};
|
||||
import{c as i,I as l}from"./index-iu4REYcj.js";var u={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM332 240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224H332V240zm460 600H232V536h560v304zM484 701v53c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-53a48.01 48.01 0 10-56 0z"}}]},name:"lock",theme:"outlined"};function a(r){for(var t=1;t<arguments.length;t++){var e=arguments[t]!=null?Object(arguments[t]):{},n=Object.keys(e);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(e).filter(function(c){return Object.getOwnPropertyDescriptor(e,c).enumerable}))),n.forEach(function(c){f(r,c,e[c])})}return r}function f(r,t,e){return t in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}var o=function(t,e){var n=a({},t,e.attrs);return i(l,a({},n,{icon:u}),null)};o.displayName="LockOutlined";o.inheritAttrs=!1;export{o as L};
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
import{c as l,I as h,d as O,u as x,a as V,b as n,w as i,r as c,o as S,e as p,f as z,g as L,h as M,i as P,_ as j}from"./index-Dx9ODHpC.js";import{L as B}from"./LockOutlined-ihCI0sD8.js";var N={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 110.8V792H136V270.8l-27.6-21.5 39.3-50.5 42.8 33.3h643.1l42.8-33.3 39.3 50.5-27.7 21.5zM833.6 232L512 482 190.4 232l-42.8-33.3-39.3 50.5 27.6 21.5 341.6 265.6a55.99 55.99 0 0068.7 0L888 270.8l27.6-21.5-39.3-50.5-42.7 33.2z"}}]},name:"mail",theme:"outlined"};function f(r){for(var a=1;a<arguments.length;a++){var t=arguments[a]!=null?Object(arguments[a]):{},e=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(e=e.concat(Object.getOwnPropertySymbols(t).filter(function(s){return Object.getOwnPropertyDescriptor(t,s).enumerable}))),e.forEach(function(s){k(r,s,t[s])})}return r}function k(r,a,t){return a in r?Object.defineProperty(r,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[a]=t,r}var m=function(a,t){var e=f({},a,t.attrs);return l(h,f({},e,{icon:N}),null)};m.displayName="MailOutlined";m.inheritAttrs=!1;const A={class:"login-container"},C={class:"login-card"},I=O({__name:"LoginView",setup(r){const a=P(),t=x(),e=L({email:"admin@luckywheel.local",password:"Admin@SecurePass2026"}),s=M(!1);async function _(){s.value=!0;try{await t.login({email:e.email,password:e.password}),a.push("/dashboard")}catch{}finally{s.value=!1}}return(g,o)=>{const v=c("a-input"),u=c("a-form-item"),b=c("a-input-password"),w=c("a-button"),y=c("a-form");return S(),V("div",A,[o[4]||(o[4]=n("div",{class:"login-bg-decorations"},[n("div",{class:"decor-circle circle-1"}),n("div",{class:"decor-circle circle-2"})],-1)),n("div",C,[o[3]||(o[3]=n("div",{class:"header"},[n("div",{class:"logo-wrapper"},[n("span",{class:"logo"},"🎡")]),n("h1",null,"ورود به پنل مدیریت"),n("p",null,"سامانه گردونه شانس و قرعهکشی")],-1)),l(y,{model:e,layout:"vertical",onFinish:_},{default:i(()=>[l(u,{label:"ایمیل مدیریت",name:"email",rules:[{required:!0,message:"لطفاً ایمیل را وارد کنید"},{type:"email",message:"فرمت ایمیل نامعتبر است"}]},{default:i(()=>[l(v,{value:e.email,"onUpdate:value":o[0]||(o[0]=d=>e.email=d),size:"large",placeholder:"admin@example.com"},{prefix:i(()=>[l(p(m),{style:{color:"#6366f1"}})]),_:1},8,["value"])]),_:1}),l(u,{label:"کلمه عبور",name:"password",rules:[{required:!0,message:"لطفاً کلمه عبور را وارد کنید"}]},{default:i(()=>[l(b,{value:e.password,"onUpdate:value":o[1]||(o[1]=d=>e.password=d),size:"large",placeholder:"••••••••"},{prefix:i(()=>[l(p(B),{style:{color:"#6366f1"}})]),_:1},8,["value"])]),_:1}),l(u,{style:{"margin-top":"28px"}},{default:i(()=>[l(w,{type:"primary","html-type":"submit",size:"large",block:"",loading:s.value,class:"login-submit-btn"},{default:i(()=>[...o[2]||(o[2]=[z(" ورود به پنل ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])])}}}),H=j(I,[["__scopeId","data-v-20e1793e"]]);export{H as default};
|
||||
import{c as l,I as h,d as O,u as x,a as V,b as n,w as i,r as c,o as S,e as p,f as z,g as L,h as M,i as P,_ as j}from"./index-iu4REYcj.js";import{L as B}from"./LockOutlined-NIokxtdn.js";var N={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 110.8V792H136V270.8l-27.6-21.5 39.3-50.5 42.8 33.3h643.1l42.8-33.3 39.3 50.5-27.7 21.5zM833.6 232L512 482 190.4 232l-42.8-33.3-39.3 50.5 27.6 21.5 341.6 265.6a55.99 55.99 0 0068.7 0L888 270.8l27.6-21.5-39.3-50.5-42.7 33.2z"}}]},name:"mail",theme:"outlined"};function f(r){for(var a=1;a<arguments.length;a++){var t=arguments[a]!=null?Object(arguments[a]):{},e=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(e=e.concat(Object.getOwnPropertySymbols(t).filter(function(s){return Object.getOwnPropertyDescriptor(t,s).enumerable}))),e.forEach(function(s){k(r,s,t[s])})}return r}function k(r,a,t){return a in r?Object.defineProperty(r,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[a]=t,r}var m=function(a,t){var e=f({},a,t.attrs);return l(h,f({},e,{icon:N}),null)};m.displayName="MailOutlined";m.inheritAttrs=!1;const A={class:"login-container"},C={class:"login-card"},I=O({__name:"LoginView",setup(r){const a=P(),t=x(),e=L({email:"admin@luckywheel.local",password:"Admin@SecurePass2026"}),s=M(!1);async function _(){s.value=!0;try{await t.login({email:e.email,password:e.password}),a.push("/dashboard")}catch{}finally{s.value=!1}}return(g,o)=>{const v=c("a-input"),u=c("a-form-item"),b=c("a-input-password"),w=c("a-button"),y=c("a-form");return S(),V("div",A,[o[4]||(o[4]=n("div",{class:"login-bg-decorations"},[n("div",{class:"decor-circle circle-1"}),n("div",{class:"decor-circle circle-2"})],-1)),n("div",C,[o[3]||(o[3]=n("div",{class:"header"},[n("div",{class:"logo-wrapper"},[n("span",{class:"logo"},"🎡")]),n("h1",null,"ورود به پنل مدیریت"),n("p",null,"سامانه گردونه شانس و قرعهکشی")],-1)),l(y,{model:e,layout:"vertical",onFinish:_},{default:i(()=>[l(u,{label:"ایمیل مدیریت",name:"email",rules:[{required:!0,message:"لطفاً ایمیل را وارد کنید"},{type:"email",message:"فرمت ایمیل نامعتبر است"}]},{default:i(()=>[l(v,{value:e.email,"onUpdate:value":o[0]||(o[0]=d=>e.email=d),size:"large",placeholder:"admin@example.com"},{prefix:i(()=>[l(p(m),{style:{color:"#6366f1"}})]),_:1},8,["value"])]),_:1}),l(u,{label:"کلمه عبور",name:"password",rules:[{required:!0,message:"لطفاً کلمه عبور را وارد کنید"}]},{default:i(()=>[l(b,{value:e.password,"onUpdate:value":o[1]||(o[1]=d=>e.password=d),size:"large",placeholder:"••••••••"},{prefix:i(()=>[l(p(B),{style:{color:"#6366f1"}})]),_:1},8,["value"])]),_:1}),l(u,{style:{"margin-top":"28px"}},{default:i(()=>[l(w,{type:"primary","html-type":"submit",size:"large",block:"",loading:s.value,class:"login-submit-btn"},{default:i(()=>[...o[2]||(o[2]=[z(" ورود به پنل ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])])}}}),H=j(I,[["__scopeId","data-v-20e1793e"]]);export{H as default};
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
import{c as u,I as l}from"./index-Dx9ODHpC.js";var c={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M456 231a56 56 0 10112 0 56 56 0 10-112 0zm0 280a56 56 0 10112 0 56 56 0 10-112 0zm0 280a56 56 0 10112 0 56 56 0 10-112 0z"}}]},name:"more",theme:"outlined"};function o(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},n=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(t).filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable}))),n.forEach(function(a){f(r,a,t[a])})}return r}function f(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var i=function(e,t){var n=o({},e,t.attrs);return u(l,o({},n,{icon:c}),null)};i.displayName="MoreOutlined";i.inheritAttrs=!1;export{i as M};
|
||||
import{c as u,I as l}from"./index-iu4REYcj.js";var c={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M456 231a56 56 0 10112 0 56 56 0 10-112 0zm0 280a56 56 0 10112 0 56 56 0 10-112 0zm0 280a56 56 0 10112 0 56 56 0 10-112 0z"}}]},name:"more",theme:"outlined"};function o(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},n=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(t).filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable}))),n.forEach(function(a){f(r,a,t[a])})}return r}function f(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var i=function(e,t){var n=o({},e,t.attrs);return u(l,o({},n,{icon:c}),null)};i.displayName="MoreOutlined";i.inheritAttrs=!1;export{i as M};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{c as u,I as l}from"./index-Dx9ODHpC.js";var o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm-88-532h-48c-4.4 0-8 3.6-8 8v304c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8zm224 0h-48c-4.4 0-8 3.6-8 8v304c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8z"}}]},name:"pause-circle",theme:"outlined"};function a(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},n=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(t).filter(function(c){return Object.getOwnPropertyDescriptor(t,c).enumerable}))),n.forEach(function(c){s(r,c,t[c])})}return r}function s(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var i=function(e,t){var n=a({},e,t.attrs);return u(l,a({},n,{icon:o}),null)};i.displayName="PauseCircleOutlined";i.inheritAttrs=!1;export{i as P};
|
||||
import{c as u,I as l}from"./index-iu4REYcj.js";var o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm-88-532h-48c-4.4 0-8 3.6-8 8v304c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8zm224 0h-48c-4.4 0-8 3.6-8 8v304c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8z"}}]},name:"pause-circle",theme:"outlined"};function a(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},n=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(t).filter(function(c){return Object.getOwnPropertyDescriptor(t,c).enumerable}))),n.forEach(function(c){s(r,c,t[c])})}return r}function s(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var i=function(e,t){var n=a({},e,t.attrs);return u(l,a({},n,{icon:o}),null)};i.displayName="PauseCircleOutlined";i.inheritAttrs=!1;export{i as P};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{c as i,I as u}from"./index-Dx9ODHpC.js";var s={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M696 480H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"}},{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}}]},name:"plus-circle",theme:"outlined"};function a(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},n=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(t).filter(function(c){return Object.getOwnPropertyDescriptor(t,c).enumerable}))),n.forEach(function(c){o(r,c,t[c])})}return r}function o(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var l=function(e,t){var n=a({},e,t.attrs);return i(u,a({},n,{icon:s}),null)};l.displayName="PlusCircleOutlined";l.inheritAttrs=!1;export{l as P};
|
||||
import{c as i,I as u}from"./index-iu4REYcj.js";var s={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M696 480H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"}},{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}}]},name:"plus-circle",theme:"outlined"};function a(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},n=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(t).filter(function(c){return Object.getOwnPropertyDescriptor(t,c).enumerable}))),n.forEach(function(c){o(r,c,t[c])})}return r}function o(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var l=function(e,t){var n=a({},e,t.attrs);return i(u,a({},n,{icon:s}),null)};l.displayName="PlusCircleOutlined";l.inheritAttrs=!1;export{l as P};
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -1 +1 @@
|
||||
import{c as u,I as l}from"./index-Dx9ODHpC.js";var o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M824.2 699.9a301.55 301.55 0 00-86.4-60.4C783.1 602.8 812 546.8 812 484c0-110.8-92.4-201.7-203.2-200-109.1 1.7-197 90.6-197 200 0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 00-86.4 60.4C345 754.6 314 826.8 312 903.8a8 8 0 008 8.2h56c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5A226.62 226.62 0 01612 684c60.9 0 118.2 23.7 161.3 66.8C814.5 792 838 846.3 840 904.3c.1 4.3 3.7 7.7 8 7.7h56a8 8 0 008-8.2c-2-77-33-149.2-87.8-203.9zM612 612c-34.2 0-66.4-13.3-90.5-37.5a126.86 126.86 0 01-37.5-91.8c.3-32.8 13.4-64.5 36.3-88 24-24.6 56.1-38.3 90.4-38.7 33.9-.3 66.8 12.9 91 36.6 24.8 24.3 38.4 56.8 38.4 91.4 0 34.2-13.3 66.3-37.5 90.5A127.3 127.3 0 01612 612zM361.5 510.4c-.9-8.7-1.4-17.5-1.4-26.4 0-15.9 1.5-31.4 4.3-46.5.7-3.6-1.2-7.3-4.5-8.8-13.6-6.1-26.1-14.5-36.9-25.1a127.54 127.54 0 01-38.7-95.4c.9-32.1 13.8-62.6 36.3-85.6 24.7-25.3 57.9-39.1 93.2-38.7 31.9.3 62.7 12.6 86 34.4 7.9 7.4 14.7 15.6 20.4 24.4 2 3.1 5.9 4.4 9.3 3.2 17.6-6.1 36.2-10.4 55.3-12.4 5.6-.6 8.8-6.6 6.3-11.6-32.5-64.3-98.9-108.7-175.7-109.9-110.9-1.7-203.3 89.2-203.3 199.9 0 62.8 28.9 118.8 74.2 155.5-31.8 14.7-61.1 35-86.5 60.4-54.8 54.7-85.8 126.9-87.8 204a8 8 0 008 8.2h56.1c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5 29.4-29.4 65.4-49.8 104.7-59.7 3.9-1 6.5-4.7 6-8.7z"}}]},name:"team",theme:"outlined"};function c(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},a=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(a=a.concat(Object.getOwnPropertySymbols(t).filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),a.forEach(function(n){f(r,n,t[n])})}return r}function f(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var i=function(e,t){var a=c({},e,t.attrs);return u(l,c({},a,{icon:o}),null)};i.displayName="TeamOutlined";i.inheritAttrs=!1;export{i as T};
|
||||
import{c as u,I as l}from"./index-iu4REYcj.js";var o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M824.2 699.9a301.55 301.55 0 00-86.4-60.4C783.1 602.8 812 546.8 812 484c0-110.8-92.4-201.7-203.2-200-109.1 1.7-197 90.6-197 200 0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 00-86.4 60.4C345 754.6 314 826.8 312 903.8a8 8 0 008 8.2h56c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5A226.62 226.62 0 01612 684c60.9 0 118.2 23.7 161.3 66.8C814.5 792 838 846.3 840 904.3c.1 4.3 3.7 7.7 8 7.7h56a8 8 0 008-8.2c-2-77-33-149.2-87.8-203.9zM612 612c-34.2 0-66.4-13.3-90.5-37.5a126.86 126.86 0 01-37.5-91.8c.3-32.8 13.4-64.5 36.3-88 24-24.6 56.1-38.3 90.4-38.7 33.9-.3 66.8 12.9 91 36.6 24.8 24.3 38.4 56.8 38.4 91.4 0 34.2-13.3 66.3-37.5 90.5A127.3 127.3 0 01612 612zM361.5 510.4c-.9-8.7-1.4-17.5-1.4-26.4 0-15.9 1.5-31.4 4.3-46.5.7-3.6-1.2-7.3-4.5-8.8-13.6-6.1-26.1-14.5-36.9-25.1a127.54 127.54 0 01-38.7-95.4c.9-32.1 13.8-62.6 36.3-85.6 24.7-25.3 57.9-39.1 93.2-38.7 31.9.3 62.7 12.6 86 34.4 7.9 7.4 14.7 15.6 20.4 24.4 2 3.1 5.9 4.4 9.3 3.2 17.6-6.1 36.2-10.4 55.3-12.4 5.6-.6 8.8-6.6 6.3-11.6-32.5-64.3-98.9-108.7-175.7-109.9-110.9-1.7-203.3 89.2-203.3 199.9 0 62.8 28.9 118.8 74.2 155.5-31.8 14.7-61.1 35-86.5 60.4-54.8 54.7-85.8 126.9-87.8 204a8 8 0 008 8.2h56.1c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5 29.4-29.4 65.4-49.8 104.7-59.7 3.9-1 6.5-4.7 6-8.7z"}}]},name:"team",theme:"outlined"};function c(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},a=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(a=a.concat(Object.getOwnPropertySymbols(t).filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),a.forEach(function(n){f(r,n,t[n])})}return r}function f(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var i=function(e,t){var a=c({},e,t.attrs);return u(l,c({},a,{icon:o}),null)};i.displayName="TeamOutlined";i.inheritAttrs=!1;export{i as T};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{c as o,I as i}from"./index-Dx9ODHpC.js";var u={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M400 317.7h73.9V656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V317.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 163a8 8 0 00-12.6 0l-112 141.7c-4.1 5.3-.4 13 6.3 13zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z"}}]},name:"upload",theme:"outlined"};function c(r){for(var t=1;t<arguments.length;t++){var e=arguments[t]!=null?Object(arguments[t]):{},n=Object.keys(e);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(e).filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.forEach(function(a){f(r,a,e[a])})}return r}function f(r,t,e){return t in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}var l=function(t,e){var n=c({},t,e.attrs);return o(i,c({},n,{icon:u}),null)};l.displayName="UploadOutlined";l.inheritAttrs=!1;export{l as U};
|
||||
import{c as o,I as i}from"./index-iu4REYcj.js";var u={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M400 317.7h73.9V656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V317.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 163a8 8 0 00-12.6 0l-112 141.7c-4.1 5.3-.4 13 6.3 13zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z"}}]},name:"upload",theme:"outlined"};function c(r){for(var t=1;t<arguments.length;t++){var e=arguments[t]!=null?Object(arguments[t]):{},n=Object.keys(e);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(e).filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.forEach(function(a){f(r,a,e[a])})}return r}function f(r,t,e){return t in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}var l=function(t,e){var n=c({},t,e.attrs);return o(i,c({},n,{icon:u}),null)};l.displayName="UploadOutlined";l.inheritAttrs=!1;export{l as U};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -18,7 +18,7 @@
|
||||
direction: rtl;
|
||||
}
|
||||
</style>
|
||||
<script type="module" crossorigin src="/assets/index-Dx9ODHpC.js"></script>
|
||||
<script type="module" crossorigin src="/assets/index-iu4REYcj.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-C1RGR6WN.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -1,320 +1,320 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "AdminStatus" AS ENUM ('ACTIVE', 'DISABLED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "AdminRole" AS ENUM ('SUPER_ADMIN', 'OPERATOR', 'SUPPORT');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "UserStatus" AS ENUM ('ACTIVE', 'BLOCKED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "CampaignStatus" AS ENUM ('DRAFT', 'ACTIVE', 'PAUSED', 'FINISHED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "PrizeType" AS ENUM ('PHYSICAL', 'DISCOUNT_CODE', 'CREDIT', 'CASH', 'NO_PRIZE', 'OTHER');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "StockType" AS ENUM ('LIMITED', 'UNLIMITED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "PrizeStatus" AS ENUM ('ACTIVE', 'INACTIVE');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "SpinStatus" AS ENUM ('SUCCESS', 'FAILED', 'DUPLICATE');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "ChanceTxnType" AS ENUM ('SIGNUP_BONUS', 'ADMIN_ADJUSTMENT', 'SPIN_CONSUME', 'CAMPAIGN_BONUS', 'REFUND');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "UserPrizeStatus" AS ENUM ('NEW', 'CONTACTED', 'DELIVERED', 'ACTIVE_CODE', 'USED', 'EXPIRED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "SmsType" AS ENUM ('OTP', 'WINNING', 'NO_PRIZE', 'PRIZE_REMINDER');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "SmsStatus" AS ENUM ('PENDING', 'SENT', 'FAILED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "WheelDesign" AS ENUM ('CLASSIC_CASINO', 'NEON_CYBER', 'MINIMAL_FLAT', 'LUXURY_GOLD', 'PLAYFUL_CARTOON');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "admins" (
|
||||
"id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"mobile" TEXT NOT NULL,
|
||||
"email" TEXT NOT NULL,
|
||||
"password_hash" TEXT NOT NULL,
|
||||
"role" "AdminRole" NOT NULL DEFAULT 'OPERATOR',
|
||||
"status" "AdminStatus" NOT NULL DEFAULT 'ACTIVE',
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "admins_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "users" (
|
||||
"id" TEXT NOT NULL,
|
||||
"mobile" TEXT NOT NULL,
|
||||
"name" TEXT,
|
||||
"status" "UserStatus" NOT NULL DEFAULT 'ACTIVE',
|
||||
"last_login_at" TIMESTAMP(3),
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "otp_codes" (
|
||||
"id" TEXT NOT NULL,
|
||||
"mobile" TEXT NOT NULL,
|
||||
"code" TEXT NOT NULL,
|
||||
"user_id" TEXT,
|
||||
"attempts" INTEGER NOT NULL DEFAULT 0,
|
||||
"consumed" BOOLEAN NOT NULL DEFAULT false,
|
||||
"expires_at" TIMESTAMP(3) NOT NULL,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "otp_codes_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "campaigns" (
|
||||
"id" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"slug" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"image" TEXT,
|
||||
"banner" TEXT,
|
||||
"logo" TEXT,
|
||||
"start_at" TIMESTAMP(3) NOT NULL,
|
||||
"end_at" TIMESTAMP(3) NOT NULL,
|
||||
"status" "CampaignStatus" NOT NULL DEFAULT 'DRAFT',
|
||||
"default_chances" INTEGER NOT NULL DEFAULT 0,
|
||||
"rules" TEXT,
|
||||
"cta_text" TEXT,
|
||||
"wheel_design" "WheelDesign" NOT NULL DEFAULT 'CLASSIC_CASINO',
|
||||
"settings" JSONB,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "campaigns_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "prizes" (
|
||||
"id" TEXT NOT NULL,
|
||||
"campaign_id" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"image" TEXT,
|
||||
"type" "PrizeType" NOT NULL,
|
||||
"stock_type" "StockType" NOT NULL,
|
||||
"initial_stock" INTEGER,
|
||||
"remaining_stock" INTEGER,
|
||||
"weight" INTEGER NOT NULL,
|
||||
"status" "PrizeStatus" NOT NULL DEFAULT 'ACTIVE',
|
||||
"sort_order" INTEGER NOT NULL DEFAULT 0,
|
||||
"segment_color" TEXT NOT NULL,
|
||||
"expires_at" TIMESTAMP(3),
|
||||
"sms_template" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "prizes_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "user_campaigns" (
|
||||
"id" TEXT NOT NULL,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"campaign_id" TEXT NOT NULL,
|
||||
"total_chances" INTEGER NOT NULL DEFAULT 0,
|
||||
"used_chances" INTEGER NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "user_campaigns_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "chance_transactions" (
|
||||
"id" TEXT NOT NULL,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"campaign_id" TEXT NOT NULL,
|
||||
"amount" INTEGER NOT NULL,
|
||||
"type" "ChanceTxnType" NOT NULL,
|
||||
"reference_type" TEXT,
|
||||
"reference_id" TEXT,
|
||||
"description" TEXT,
|
||||
"created_by" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "chance_transactions_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "spins" (
|
||||
"id" TEXT NOT NULL,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"campaign_id" TEXT NOT NULL,
|
||||
"prize_id" TEXT,
|
||||
"status" "SpinStatus" NOT NULL DEFAULT 'SUCCESS',
|
||||
"idempotency_key" TEXT NOT NULL,
|
||||
"ip" TEXT,
|
||||
"user_agent" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "spins_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "user_prizes" (
|
||||
"id" TEXT NOT NULL,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"campaign_id" TEXT NOT NULL,
|
||||
"prize_id" TEXT NOT NULL,
|
||||
"spin_id" TEXT NOT NULL,
|
||||
"code" TEXT,
|
||||
"status" "UserPrizeStatus" NOT NULL DEFAULT 'NEW',
|
||||
"won_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"redeemed_at" TIMESTAMP(3),
|
||||
|
||||
CONSTRAINT "user_prizes_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "sms_logs" (
|
||||
"id" TEXT NOT NULL,
|
||||
"user_id" TEXT,
|
||||
"mobile" TEXT NOT NULL,
|
||||
"type" "SmsType" NOT NULL,
|
||||
"message" TEXT NOT NULL,
|
||||
"provider" TEXT NOT NULL DEFAULT 'raygansms',
|
||||
"status" "SmsStatus" NOT NULL DEFAULT 'PENDING',
|
||||
"provider_response" JSONB,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "sms_logs_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "admin_logs" (
|
||||
"id" TEXT NOT NULL,
|
||||
"admin_id" TEXT NOT NULL,
|
||||
"action" TEXT NOT NULL,
|
||||
"entity_type" TEXT NOT NULL,
|
||||
"entity_id" TEXT NOT NULL,
|
||||
"old_value" JSONB,
|
||||
"new_value" JSONB,
|
||||
"ip" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "admin_logs_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "admins_mobile_key" ON "admins"("mobile");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "admins_email_key" ON "admins"("email");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "users_mobile_key" ON "users"("mobile");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "users_mobile_idx" ON "users"("mobile");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "otp_codes_mobile_consumed_idx" ON "otp_codes"("mobile", "consumed");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "campaigns_slug_key" ON "campaigns"("slug");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "campaigns_status_start_at_end_at_idx" ON "campaigns"("status", "start_at", "end_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "prizes_campaign_id_status_idx" ON "prizes"("campaign_id", "status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "user_campaigns_user_id_campaign_id_key" ON "user_campaigns"("user_id", "campaign_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "chance_transactions_user_id_campaign_id_idx" ON "chance_transactions"("user_id", "campaign_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "spins_idempotency_key_key" ON "spins"("idempotency_key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "spins_user_id_campaign_id_idx" ON "spins"("user_id", "campaign_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "spins_campaign_id_created_at_idx" ON "spins"("campaign_id", "created_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "user_prizes_spin_id_key" ON "user_prizes"("spin_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "user_prizes_code_key" ON "user_prizes"("code");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_prizes_user_id_idx" ON "user_prizes"("user_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_prizes_status_idx" ON "user_prizes"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "sms_logs_mobile_type_idx" ON "sms_logs"("mobile", "type");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "admin_logs_entity_type_entity_id_idx" ON "admin_logs"("entity_type", "entity_id");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "otp_codes" ADD CONSTRAINT "otp_codes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "prizes" ADD CONSTRAINT "prizes_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_campaigns" ADD CONSTRAINT "user_campaigns_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_campaigns" ADD CONSTRAINT "user_campaigns_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_created_by_fkey" FOREIGN KEY ("created_by") REFERENCES "admins"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "spins" ADD CONSTRAINT "spins_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "spins" ADD CONSTRAINT "spins_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "spins" ADD CONSTRAINT "spins_prize_id_fkey" FOREIGN KEY ("prize_id") REFERENCES "prizes"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_prize_id_fkey" FOREIGN KEY ("prize_id") REFERENCES "prizes"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_spin_id_fkey" FOREIGN KEY ("spin_id") REFERENCES "spins"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "sms_logs" ADD CONSTRAINT "sms_logs_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "admin_logs" ADD CONSTRAINT "admin_logs_admin_id_fkey" FOREIGN KEY ("admin_id") REFERENCES "admins"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
-- CreateEnum
|
||||
CREATE TYPE "AdminStatus" AS ENUM ('ACTIVE', 'DISABLED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "AdminRole" AS ENUM ('SUPER_ADMIN', 'OPERATOR', 'SUPPORT');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "UserStatus" AS ENUM ('ACTIVE', 'BLOCKED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "CampaignStatus" AS ENUM ('DRAFT', 'ACTIVE', 'PAUSED', 'FINISHED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "PrizeType" AS ENUM ('PHYSICAL', 'DISCOUNT_CODE', 'CREDIT', 'CASH', 'NO_PRIZE', 'OTHER');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "StockType" AS ENUM ('LIMITED', 'UNLIMITED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "PrizeStatus" AS ENUM ('ACTIVE', 'INACTIVE');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "SpinStatus" AS ENUM ('SUCCESS', 'FAILED', 'DUPLICATE');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "ChanceTxnType" AS ENUM ('SIGNUP_BONUS', 'ADMIN_ADJUSTMENT', 'SPIN_CONSUME', 'CAMPAIGN_BONUS', 'REFUND');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "UserPrizeStatus" AS ENUM ('NEW', 'CONTACTED', 'DELIVERED', 'ACTIVE_CODE', 'USED', 'EXPIRED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "SmsType" AS ENUM ('OTP', 'WINNING', 'NO_PRIZE', 'PRIZE_REMINDER');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "SmsStatus" AS ENUM ('PENDING', 'SENT', 'FAILED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "WheelDesign" AS ENUM ('CLASSIC_CASINO', 'NEON_CYBER', 'MINIMAL_FLAT', 'LUXURY_GOLD', 'PLAYFUL_CARTOON');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "admins" (
|
||||
"id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"mobile" TEXT NOT NULL,
|
||||
"email" TEXT NOT NULL,
|
||||
"password_hash" TEXT NOT NULL,
|
||||
"role" "AdminRole" NOT NULL DEFAULT 'OPERATOR',
|
||||
"status" "AdminStatus" NOT NULL DEFAULT 'ACTIVE',
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "admins_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "users" (
|
||||
"id" TEXT NOT NULL,
|
||||
"mobile" TEXT NOT NULL,
|
||||
"name" TEXT,
|
||||
"status" "UserStatus" NOT NULL DEFAULT 'ACTIVE',
|
||||
"last_login_at" TIMESTAMP(3),
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "otp_codes" (
|
||||
"id" TEXT NOT NULL,
|
||||
"mobile" TEXT NOT NULL,
|
||||
"code" TEXT NOT NULL,
|
||||
"user_id" TEXT,
|
||||
"attempts" INTEGER NOT NULL DEFAULT 0,
|
||||
"consumed" BOOLEAN NOT NULL DEFAULT false,
|
||||
"expires_at" TIMESTAMP(3) NOT NULL,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "otp_codes_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "campaigns" (
|
||||
"id" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"slug" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"image" TEXT,
|
||||
"banner" TEXT,
|
||||
"logo" TEXT,
|
||||
"start_at" TIMESTAMP(3) NOT NULL,
|
||||
"end_at" TIMESTAMP(3) NOT NULL,
|
||||
"status" "CampaignStatus" NOT NULL DEFAULT 'DRAFT',
|
||||
"default_chances" INTEGER NOT NULL DEFAULT 0,
|
||||
"rules" TEXT,
|
||||
"cta_text" TEXT,
|
||||
"wheel_design" "WheelDesign" NOT NULL DEFAULT 'CLASSIC_CASINO',
|
||||
"settings" JSONB,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "campaigns_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "prizes" (
|
||||
"id" TEXT NOT NULL,
|
||||
"campaign_id" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"image" TEXT,
|
||||
"type" "PrizeType" NOT NULL,
|
||||
"stock_type" "StockType" NOT NULL,
|
||||
"initial_stock" INTEGER,
|
||||
"remaining_stock" INTEGER,
|
||||
"weight" INTEGER NOT NULL,
|
||||
"status" "PrizeStatus" NOT NULL DEFAULT 'ACTIVE',
|
||||
"sort_order" INTEGER NOT NULL DEFAULT 0,
|
||||
"segment_color" TEXT NOT NULL,
|
||||
"expires_at" TIMESTAMP(3),
|
||||
"sms_template" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "prizes_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "user_campaigns" (
|
||||
"id" TEXT NOT NULL,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"campaign_id" TEXT NOT NULL,
|
||||
"total_chances" INTEGER NOT NULL DEFAULT 0,
|
||||
"used_chances" INTEGER NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "user_campaigns_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "chance_transactions" (
|
||||
"id" TEXT NOT NULL,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"campaign_id" TEXT NOT NULL,
|
||||
"amount" INTEGER NOT NULL,
|
||||
"type" "ChanceTxnType" NOT NULL,
|
||||
"reference_type" TEXT,
|
||||
"reference_id" TEXT,
|
||||
"description" TEXT,
|
||||
"created_by" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "chance_transactions_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "spins" (
|
||||
"id" TEXT NOT NULL,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"campaign_id" TEXT NOT NULL,
|
||||
"prize_id" TEXT,
|
||||
"status" "SpinStatus" NOT NULL DEFAULT 'SUCCESS',
|
||||
"idempotency_key" TEXT NOT NULL,
|
||||
"ip" TEXT,
|
||||
"user_agent" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "spins_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "user_prizes" (
|
||||
"id" TEXT NOT NULL,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"campaign_id" TEXT NOT NULL,
|
||||
"prize_id" TEXT NOT NULL,
|
||||
"spin_id" TEXT NOT NULL,
|
||||
"code" TEXT,
|
||||
"status" "UserPrizeStatus" NOT NULL DEFAULT 'NEW',
|
||||
"won_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"redeemed_at" TIMESTAMP(3),
|
||||
|
||||
CONSTRAINT "user_prizes_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "sms_logs" (
|
||||
"id" TEXT NOT NULL,
|
||||
"user_id" TEXT,
|
||||
"mobile" TEXT NOT NULL,
|
||||
"type" "SmsType" NOT NULL,
|
||||
"message" TEXT NOT NULL,
|
||||
"provider" TEXT NOT NULL DEFAULT 'raygansms',
|
||||
"status" "SmsStatus" NOT NULL DEFAULT 'PENDING',
|
||||
"provider_response" JSONB,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "sms_logs_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "admin_logs" (
|
||||
"id" TEXT NOT NULL,
|
||||
"admin_id" TEXT NOT NULL,
|
||||
"action" TEXT NOT NULL,
|
||||
"entity_type" TEXT NOT NULL,
|
||||
"entity_id" TEXT NOT NULL,
|
||||
"old_value" JSONB,
|
||||
"new_value" JSONB,
|
||||
"ip" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "admin_logs_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "admins_mobile_key" ON "admins"("mobile");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "admins_email_key" ON "admins"("email");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "users_mobile_key" ON "users"("mobile");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "users_mobile_idx" ON "users"("mobile");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "otp_codes_mobile_consumed_idx" ON "otp_codes"("mobile", "consumed");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "campaigns_slug_key" ON "campaigns"("slug");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "campaigns_status_start_at_end_at_idx" ON "campaigns"("status", "start_at", "end_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "prizes_campaign_id_status_idx" ON "prizes"("campaign_id", "status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "user_campaigns_user_id_campaign_id_key" ON "user_campaigns"("user_id", "campaign_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "chance_transactions_user_id_campaign_id_idx" ON "chance_transactions"("user_id", "campaign_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "spins_idempotency_key_key" ON "spins"("idempotency_key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "spins_user_id_campaign_id_idx" ON "spins"("user_id", "campaign_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "spins_campaign_id_created_at_idx" ON "spins"("campaign_id", "created_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "user_prizes_spin_id_key" ON "user_prizes"("spin_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "user_prizes_code_key" ON "user_prizes"("code");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_prizes_user_id_idx" ON "user_prizes"("user_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_prizes_status_idx" ON "user_prizes"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "sms_logs_mobile_type_idx" ON "sms_logs"("mobile", "type");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "admin_logs_entity_type_entity_id_idx" ON "admin_logs"("entity_type", "entity_id");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "otp_codes" ADD CONSTRAINT "otp_codes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "prizes" ADD CONSTRAINT "prizes_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_campaigns" ADD CONSTRAINT "user_campaigns_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_campaigns" ADD CONSTRAINT "user_campaigns_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_created_by_fkey" FOREIGN KEY ("created_by") REFERENCES "admins"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "spins" ADD CONSTRAINT "spins_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "spins" ADD CONSTRAINT "spins_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "spins" ADD CONSTRAINT "spins_prize_id_fkey" FOREIGN KEY ("prize_id") REFERENCES "prizes"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_prize_id_fkey" FOREIGN KEY ("prize_id") REFERENCES "prizes"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_spin_id_fkey" FOREIGN KEY ("spin_id") REFERENCES "spins"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "sms_logs" ADD CONSTRAINT "sms_logs_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "admin_logs" ADD CONSTRAINT "admin_logs_admin_id_fkey" FOREIGN KEY ("admin_id") REFERENCES "admins"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# Please do not edit this file manually
|
||||
# It should be added in your version-control system (i.e. Git)
|
||||
# Please do not edit this file manually
|
||||
# It should be added in your version-control system (i.e. Git)
|
||||
provider = "postgresql"
|
||||
@@ -1,315 +1,315 @@
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
// native = ویندوز/مک لوکال؛ debian = ایمیج node:20-bookworm-slim در Docker
|
||||
binaryTargets = ["native", "debian-openssl-3.0.x"]
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
// ==================== ENUMS ====================
|
||||
|
||||
enum AdminStatus {
|
||||
ACTIVE
|
||||
DISABLED
|
||||
}
|
||||
|
||||
enum AdminRole {
|
||||
SUPER_ADMIN
|
||||
OPERATOR
|
||||
SUPPORT
|
||||
}
|
||||
|
||||
enum UserStatus {
|
||||
ACTIVE
|
||||
BLOCKED
|
||||
}
|
||||
|
||||
enum CampaignStatus {
|
||||
DRAFT
|
||||
ACTIVE
|
||||
PAUSED
|
||||
FINISHED
|
||||
}
|
||||
|
||||
enum PrizeType {
|
||||
PHYSICAL
|
||||
DISCOUNT_CODE
|
||||
CREDIT
|
||||
CASH
|
||||
NO_PRIZE
|
||||
OTHER
|
||||
}
|
||||
|
||||
enum StockType {
|
||||
LIMITED
|
||||
UNLIMITED
|
||||
}
|
||||
|
||||
enum PrizeStatus {
|
||||
ACTIVE
|
||||
INACTIVE
|
||||
}
|
||||
|
||||
enum SpinStatus {
|
||||
SUCCESS
|
||||
FAILED
|
||||
DUPLICATE
|
||||
}
|
||||
|
||||
enum ChanceTxnType {
|
||||
SIGNUP_BONUS
|
||||
ADMIN_ADJUSTMENT
|
||||
SPIN_CONSUME
|
||||
CAMPAIGN_BONUS
|
||||
REFUND
|
||||
}
|
||||
|
||||
enum UserPrizeStatus {
|
||||
NEW
|
||||
CONTACTED
|
||||
DELIVERED
|
||||
ACTIVE_CODE
|
||||
USED
|
||||
EXPIRED
|
||||
}
|
||||
|
||||
enum SmsType {
|
||||
OTP
|
||||
WINNING
|
||||
NO_PRIZE
|
||||
PRIZE_REMINDER
|
||||
}
|
||||
|
||||
enum SmsStatus {
|
||||
PENDING
|
||||
SENT
|
||||
FAILED
|
||||
}
|
||||
|
||||
enum WheelDesign {
|
||||
CLASSIC_CASINO
|
||||
NEON_CYBER
|
||||
MINIMAL_FLAT
|
||||
LUXURY_GOLD
|
||||
PLAYFUL_CARTOON
|
||||
}
|
||||
|
||||
// ==================== MODELS ====================
|
||||
|
||||
model Admin {
|
||||
id String @id @default(uuid())
|
||||
name String
|
||||
mobile String @unique
|
||||
email String @unique
|
||||
passwordHash String @map("password_hash")
|
||||
role AdminRole @default(OPERATOR)
|
||||
status AdminStatus @default(ACTIVE)
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
auditLogs AdminLog[]
|
||||
chanceTxns ChanceTransaction[] @relation("AdminCreatedTxn")
|
||||
|
||||
@@map("admins")
|
||||
}
|
||||
|
||||
model User {
|
||||
id String @id @default(uuid())
|
||||
mobile String @unique
|
||||
name String?
|
||||
status UserStatus @default(ACTIVE)
|
||||
lastLoginAt DateTime? @map("last_login_at")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
userCampaigns UserCampaign[]
|
||||
chanceTransactions ChanceTransaction[]
|
||||
spins Spin[]
|
||||
userPrizes UserPrize[]
|
||||
otpCodes OtpCode[]
|
||||
smsLogs SmsLog[]
|
||||
|
||||
@@index([mobile])
|
||||
@@map("users")
|
||||
}
|
||||
|
||||
model OtpCode {
|
||||
id String @id @default(uuid())
|
||||
mobile String
|
||||
code String
|
||||
userId String? @map("user_id")
|
||||
user User? @relation(fields: [userId], references: [id])
|
||||
attempts Int @default(0)
|
||||
consumed Boolean @default(false)
|
||||
expiresAt DateTime @map("expires_at")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
@@index([mobile, consumed])
|
||||
@@map("otp_codes")
|
||||
}
|
||||
|
||||
model Campaign {
|
||||
id String @id @default(uuid())
|
||||
title String
|
||||
slug String @unique
|
||||
description String?
|
||||
image String?
|
||||
banner String?
|
||||
logo String?
|
||||
startAt DateTime @map("start_at")
|
||||
endAt DateTime @map("end_at")
|
||||
status CampaignStatus @default(DRAFT)
|
||||
defaultChances Int @default(0) @map("default_chances")
|
||||
rules String?
|
||||
ctaText String? @map("cta_text")
|
||||
wheelDesign WheelDesign @default(CLASSIC_CASINO) @map("wheel_design")
|
||||
settings Json? // primaryColor, secondaryColor, headerText, buttonText, headerImage, celebrationEffect...
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
prizes Prize[]
|
||||
userCampaigns UserCampaign[]
|
||||
chanceTxns ChanceTransaction[]
|
||||
spins Spin[]
|
||||
userPrizes UserPrize[]
|
||||
|
||||
@@index([status, startAt, endAt])
|
||||
@@map("campaigns")
|
||||
}
|
||||
|
||||
model Prize {
|
||||
id String @id @default(uuid())
|
||||
campaignId String @map("campaign_id")
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id], onDelete: Cascade)
|
||||
title String
|
||||
description String?
|
||||
image String?
|
||||
type PrizeType
|
||||
stockType StockType @map("stock_type")
|
||||
initialStock Int? @map("initial_stock")
|
||||
remainingStock Int? @map("remaining_stock")
|
||||
weight Int
|
||||
status PrizeStatus @default(ACTIVE)
|
||||
sortOrder Int @default(0) @map("sort_order")
|
||||
segmentColor String @map("segment_color")
|
||||
expiresAt DateTime? @map("expires_at")
|
||||
smsTemplate String? @map("sms_template")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
spins Spin[]
|
||||
userPrizes UserPrize[]
|
||||
|
||||
@@index([campaignId, status])
|
||||
@@map("prizes")
|
||||
}
|
||||
|
||||
model UserCampaign {
|
||||
id String @id @default(uuid())
|
||||
userId String @map("user_id")
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
campaignId String @map("campaign_id")
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id])
|
||||
totalChances Int @default(0) @map("total_chances")
|
||||
usedChances Int @default(0) @map("used_chances")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
@@unique([userId, campaignId])
|
||||
@@map("user_campaigns")
|
||||
}
|
||||
|
||||
model ChanceTransaction {
|
||||
id String @id @default(uuid())
|
||||
userId String @map("user_id")
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
campaignId String @map("campaign_id")
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id])
|
||||
amount Int // مثبت یا منفی
|
||||
type ChanceTxnType
|
||||
referenceType String? @map("reference_type") // e.g. "spin", "manual"
|
||||
referenceId String? @map("reference_id")
|
||||
description String?
|
||||
createdById String? @map("created_by") // admin id در صورت تغییر دستی
|
||||
createdBy Admin? @relation("AdminCreatedTxn", fields: [createdById], references: [id])
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
@@index([userId, campaignId])
|
||||
@@map("chance_transactions")
|
||||
}
|
||||
|
||||
model Spin {
|
||||
id String @id @default(uuid())
|
||||
userId String @map("user_id")
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
campaignId String @map("campaign_id")
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id])
|
||||
prizeId String? @map("prize_id")
|
||||
prize Prize? @relation(fields: [prizeId], references: [id])
|
||||
status SpinStatus @default(SUCCESS)
|
||||
idempotencyKey String @unique @map("idempotency_key")
|
||||
ip String?
|
||||
userAgent String? @map("user_agent")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
userPrize UserPrize?
|
||||
|
||||
@@index([userId, campaignId])
|
||||
@@index([campaignId, createdAt])
|
||||
@@map("spins")
|
||||
}
|
||||
|
||||
model UserPrize {
|
||||
id String @id @default(uuid())
|
||||
userId String @map("user_id")
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
campaignId String @map("campaign_id")
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id])
|
||||
prizeId String @map("prize_id")
|
||||
prize Prize @relation(fields: [prizeId], references: [id])
|
||||
spinId String @unique @map("spin_id")
|
||||
spin Spin @relation(fields: [spinId], references: [id])
|
||||
code String? @unique
|
||||
status UserPrizeStatus @default(NEW)
|
||||
wonAt DateTime @default(now()) @map("won_at")
|
||||
redeemedAt DateTime? @map("redeemed_at")
|
||||
|
||||
@@index([userId])
|
||||
@@index([status])
|
||||
@@map("user_prizes")
|
||||
}
|
||||
|
||||
model SmsLog {
|
||||
id String @id @default(uuid())
|
||||
userId String? @map("user_id")
|
||||
user User? @relation(fields: [userId], references: [id])
|
||||
mobile String
|
||||
type SmsType
|
||||
message String
|
||||
provider String @default("raygansms")
|
||||
status SmsStatus @default(PENDING)
|
||||
providerResponse Json? @map("provider_response")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
@@index([mobile, type])
|
||||
@@map("sms_logs")
|
||||
}
|
||||
|
||||
model AdminLog {
|
||||
id String @id @default(uuid())
|
||||
adminId String @map("admin_id")
|
||||
admin Admin @relation(fields: [adminId], references: [id])
|
||||
action String // e.g. "prize.update", "chance.add"
|
||||
entityType String @map("entity_type")
|
||||
entityId String @map("entity_id")
|
||||
oldValue Json? @map("old_value")
|
||||
newValue Json? @map("new_value")
|
||||
ip String?
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
@@index([entityType, entityId])
|
||||
@@map("admin_logs")
|
||||
}
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
// native = ویندوز/مک لوکال؛ debian = ایمیج node:20-bookworm-slim در Docker
|
||||
binaryTargets = ["native", "debian-openssl-3.0.x"]
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
// ==================== ENUMS ====================
|
||||
|
||||
enum AdminStatus {
|
||||
ACTIVE
|
||||
DISABLED
|
||||
}
|
||||
|
||||
enum AdminRole {
|
||||
SUPER_ADMIN
|
||||
OPERATOR
|
||||
SUPPORT
|
||||
}
|
||||
|
||||
enum UserStatus {
|
||||
ACTIVE
|
||||
BLOCKED
|
||||
}
|
||||
|
||||
enum CampaignStatus {
|
||||
DRAFT
|
||||
ACTIVE
|
||||
PAUSED
|
||||
FINISHED
|
||||
}
|
||||
|
||||
enum PrizeType {
|
||||
PHYSICAL
|
||||
DISCOUNT_CODE
|
||||
CREDIT
|
||||
CASH
|
||||
NO_PRIZE
|
||||
OTHER
|
||||
}
|
||||
|
||||
enum StockType {
|
||||
LIMITED
|
||||
UNLIMITED
|
||||
}
|
||||
|
||||
enum PrizeStatus {
|
||||
ACTIVE
|
||||
INACTIVE
|
||||
}
|
||||
|
||||
enum SpinStatus {
|
||||
SUCCESS
|
||||
FAILED
|
||||
DUPLICATE
|
||||
}
|
||||
|
||||
enum ChanceTxnType {
|
||||
SIGNUP_BONUS
|
||||
ADMIN_ADJUSTMENT
|
||||
SPIN_CONSUME
|
||||
CAMPAIGN_BONUS
|
||||
REFUND
|
||||
}
|
||||
|
||||
enum UserPrizeStatus {
|
||||
NEW
|
||||
CONTACTED
|
||||
DELIVERED
|
||||
ACTIVE_CODE
|
||||
USED
|
||||
EXPIRED
|
||||
}
|
||||
|
||||
enum SmsType {
|
||||
OTP
|
||||
WINNING
|
||||
NO_PRIZE
|
||||
PRIZE_REMINDER
|
||||
}
|
||||
|
||||
enum SmsStatus {
|
||||
PENDING
|
||||
SENT
|
||||
FAILED
|
||||
}
|
||||
|
||||
enum WheelDesign {
|
||||
CLASSIC_CASINO
|
||||
NEON_CYBER
|
||||
MINIMAL_FLAT
|
||||
LUXURY_GOLD
|
||||
PLAYFUL_CARTOON
|
||||
}
|
||||
|
||||
// ==================== MODELS ====================
|
||||
|
||||
model Admin {
|
||||
id String @id @default(uuid())
|
||||
name String
|
||||
mobile String @unique
|
||||
email String @unique
|
||||
passwordHash String @map("password_hash")
|
||||
role AdminRole @default(OPERATOR)
|
||||
status AdminStatus @default(ACTIVE)
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
auditLogs AdminLog[]
|
||||
chanceTxns ChanceTransaction[] @relation("AdminCreatedTxn")
|
||||
|
||||
@@map("admins")
|
||||
}
|
||||
|
||||
model User {
|
||||
id String @id @default(uuid())
|
||||
mobile String @unique
|
||||
name String?
|
||||
status UserStatus @default(ACTIVE)
|
||||
lastLoginAt DateTime? @map("last_login_at")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
userCampaigns UserCampaign[]
|
||||
chanceTransactions ChanceTransaction[]
|
||||
spins Spin[]
|
||||
userPrizes UserPrize[]
|
||||
otpCodes OtpCode[]
|
||||
smsLogs SmsLog[]
|
||||
|
||||
@@index([mobile])
|
||||
@@map("users")
|
||||
}
|
||||
|
||||
model OtpCode {
|
||||
id String @id @default(uuid())
|
||||
mobile String
|
||||
code String
|
||||
userId String? @map("user_id")
|
||||
user User? @relation(fields: [userId], references: [id])
|
||||
attempts Int @default(0)
|
||||
consumed Boolean @default(false)
|
||||
expiresAt DateTime @map("expires_at")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
@@index([mobile, consumed])
|
||||
@@map("otp_codes")
|
||||
}
|
||||
|
||||
model Campaign {
|
||||
id String @id @default(uuid())
|
||||
title String
|
||||
slug String @unique
|
||||
description String?
|
||||
image String?
|
||||
banner String?
|
||||
logo String?
|
||||
startAt DateTime @map("start_at")
|
||||
endAt DateTime @map("end_at")
|
||||
status CampaignStatus @default(DRAFT)
|
||||
defaultChances Int @default(0) @map("default_chances")
|
||||
rules String?
|
||||
ctaText String? @map("cta_text")
|
||||
wheelDesign WheelDesign @default(CLASSIC_CASINO) @map("wheel_design")
|
||||
settings Json? // primaryColor, secondaryColor, headerText, buttonText, headerImage, celebrationEffect...
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
prizes Prize[]
|
||||
userCampaigns UserCampaign[]
|
||||
chanceTxns ChanceTransaction[]
|
||||
spins Spin[]
|
||||
userPrizes UserPrize[]
|
||||
|
||||
@@index([status, startAt, endAt])
|
||||
@@map("campaigns")
|
||||
}
|
||||
|
||||
model Prize {
|
||||
id String @id @default(uuid())
|
||||
campaignId String @map("campaign_id")
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id], onDelete: Cascade)
|
||||
title String
|
||||
description String?
|
||||
image String?
|
||||
type PrizeType
|
||||
stockType StockType @map("stock_type")
|
||||
initialStock Int? @map("initial_stock")
|
||||
remainingStock Int? @map("remaining_stock")
|
||||
weight Int
|
||||
status PrizeStatus @default(ACTIVE)
|
||||
sortOrder Int @default(0) @map("sort_order")
|
||||
segmentColor String @map("segment_color")
|
||||
expiresAt DateTime? @map("expires_at")
|
||||
smsTemplate String? @map("sms_template")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
spins Spin[]
|
||||
userPrizes UserPrize[]
|
||||
|
||||
@@index([campaignId, status])
|
||||
@@map("prizes")
|
||||
}
|
||||
|
||||
model UserCampaign {
|
||||
id String @id @default(uuid())
|
||||
userId String @map("user_id")
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
campaignId String @map("campaign_id")
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id])
|
||||
totalChances Int @default(0) @map("total_chances")
|
||||
usedChances Int @default(0) @map("used_chances")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
@@unique([userId, campaignId])
|
||||
@@map("user_campaigns")
|
||||
}
|
||||
|
||||
model ChanceTransaction {
|
||||
id String @id @default(uuid())
|
||||
userId String @map("user_id")
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
campaignId String @map("campaign_id")
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id])
|
||||
amount Int // مثبت یا منفی
|
||||
type ChanceTxnType
|
||||
referenceType String? @map("reference_type") // e.g. "spin", "manual"
|
||||
referenceId String? @map("reference_id")
|
||||
description String?
|
||||
createdById String? @map("created_by") // admin id در صورت تغییر دستی
|
||||
createdBy Admin? @relation("AdminCreatedTxn", fields: [createdById], references: [id])
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
@@index([userId, campaignId])
|
||||
@@map("chance_transactions")
|
||||
}
|
||||
|
||||
model Spin {
|
||||
id String @id @default(uuid())
|
||||
userId String @map("user_id")
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
campaignId String @map("campaign_id")
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id])
|
||||
prizeId String? @map("prize_id")
|
||||
prize Prize? @relation(fields: [prizeId], references: [id])
|
||||
status SpinStatus @default(SUCCESS)
|
||||
idempotencyKey String @unique @map("idempotency_key")
|
||||
ip String?
|
||||
userAgent String? @map("user_agent")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
userPrize UserPrize?
|
||||
|
||||
@@index([userId, campaignId])
|
||||
@@index([campaignId, createdAt])
|
||||
@@map("spins")
|
||||
}
|
||||
|
||||
model UserPrize {
|
||||
id String @id @default(uuid())
|
||||
userId String @map("user_id")
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
campaignId String @map("campaign_id")
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id])
|
||||
prizeId String @map("prize_id")
|
||||
prize Prize @relation(fields: [prizeId], references: [id])
|
||||
spinId String @unique @map("spin_id")
|
||||
spin Spin @relation(fields: [spinId], references: [id])
|
||||
code String? @unique
|
||||
status UserPrizeStatus @default(NEW)
|
||||
wonAt DateTime @default(now()) @map("won_at")
|
||||
redeemedAt DateTime? @map("redeemed_at")
|
||||
|
||||
@@index([userId])
|
||||
@@index([status])
|
||||
@@map("user_prizes")
|
||||
}
|
||||
|
||||
model SmsLog {
|
||||
id String @id @default(uuid())
|
||||
userId String? @map("user_id")
|
||||
user User? @relation(fields: [userId], references: [id])
|
||||
mobile String
|
||||
type SmsType
|
||||
message String
|
||||
provider String @default("raygansms")
|
||||
status SmsStatus @default(PENDING)
|
||||
providerResponse Json? @map("provider_response")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
@@index([mobile, type])
|
||||
@@map("sms_logs")
|
||||
}
|
||||
|
||||
model AdminLog {
|
||||
id String @id @default(uuid())
|
||||
adminId String @map("admin_id")
|
||||
admin Admin @relation(fields: [adminId], references: [id])
|
||||
action String // e.g. "prize.update", "chance.add"
|
||||
entityType String @map("entity_type")
|
||||
entityId String @map("entity_id")
|
||||
oldValue Json? @map("old_value")
|
||||
newValue Json? @map("new_value")
|
||||
ip String?
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
@@index([entityType, entityId])
|
||||
@@map("admin_logs")
|
||||
}
|
||||
|
||||
@@ -1,52 +1,52 @@
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
async function main() {
|
||||
const user = await prisma.user.upsert({
|
||||
where: { mobile: '09382507041' },
|
||||
create: {
|
||||
mobile: '09382507041',
|
||||
name: 'کاربر ویژه',
|
||||
status: 'ACTIVE',
|
||||
},
|
||||
update: {
|
||||
status: 'ACTIVE',
|
||||
},
|
||||
});
|
||||
|
||||
const campaign = await prisma.campaign.findUnique({
|
||||
where: { slug: 'default-campaign' },
|
||||
});
|
||||
|
||||
if (campaign) {
|
||||
await prisma.userCampaign.upsert({
|
||||
where: {
|
||||
userId_campaignId: {
|
||||
userId: user.id,
|
||||
campaignId: campaign.id,
|
||||
},
|
||||
},
|
||||
create: {
|
||||
userId: user.id,
|
||||
campaignId: campaign.id,
|
||||
totalChances: 10,
|
||||
usedChances: 0,
|
||||
},
|
||||
update: {
|
||||
totalChances: { increment: 10 },
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
console.log('SUCCESS: User 09382507041 is authorized and ready with 10 chances!');
|
||||
}
|
||||
|
||||
main()
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
})
|
||||
.finally(async () => {
|
||||
await prisma.$disconnect();
|
||||
});
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
async function main() {
|
||||
const user = await prisma.user.upsert({
|
||||
where: { mobile: '09382507041' },
|
||||
create: {
|
||||
mobile: '09382507041',
|
||||
name: 'کاربر ویژه',
|
||||
status: 'ACTIVE',
|
||||
},
|
||||
update: {
|
||||
status: 'ACTIVE',
|
||||
},
|
||||
});
|
||||
|
||||
const campaign = await prisma.campaign.findUnique({
|
||||
where: { slug: 'default-campaign' },
|
||||
});
|
||||
|
||||
if (campaign) {
|
||||
await prisma.userCampaign.upsert({
|
||||
where: {
|
||||
userId_campaignId: {
|
||||
userId: user.id,
|
||||
campaignId: campaign.id,
|
||||
},
|
||||
},
|
||||
create: {
|
||||
userId: user.id,
|
||||
campaignId: campaign.id,
|
||||
totalChances: 10,
|
||||
usedChances: 0,
|
||||
},
|
||||
update: {
|
||||
totalChances: { increment: 10 },
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
console.log('SUCCESS: User 09382507041 is authorized and ready with 10 chances!');
|
||||
}
|
||||
|
||||
main()
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
})
|
||||
.finally(async () => {
|
||||
await prisma.$disconnect();
|
||||
});
|
||||
|
||||
+116
-116
@@ -1,116 +1,116 @@
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
async function main() {
|
||||
console.log('Seeding default demo campaign and prizes...');
|
||||
|
||||
const existingCampaign = await prisma.campaign.findUnique({
|
||||
where: { slug: 'default-campaign' },
|
||||
});
|
||||
|
||||
if (existingCampaign) {
|
||||
console.log('Default campaign already exists.');
|
||||
return;
|
||||
}
|
||||
|
||||
const campaign = await prisma.campaign.create({
|
||||
data: {
|
||||
title: 'گردونه شانس جشنواره بزرگ نوروزی',
|
||||
slug: 'default-campaign',
|
||||
description: 'هر روز با چرخاندن گردونه، شانس برنده شدن آیفون، سکه طلا، و کدهای تخفیف شگفتانگیز را داشته باشید!',
|
||||
startAt: new Date(Date.now() - 24 * 3600 * 1000),
|
||||
endAt: new Date(Date.now() + 60 * 24 * 3600 * 1000),
|
||||
status: 'ACTIVE',
|
||||
defaultChances: 3,
|
||||
ctaText: 'بچرخون و برنده شو!',
|
||||
wheelDesign: 'CLASSIC_CASINO',
|
||||
rules: '۱. هر کاربر در بدو ورود ۳ شانس چرخاندن رایگان دریافت میکند.\n۲. جوایز فیزیکی پس از هماهنگی تلفنی توسط پشتیبانی ارسال خواهد شد.\n۳. کدهای تخفیف بلافاصله پیامک شده و تا ۷ روز پس از دریافت معتبر هستند.',
|
||||
prizes: {
|
||||
create: [
|
||||
{
|
||||
title: 'آیفون ۱۵ پرو',
|
||||
type: 'PHYSICAL',
|
||||
stockType: 'LIMITED',
|
||||
initialStock: 3,
|
||||
remainingStock: 3,
|
||||
weight: 1,
|
||||
sortOrder: 1,
|
||||
segmentColor: '#b91c1c',
|
||||
},
|
||||
{
|
||||
title: 'تخفیف ۵۰٪ دیجیکالا',
|
||||
type: 'DISCOUNT_CODE',
|
||||
stockType: 'UNLIMITED',
|
||||
weight: 25,
|
||||
sortOrder: 2,
|
||||
segmentColor: '#1e293b',
|
||||
},
|
||||
{
|
||||
title: 'کارت هدیه ۵۰۰ تومانی',
|
||||
type: 'CREDIT',
|
||||
stockType: 'LIMITED',
|
||||
initialStock: 50,
|
||||
remainingStock: 50,
|
||||
weight: 10,
|
||||
sortOrder: 3,
|
||||
segmentColor: '#b91c1c',
|
||||
},
|
||||
{
|
||||
title: 'پوچ (دفعه بعد)',
|
||||
type: 'NO_PRIZE',
|
||||
stockType: 'UNLIMITED',
|
||||
weight: 20,
|
||||
sortOrder: 4,
|
||||
segmentColor: '#1e293b',
|
||||
},
|
||||
{
|
||||
title: 'تخفیف ۳۰٪ اسنپ',
|
||||
type: 'DISCOUNT_CODE',
|
||||
stockType: 'UNLIMITED',
|
||||
weight: 20,
|
||||
sortOrder: 5,
|
||||
segmentColor: '#b91c1c',
|
||||
},
|
||||
{
|
||||
title: 'ساعت هوشمند',
|
||||
type: 'PHYSICAL',
|
||||
stockType: 'LIMITED',
|
||||
initialStock: 10,
|
||||
remainingStock: 10,
|
||||
weight: 4,
|
||||
sortOrder: 6,
|
||||
segmentColor: '#1e293b',
|
||||
},
|
||||
{
|
||||
title: 'شانس مجدد',
|
||||
type: 'OTHER',
|
||||
stockType: 'UNLIMITED',
|
||||
weight: 15,
|
||||
sortOrder: 7,
|
||||
segmentColor: '#b91c1c',
|
||||
},
|
||||
{
|
||||
title: 'پوچ (بدون جایزه)',
|
||||
type: 'NO_PRIZE',
|
||||
stockType: 'UNLIMITED',
|
||||
weight: 5,
|
||||
sortOrder: 8,
|
||||
segmentColor: '#1e293b',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
console.log(`Campaign created with ID: ${campaign.id} and 8 prizes.`);
|
||||
}
|
||||
|
||||
main()
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
})
|
||||
.finally(async () => {
|
||||
await prisma.$disconnect();
|
||||
});
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
async function main() {
|
||||
console.log('Seeding default demo campaign and prizes...');
|
||||
|
||||
const existingCampaign = await prisma.campaign.findUnique({
|
||||
where: { slug: 'default-campaign' },
|
||||
});
|
||||
|
||||
if (existingCampaign) {
|
||||
console.log('Default campaign already exists.');
|
||||
return;
|
||||
}
|
||||
|
||||
const campaign = await prisma.campaign.create({
|
||||
data: {
|
||||
title: 'گردونه شانس جشنواره بزرگ نوروزی',
|
||||
slug: 'default-campaign',
|
||||
description: 'هر روز با چرخاندن گردونه، شانس برنده شدن آیفون، سکه طلا، و کدهای تخفیف شگفتانگیز را داشته باشید!',
|
||||
startAt: new Date(Date.now() - 24 * 3600 * 1000),
|
||||
endAt: new Date(Date.now() + 60 * 24 * 3600 * 1000),
|
||||
status: 'ACTIVE',
|
||||
defaultChances: 3,
|
||||
ctaText: 'بچرخون و برنده شو!',
|
||||
wheelDesign: 'CLASSIC_CASINO',
|
||||
rules: '۱. هر کاربر در بدو ورود ۳ شانس چرخاندن رایگان دریافت میکند.\n۲. جوایز فیزیکی پس از هماهنگی تلفنی توسط پشتیبانی ارسال خواهد شد.\n۳. کدهای تخفیف بلافاصله پیامک شده و تا ۷ روز پس از دریافت معتبر هستند.',
|
||||
prizes: {
|
||||
create: [
|
||||
{
|
||||
title: 'آیفون ۱۵ پرو',
|
||||
type: 'PHYSICAL',
|
||||
stockType: 'LIMITED',
|
||||
initialStock: 3,
|
||||
remainingStock: 3,
|
||||
weight: 1,
|
||||
sortOrder: 1,
|
||||
segmentColor: '#b91c1c',
|
||||
},
|
||||
{
|
||||
title: 'تخفیف ۵۰٪ دیجیکالا',
|
||||
type: 'DISCOUNT_CODE',
|
||||
stockType: 'UNLIMITED',
|
||||
weight: 25,
|
||||
sortOrder: 2,
|
||||
segmentColor: '#1e293b',
|
||||
},
|
||||
{
|
||||
title: 'کارت هدیه ۵۰۰ تومانی',
|
||||
type: 'CREDIT',
|
||||
stockType: 'LIMITED',
|
||||
initialStock: 50,
|
||||
remainingStock: 50,
|
||||
weight: 10,
|
||||
sortOrder: 3,
|
||||
segmentColor: '#b91c1c',
|
||||
},
|
||||
{
|
||||
title: 'پوچ (دفعه بعد)',
|
||||
type: 'NO_PRIZE',
|
||||
stockType: 'UNLIMITED',
|
||||
weight: 20,
|
||||
sortOrder: 4,
|
||||
segmentColor: '#1e293b',
|
||||
},
|
||||
{
|
||||
title: 'تخفیف ۳۰٪ اسنپ',
|
||||
type: 'DISCOUNT_CODE',
|
||||
stockType: 'UNLIMITED',
|
||||
weight: 20,
|
||||
sortOrder: 5,
|
||||
segmentColor: '#b91c1c',
|
||||
},
|
||||
{
|
||||
title: 'ساعت هوشمند',
|
||||
type: 'PHYSICAL',
|
||||
stockType: 'LIMITED',
|
||||
initialStock: 10,
|
||||
remainingStock: 10,
|
||||
weight: 4,
|
||||
sortOrder: 6,
|
||||
segmentColor: '#1e293b',
|
||||
},
|
||||
{
|
||||
title: 'شانس مجدد',
|
||||
type: 'OTHER',
|
||||
stockType: 'UNLIMITED',
|
||||
weight: 15,
|
||||
sortOrder: 7,
|
||||
segmentColor: '#b91c1c',
|
||||
},
|
||||
{
|
||||
title: 'پوچ (بدون جایزه)',
|
||||
type: 'NO_PRIZE',
|
||||
stockType: 'UNLIMITED',
|
||||
weight: 5,
|
||||
sortOrder: 8,
|
||||
segmentColor: '#1e293b',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
console.log(`Campaign created with ID: ${campaign.id} and 8 prizes.`);
|
||||
}
|
||||
|
||||
main()
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
})
|
||||
.finally(async () => {
|
||||
await prisma.$disconnect();
|
||||
});
|
||||
|
||||
@@ -1 +1 @@
|
||||
VITE_API_BASE_URL=https://api.wheel.montzar.ir/api
|
||||
VITE_API_BASE_URL=https://api.wheel.montest.ir/api
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
import{d as de,u as Ae,w as pe,m as De,c as f,a as s,e as Z,b as i,j as Q,t as j,k as D,p as Be,q as Ve,v as ze,g as z,i as c,s as at,h as Ue,f as We,n as Te,l as Ge,x as W,y as oe,F as le,r as re,z as _e,o as ot,A as lt,B as rt}from"./index-ilYp-WvI.js";import{c as K,t as ie,L as ke,C as Ze,A as it,b as ct,a as ut}from"./loader-circle-w-52iWEJ.js";var me=(k=>(k.CLASSIC_CASINO="CLASSIC_CASINO",k.NEON_CYBER="NEON_CYBER",k.MINIMAL_FLAT="MINIMAL_FLAT",k.LUXURY_GOLD="LUXURY_GOLD",k.PLAYFUL_CARTOON="PLAYFUL_CARTOON",k))(me||{});/**
|
||||
import{d as de,u as Ae,w as pe,m as De,c as f,a as s,e as Z,b as i,j as Q,t as j,k as D,p as Be,q as Ve,v as ze,g as z,i as c,s as at,h as Ue,f as We,n as Te,l as Ge,x as W,y as oe,F as le,r as re,z as _e,o as ot,A as lt,B as rt}from"./index-CFILnBxv.js";import{c as K,t as ie,L as ke,C as Ze,A as it,b as ct,a as ut}from"./loader-circle-CjrTYK9r.js";var me=(k=>(k.CLASSIC_CASINO="CLASSIC_CASINO",k.NEON_CYBER="NEON_CYBER",k.MINIMAL_FLAT="MINIMAL_FLAT",k.LUXURY_GOLD="LUXURY_GOLD",k.PLAYFUL_CARTOON="PLAYFUL_CARTOON",k))(me||{});/**
|
||||
* @license lucide-vue-next v0.378.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
import{c as k,A as D,a as j,L as E,C as z,b as I,t as y}from"./loader-circle-w-52iWEJ.js";import{d as L,u as S,o as V,c as r,a as e,b as a,e as i,F as N,r as R,f as T,g as b,h as B,i as l,j as p,t as n,n as M,k as w,l as F}from"./index-ilYp-WvI.js";/**
|
||||
import{c as k,A as D,a as j,L as E,C as z,b as I,t as y}from"./loader-circle-CjrTYK9r.js";import{d as L,u as S,o as V,c as r,a as e,b as a,e as i,F as N,r as R,f as T,g as b,h as B,i as l,j as p,t as n,n as M,k as w,l as F}from"./index-CFILnBxv.js";/**
|
||||
* @license lucide-vue-next v0.378.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
+3
-3
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
import{C as a}from"./index-ilYp-WvI.js";const s=["۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"];function g(e){return e==null||typeof e=="object"&&e!==null&&"value"in e&&(e=e.value,e==null)||typeof e=="object"?"":String(e).replace(/[0-9]/g,t=>s[+t]).replace(/[٠-٩]/g,t=>s[t.charCodeAt(0)-1632])}/**
|
||||
import{C as a}from"./index-CFILnBxv.js";const s=["۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"];function g(e){return e==null||typeof e=="object"&&e!==null&&"value"in e&&(e=e.value,e==null)||typeof e=="object"?"":String(e).replace(/[0-9]/g,t=>s[+t]).replace(/[٠-٩]/g,t=>s[t.charCodeAt(0)-1632])}/**
|
||||
* @license lucide-vue-next v0.378.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
Vendored
+1
-1
@@ -9,7 +9,7 @@
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
|
||||
<script type="module" crossorigin src="/assets/index-ilYp-WvI.js"></script>
|
||||
<script type="module" crossorigin src="/assets/index-CFILnBxv.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-BqdIdFn_.css">
|
||||
</head>
|
||||
<body class="bg-slate-900 text-slate-100 font-sans antialiased selection:bg-brand-500 selection:text-white overflow-x-hidden min-h-screen">
|
||||
|
||||
Reference in New Issue
Block a user