49 lines
13 KiB
JavaScript
49 lines
13 KiB
JavaScript
import{adminDb as l}from"./adminDb-b061a757.js";import{I as M}from"./index-1ba0f9ec.js";import{fetchMatchingUserIds as $,applySupabasePagination as y,MAX_USER_IDS_IN_SEARCH as O,toPostgrestIlikeTerm as E}from"./supabaseTableQuery-e0472e9c.js";import{e as P}from"./convert-2ad76038.js";function B(e){if(Array.isArray(e))return e.map(String).filter(Boolean);if(typeof e=="string")try{const t=JSON.parse(e);if(Array.isArray(t))return t.map(String).filter(Boolean)}catch{return e.trim()?[e]:[]}return[]}function W(e){return{...e,duration_minutes:Math.round((Number(e.duration_seconds)||0)/60),kodoblu_voice_url:P(e.kodoblu_voice_url)||"",audio_section_url:P(e.audio_section_url)||"",step_images:B(e.step_images).map(t=>P(t)||t)}}async function L(e){const{data:t,error:r}=await l.from("step_challenges").select("*").eq("id",e).single();if(r)throw r;const{data:a,error:i}=await l.from("step_challenge_steps").select("*").eq("challenge_id",e).order("step_order",{ascending:!0});if(i)throw i;return{...t,steps:(a||[]).map(s=>W(s))}}async function Y(e,t){return(await M.post("/admin/step-challenges/with-steps",{...e,owner_id:t??null})).data}async function Z(e,t){return(await M.put(`/admin/step-challenges/${e}/with-steps`,t)).data}async function ee(e){const{data:t,error:r}=await l.from("user_step_challenges").select("id").eq("challenge_id",e);if(r)throw r;const a=(t||[]).map(o=>o.id);if(a.length){const{error:o}=await l.from("user_step_challenge_steps").delete().in("user_challenge_id",a);if(o)throw o;const{error:n}=await l.from("user_step_challenges").delete().eq("challenge_id",e);if(n)throw n}const{error:i}=await l.from("user_step_challenge_unlocks").delete().eq("challenge_id",e);if(i)throw i;const{error:s}=await l.from("step_challenges").delete().eq("id",e);if(s)throw s}async function te(){const{data:e,error:t}=await l.from("step_challenge_chapters").select("*").order("sort_order",{ascending:!0}).order("id",{ascending:!0});if(t)throw t;return e||[]}async function re(e){var a,i;const{data:t,error:r}=await l.from("step_challenge_chapters").insert([{title:e.title,subtitle:((a=e.subtitle)==null?void 0:a.trim())||null,theme_key:e.theme_key||"meadow",cover_image_url:((i=e.cover_image_url)==null?void 0:i.trim())||null,sort_order:Number(e.sort_order)||0,show:e.show??!0}]).select().single();if(r)throw r;return t}async function ae(e,t){const{data:r,error:a}=await l.from("step_challenge_chapters").update({...t,updated_at:new Date().toISOString()}).eq("id",e).select().single();if(a)throw a;return r}async function ne(e){const{error:t}=await l.from("step_challenge_chapters").delete().eq("id",e);if(t)throw t}async function se(e){const{count:t,error:r}=await l.from("step_challenges").select("id",{count:"exact",head:!0}).eq("chapter_id",e);if(r)throw r;return t||0}async function ie(e){const{data:t,error:r}=await l.from("step_challenges").select("id, title, show, sort_order, chapter_id, character_image_url, access_type, completion_points, publish_date, publish_time").eq("chapter_id",e).order("sort_order",{ascending:!0}).order("id",{ascending:!0});if(r)throw r;return t||[]}function k(e){if(!e)return{user_name:"نامشخص",user_phone:""};let t="نامشخص";return e!=null&&e.name?t=e.name:e!=null&&e.first_name||e!=null&&e.last_name?t=`${e.first_name||""} ${e.last_name||""}`.trim():e!=null&&e.phone&&(t=e.phone),{user_name:t,user_phone:(e==null?void 0:e.phone)||""}}function F(e){const t=Array.isArray(e.user_step_challenges)?e.user_step_challenges[0]:e.user_step_challenges,r=Array.isArray(t==null?void 0:t.users)?t.users[0]:t==null?void 0:t.users;return k(r)}function C(e,t,r=10){return{page:Math.max(1,e||1),pageSize:Math.min(100,Math.max(1,t||r))}}function j(e,t){return{rows:[],total:0,page:e,pageSize:t}}async function A(e){const t=e.trim();if(t)return(await $(l,t)).slice(0,O)}function N(e,t,r="user_step_challenges.user_id"){return t?t.length?e.in(r,t):null:e}function J(e,t,r,a,i){const s=t.trim();if(!s)return e;const o=E(s);return i!=null&&i.length?e.or(`${r}.ilike.${o},${a}.in.(${i.join(",")})`):e.ilike(r,s)}async function Q(e,t){const{data:r,error:a}=await l.from("user_step_challenges").select("id").eq("challenge_id",e).in("user_id",t);if(a)throw a;return(r||[]).map(i=>i.id)}function R(e,t,r,a){const i=t.trim();if(!i)return e;const s=E(i);return a!=null&&a.length?e.or(`${r}.ilike.${s},user_challenge_id.in.(${a.join(",")})`):e.ilike(r,i)}function H(e){if(Array.isArray(e))return e.map(String);if(typeof e=="string")try{const t=JSON.parse(e);if(Array.isArray(t))return t.map(String)}catch{return[]}return[]}async function oe(){return(await M.get("/admin/step-challenges/progress-overview")).data}async function ce(e){const{data:t,error:r}=await l.from("step_challenges").select("id, title").eq("id",e).single();if(r)throw r;return t}async function le(e){const{data:t,error:r}=await l.from("step_challenge_steps").select(`
|
|
id,
|
|
step_order,
|
|
description,
|
|
is_final_step,
|
|
enable_feedback_text,
|
|
enable_photo_upload,
|
|
enable_voice_upload,
|
|
enable_mcq,
|
|
requires_photo_upload
|
|
`).eq("challenge_id",e).order("step_order",{ascending:!0});if(r)throw r;return(t||[]).map(a=>({id:a.id,step_order:a.step_order,description:(a.description||"").trim(),is_final_step:!!a.is_final_step,enable_feedback_text:!!a.enable_feedback_text,enable_photo_upload:!!(a.enable_photo_upload||a.requires_photo_upload),enable_voice_upload:!!a.enable_voice_upload,enable_mcq:!!a.enable_mcq,label:`مرحله ${a.step_order}`}))}async function _e(e,t="",r,a=1,i=10){const{page:s,pageSize:o}=C(a,i);let n=l.from("user_step_challenge_steps").select(`
|
|
id,
|
|
step_id,
|
|
feedback_text,
|
|
created_at,
|
|
user_step_challenges!inner (
|
|
challenge_id,
|
|
users (name, phone, first_name, last_name)
|
|
)
|
|
`,{count:"exact"}).eq("user_step_challenges.challenge_id",e).not("feedback_text","is",null).neq("feedback_text","");r&&(n=n.eq("step_id",r));const h=await A(t),m=h!=null&&h.length?await Q(e,h):void 0;n=R(n,t,"feedback_text",m),n=n.order("created_at",{ascending:!1}),n=y(n,s,o);const{data:f,error:c,count:_}=await n;if(c)throw c;const d=(s-1)*o;return{rows:(f||[]).map((g,p)=>{const{user_name:S,user_phone:w}=F(g);return{id:`step-${g.id}`,user_name:S,user_phone:w,feedback_text:String(g.feedback_text||"").trim(),source:"step",step_id:g.step_id,created_at:g.created_at,index:d+p+1}}),total:_??0,page:s,pageSize:o}}async function de(e,t="",r=1,a=10){const{page:i,pageSize:s}=C(r,a);let o=l.from("user_step_challenges").select("id, completion_feedback, completed_at, created_at, users(name, phone, first_name, last_name)",{count:"exact"}).eq("challenge_id",e).not("completion_feedback","is",null).neq("completion_feedback","");const n=await A(t);o=J(o,t,"completion_feedback","user_id",n),o=o.order("created_at",{ascending:!1}),o=y(o,i,s);const{data:h,error:m,count:f}=await o;if(m)throw m;const c=(i-1)*s;return{rows:(h||[]).map((d,u)=>{const g=Array.isArray(d.users)?d.users[0]:d.users,{user_name:p,user_phone:S}=k(g);return{id:`completion-${d.id}`,user_name:p,user_phone:S,feedback_text:String(d.completion_feedback||"").trim(),created_at:d.completed_at||d.created_at,index:c+u+1}}),total:f??0,page:i,pageSize:s}}async function ue(e,t="",r,a=1,i=12){const s=Math.max(1,a||1),o=Math.min(48,Math.max(1,i||12));let n=l.from("user_step_challenge_steps").select(`
|
|
id,
|
|
step_id,
|
|
photo_url,
|
|
created_at,
|
|
user_step_challenges!inner (
|
|
challenge_id,
|
|
user_id,
|
|
users (name, phone, first_name, last_name)
|
|
)
|
|
`,{count:"exact"}).eq("user_step_challenges.challenge_id",e).not("photo_url","is",null).neq("photo_url","");if(r&&(n=n.eq("step_id",r)),t.trim()){const _=await $(l,t);if(!_.length)return{rows:[],total:0,page:s,pageSize:o};n=n.in("user_step_challenges.user_id",_.slice(0,O))}n=n.order("created_at",{ascending:!1}),n=y(n,s,o);const{data:h,error:m,count:f}=await n;if(m)throw m;return{rows:(h||[]).map(_=>{const d=String(_.photo_url||"").trim();if(!d)return null;const u=Array.isArray(_.user_step_challenges)?_.user_step_challenges[0]:_.user_step_challenges,g=Array.isArray(u==null?void 0:u.users)?u.users[0]:u==null?void 0:u.users,{user_name:p,user_phone:S}=k(g);return{id:_.id,step_id:_.step_id,photo_url:d,user_name:p,user_phone:S,created_at:_.created_at}}).filter(Boolean),total:f??0,page:s,pageSize:o}}async function pe(e,t="",r,a=1,i=10){const{page:s,pageSize:o}=C(a,i);let n=l.from("user_step_challenge_steps").select(`
|
|
id,
|
|
step_id,
|
|
voice_url,
|
|
created_at,
|
|
user_step_challenges!inner (
|
|
challenge_id,
|
|
users (name, phone, first_name, last_name)
|
|
)
|
|
`,{count:"exact"}).eq("user_step_challenges.challenge_id",e).not("voice_url","is",null).neq("voice_url","");r&&(n=n.eq("step_id",r));const h=await A(t);if(n=N(n,h),!n)return j(s,o);n=n.order("created_at",{ascending:!1}),n=y(n,s,o);const{data:m,error:f,count:c}=await n;if(f)throw f;const _=(s-1)*o;return{rows:(m||[]).map((u,g)=>{const{user_name:p,user_phone:S}=F(u);return{id:u.id,step_id:u.step_id,voice_url:String(u.voice_url||"").trim(),user_name:p,user_phone:S,created_at:u.created_at,index:_+g+1}}),total:c??0,page:s,pageSize:o}}async function V(e,t,r,a){let i=l.from("user_step_challenge_steps").select("id",{count:"exact",head:!0}).eq("user_step_challenges.challenge_id",e).eq("step_id",t).eq("mcq_answer",r);if(i=N(i,a),!i)return 0;const{error:s,count:o}=await i;if(s)throw s;return o??0}async function ge(e,t="",r,a=1,i=8){const{page:s,pageSize:o}=C(a,i,8);let n=l.from("step_challenge_steps").select("id, step_order, mcq_question, mcq_options, mcq_correct_index, enable_mcq").eq("challenge_id",e).eq("enable_mcq",!0).order("step_order",{ascending:!0});r&&(n=n.eq("id",r));const{data:h,error:m}=await n;if(m)throw m;const f=await A(t);return Promise.all((h||[]).map(async c=>{const _=H(c.mcq_options);let d=l.from("user_step_challenge_steps").select(`
|
|
id,
|
|
step_id,
|
|
mcq_answer,
|
|
created_at,
|
|
user_step_challenges!inner (
|
|
challenge_id,
|
|
users (name, phone, first_name, last_name)
|
|
)
|
|
`,{count:"exact"}).eq("user_step_challenges.challenge_id",e).eq("step_id",c.id).not("mcq_answer","is",null);if(d=N(d,f),!d)return{step_id:c.id,step_order:c.step_order,question:c.mcq_question||`سوال مرحله ${c.step_order}`,options:_,correct_index:c.mcq_correct_index,answers:[],option_stats:_.map((b,q)=>({optionIndex:q,label:b,count:0,percent:0})),total_answers:0,page:s,pageSize:o};d=d.order("created_at",{ascending:!1}),d=y(d,s,o);const[{data:u,error:g,count:p},S]=await Promise.all([d,Promise.all(_.map((b,q)=>V(e,c.id,q,f)))]);if(g)throw g;const w=p??0,U=(s-1)*o,D=(u||[]).map((b,q)=>{const{user_name:x,user_phone:z}=F(b),v=Number(b.mcq_answer);return{id:b.id,user_name:x,user_phone:z,mcq_answer:v,answer_label:_[v]||`گزینه ${v+1}`,created_at:b.created_at,index:U+q+1}}),T=_.map((b,q)=>{const x=S[q]||0,z=w>0?Math.round(x/w*1e3)/10:0;return{optionIndex:q,label:b,count:x,percent:z}});return{step_id:c.id,step_order:c.step_order,question:c.mcq_question||`سوال مرحله ${c.step_order}`,options:_,correct_index:c.mcq_correct_index,answers:D,option_stats:T,total_answers:w,page:s,pageSize:o}}))}async function he(){const{data:e,error:t}=await l.from("step_challenge_config").select("*").eq("id",1).maybeSingle();if(t)throw t;return e||{id:1,rules_aparat_embed_code:null,show_completion_feedback:!0}}async function me(e){const{data:t,error:r}=await l.from("step_challenge_config").upsert({id:1,rules_aparat_embed_code:e.rules_aparat_embed_code||null,show_completion_feedback:e.show_completion_feedback!==!1,updated_at:new Date().toISOString()}).select().single();if(r)throw r;return t}async function fe(e){const t=Math.max(1,(e==null?void 0:e.page)||1),r=Math.max(1,(e==null?void 0:e.pageSize)||20),a=(t-1)*r,i=a+r-1,s=((e==null?void 0:e.search)||"").trim();let o=l.from("step_challenge_suggestions").select("id, user_id, title, created_at, users(name, phone, first_name, last_name), step_challenge_suggestion_steps(id, suggestion_id, step_order, description, created_at)",{count:"exact"}).order("created_at",{ascending:!1}).range(a,i);if(s){const c=await $(l,s);o=o.or(buildIlikeOrFilter(["title"],s,c))}const{data:n,error:h,count:m}=await o;if(h)throw h;return{rows:(n||[]).map(c=>{const _=Array.isArray(c.users)?c.users[0]:c.users,{user_name:d,user_phone:u}=k(_),g=(Array.isArray(c.step_challenge_suggestion_steps)?c.step_challenge_suggestion_steps:[]).map(p=>({id:Number(p.id),suggestion_id:Number(p.suggestion_id),step_order:Number(p.step_order),description:String(p.description||""),created_at:p.created_at})).sort((p,S)=>p.step_order-S.step_order);return{id:Number(c.id),user_id:c.user_id,title:String(c.title||""),created_at:c.created_at,user_name:d,user_phone:u,steps:g}}),total:m||0}}export{ie as a,re as b,se as c,oe as d,he as e,fe as f,te as g,Z as h,Y as i,ne as j,ee as k,L as l,ce as m,le as n,_e as o,ue as p,pe as q,ge as r,me as s,de as t,ae as u};
|