2 lines
13 KiB
JavaScript
2 lines
13 KiB
JavaScript
import{a as A}from"./chunk-3GOV5KJM.js";import{a as U}from"./chunk-52JZ5I3Y.js";import{n as y,w as f}from"./chunk-COFYR5MX.js";import{D as n,Ec as r,W as o,_ as b,a as g,b as c,da as S,f as v,o as d,r as h,ta as a}from"./chunk-2MUIW2M6.js";var D=class m{http=S(y);router=S(f);toastService=S(U);apiUrl=`${A.apiUrl}/admin`;cache=new Map;STATS_CACHE_TTL=300*1e3;ANALYTICS_CACHE_TTL=600*1e3;adminStatsState=a(null);isLoadingStats=a(!1);statsError=a(null);guestAnalyticsState=a(null);isLoadingAnalytics=a(!1);analyticsError=a(null);guestSettingsState=a(null);isLoadingSettings=a(!1);settingsError=a(null);adminUsersState=a([]);isLoadingUsers=a(!1);usersError=a(null);usersPagination=a(null);currentUserFilters=a({});selectedUserDetail=a(null);isLoadingUserDetail=a(!1);userDetailError=a(null);dateRangeFilter=a({startDate:null,endDate:null});hasStats=r(()=>this.adminStatsState()!==null);totalUsers=r(()=>this.adminStatsState()?.users.total??0);activeUsers=r(()=>this.adminStatsState()?.users.active??0);totalQuizSessions=r(()=>this.adminStatsState()?.quizzes.totalSessions??0);totalQuestions=r(()=>this.adminStatsState()?.content.totalQuestions??0);averageScore=r(()=>this.adminStatsState()?.quizzes.averageScore??0);hasAnalytics=r(()=>this.guestAnalyticsState()!==null);totalGuestSessions=r(()=>this.guestAnalyticsState()?.overview.totalGuestSessions??0);activeGuestSessions=r(()=>this.guestAnalyticsState()?.overview.activeGuestSessions??0);conversionRate=r(()=>this.guestAnalyticsState()?.overview.conversionRate??0);avgQuizzesPerGuest=r(()=>this.guestAnalyticsState()?.quizActivity.avgQuizzesPerGuest??0);hasSettings=r(()=>this.guestSettingsState()!==null);isGuestAccessEnabled=r(()=>this.guestSettingsState()?.guestAccessEnabled??!1);maxQuizzesPerDay=r(()=>this.guestSettingsState()?.maxQuizzesPerDay??0);maxQuestionsPerQuiz=r(()=>this.guestSettingsState()?.maxQuestionsPerQuiz??0);hasUsers=r(()=>this.adminUsersState().length>0);totalUsersCount=r(()=>this.usersPagination()?.totalItems??0);currentPage=r(()=>this.usersPagination()?.currentPage??1);totalPages=r(()=>this.usersPagination()?.totalPages??1);hasUserDetail=r(()=>this.selectedUserDetail()!==null);userFullName=r(()=>{let t=this.selectedUserDetail();return t?t.username:""});userTotalQuizzes=r(()=>this.selectedUserDetail()?.statistics.totalQuizzes??0);userAverageScore=r(()=>this.selectedUserDetail()?.statistics.averageScore??0);userAccuracy=r(()=>this.selectedUserDetail()?.statistics.accuracy??0);getStatistics(t=!1){let s="admin-statistics";if(!t){let e=this.getFromCache(s);if(e)return this.adminStatsState.set(e),new v(i=>{i.next(e),i.complete()})}return this.isLoadingStats.set(!0),this.statsError.set(null),this.http.get(`${this.apiUrl}/statistics`).pipe(h(e=>e.data),o(e=>{this.adminStatsState.set(e),this.setCache(s,e),this.isLoadingStats.set(!1)}),n(e=>(this.isLoadingStats.set(!1),this.handleError(e,"Failed to load statistics"))))}getStatisticsWithDateRange(t,s){this.isLoadingStats.set(!0),this.statsError.set(null);let e={startDate:t.toISOString(),endDate:s.toISOString()};return this.http.get(`${this.apiUrl}/statistics`,{params:e}).pipe(h(i=>i.data),o(i=>{this.adminStatsState.set(i),this.isLoadingStats.set(!1),this.dateRangeFilter.set({startDate:t,endDate:s})}),n(i=>(this.isLoadingStats.set(!1),this.handleError(i,"Failed to load filtered statistics"))))}clearDateFilter(){this.dateRangeFilter.set({startDate:null,endDate:null}),this.getStatistics(!0).subscribe()}refreshStatistics(){return this.invalidateCache("admin-statistics"),this.getStatistics(!0)}getGuestAnalytics(t=!1){let s="guest-analytics";if(!t){let e=this.getFromCache(s);if(e)return this.guestAnalyticsState.set(e),new v(i=>{i.next(e),i.complete()})}return this.isLoadingAnalytics.set(!0),this.analyticsError.set(null),this.http.get(`${this.apiUrl}/guest-analytics`).pipe(h(e=>e.data),o(e=>{this.guestAnalyticsState.set(e),this.setCache(s,e,this.ANALYTICS_CACHE_TTL),this.isLoadingAnalytics.set(!1)}),n(e=>(this.isLoadingAnalytics.set(!1),this.handleError(e,"Failed to load guest analytics"))))}refreshGuestAnalytics(){return this.invalidateCache("guest-analytics"),this.getGuestAnalytics(!0)}getFromCache(t){let s=this.cache.get(t);return s?Date.now()>s.expiresAt?(this.cache.delete(t),null):s.data:null}setCache(t,s,e=this.STATS_CACHE_TTL){let i=Date.now(),l={data:s,timestamp:i,expiresAt:i+e};this.cache.set(t,l)}invalidateCache(t){this.cache.delete(t)}clearCache(){this.cache.clear()}handleError(t,s){let e=s;return t.status===401?(e="Unauthorized. Please login again.",this.toastService.error(e),this.router.navigate(["/login"])):t.status===403?(e="Access denied. Admin privileges required.",this.toastService.error(e),this.router.navigate(["/dashboard"])):t.status===404?(e="Resource not found.",this.toastService.error(e)):t.status===500?(e="Server error. Please try again later.",this.toastService.error(e)):t.error?.message?(e=t.error.message,this.toastService.error(e)):this.toastService.error(e),this.statsError.set(e),d(()=>new Error(e))}getGuestSettings(t=!1){let s="guest-settings";if(!t){let e=this.getFromCache(s);if(e)return this.guestSettingsState.set(e),new v(i=>{i.next(e),i.complete()})}return this.isLoadingSettings.set(!0),this.settingsError.set(null),this.http.get(`${this.apiUrl}/guest-settings`).pipe(h(e=>e.data),o(e=>{this.guestSettingsState.set(e),this.setCache(s,e,this.ANALYTICS_CACHE_TTL),this.isLoadingSettings.set(!1)}),n(e=>(this.isLoadingSettings.set(!1),this.handleSettingsError(e,"Failed to load guest settings"))))}refreshGuestSettings(){return this.invalidateCache("guest-settings"),this.getGuestSettings(!0)}updateGuestSettings(t){return this.isLoadingSettings.set(!0),this.settingsError.set(null),this.http.put(`${this.apiUrl}/guest-settings`,t).pipe(h(s=>s.data),o(s=>{this.guestSettingsState.set(s),this.invalidateCache("guest-settings"),this.isLoadingSettings.set(!1),this.toastService.success("Guest settings updated successfully")}),n(s=>(this.isLoadingSettings.set(!1),this.handleSettingsError(s,"Failed to update guest settings"))))}handleSettingsError(t,s){let e=s;return t.status===401?(e="Unauthorized. Please login again.",this.toastService.error(e),this.router.navigate(["/login"])):t.status===403?(e="Access denied. Admin privileges required.",this.toastService.error(e),this.router.navigate(["/dashboard"])):t.status===404?(e="Settings not found.",this.toastService.error(e)):t.error?.message?(e=t.error.message,this.toastService.error(e)):this.toastService.error(e),this.settingsError.set(e),d(()=>new Error(e))}getUsers(t={}){this.isLoadingUsers.set(!0),this.usersError.set(null);let s={page:t.page??1,limit:t.limit??10};return t.role&&t.role!=="all"&&(s.role=t.role),t.isActive&&t.isActive!=="all"&&(s.isActive=t.isActive==="active"),t.sortBy&&(s.sortBy=t.sortBy,s.sortOrder=t.sortOrder??"asc"),t.search&&(s.search=t.search),this.http.get(`${this.apiUrl}/users`,{params:s}).pipe(o(e=>{this.adminUsersState.set(e.data.users),this.usersPagination.set(e.data.pagination),this.currentUserFilters.set(t),this.isLoadingUsers.set(!1)}),n(e=>(this.isLoadingUsers.set(!1),this.handleUsersError(e,"Failed to load users"))))}refreshUsers(){let t=this.currentUserFilters();return this.getUsers(t)}getUserDetails(t){return this.isLoadingUserDetail.set(!0),this.userDetailError.set(null),this.http.get(`${this.apiUrl}/users/${t}`).pipe(h(s=>s.data),o(s=>{this.selectedUserDetail.set(s),this.isLoadingUserDetail.set(!1)}),n(s=>(this.isLoadingUserDetail.set(!1),this.handleUserDetailError(s,"Failed to load user details"))))}clearUserDetail(){this.selectedUserDetail.set(null),this.userDetailError.set(null)}updateUserRole(t,s){return this.http.put(`${this.apiUrl}/users/${t}/role`,{role:s}).pipe(o(e=>{let l=this.adminUsersState().map(p=>p.id===t?c(g({},p),{role:s}):p);this.adminUsersState.set(l);let u=this.selectedUserDetail();u&&u.id===t&&this.selectedUserDetail.set(c(g({},u),{role:s})),this.toastService.success(e.message||"User role updated successfully")}),n(e=>{let i="Failed to update user role";return e.status===401?(i="Unauthorized. Please login again.",this.toastService.error(i),this.router.navigate(["/login"])):e.status===403?(i="Access denied. Admin privileges required.",this.toastService.error(i)):e.status===404?(i="User not found.",this.toastService.error(i)):e.status===400&&e.error?.message?(i=e.error.message,this.toastService.error(i)):e.error?.message?(i=e.error.message,this.toastService.error(i)):this.toastService.error(i),d(()=>new Error(i))}))}activateUser(t){return this.http.put(`${this.apiUrl}/users/${t}/activate`,{}).pipe(o(s=>{let i=this.adminUsersState().map(u=>u.id===t?c(g({},u),{isActive:!0}):u);this.adminUsersState.set(i);let l=this.selectedUserDetail();l&&l.id===t&&this.selectedUserDetail.set(c(g({},l),{isActive:!0})),this.toastService.success(s.message||"User activated successfully")}),n(s=>{let e="Failed to activate user";return s.status===401?(e="Unauthorized. Please login again.",this.toastService.error(e),this.router.navigate(["/login"])):s.status===403?(e="Access denied. Admin privileges required.",this.toastService.error(e)):s.status===404?(e="User not found.",this.toastService.error(e)):s.error?.message?(e=s.error.message,this.toastService.error(e)):this.toastService.error(e),d(()=>new Error(e))}))}deactivateUser(t){return this.http.delete(`${this.apiUrl}/users/${t}`).pipe(o(s=>{let i=this.adminUsersState().map(u=>u.id===t?c(g({},u),{isActive:!1}):u);this.adminUsersState.set(i);let l=this.selectedUserDetail();l&&l.id===t&&this.selectedUserDetail.set(c(g({},l),{isActive:!1})),this.toastService.success(s.message||"User deactivated successfully")}),n(s=>{let e="Failed to deactivate user";return s.status===401?(e="Unauthorized. Please login again.",this.toastService.error(e),this.router.navigate(["/login"])):s.status===403?(e="Access denied. Admin privileges required.",this.toastService.error(e)):s.status===404?(e="User not found.",this.toastService.error(e)):s.error?.message?(e=s.error.message,this.toastService.error(e)):this.toastService.error(e),d(()=>new Error(e))}))}handleUserDetailError(t,s){let e=s;return t.status===401?(e="Unauthorized. Please login again.",this.toastService.error(e),this.router.navigate(["/login"])):t.status===403?(e="Access denied. Admin privileges required.",this.toastService.error(e),this.router.navigate(["/dashboard"])):t.status===404?(e="User not found.",this.toastService.error(e)):t.error?.message?(e=t.error.message,this.toastService.error(e)):this.toastService.error(e),this.userDetailError.set(e),d(()=>new Error(e))}handleUsersError(t,s){let e=s;return t.status===401?(e="Unauthorized. Please login again.",this.toastService.error(e),this.router.navigate(["/login"])):t.status===403?(e="Access denied. Admin privileges required.",this.toastService.error(e),this.router.navigate(["/dashboard"])):t.status===404?(e="Users not found.",this.toastService.error(e)):t.error?.message?(e=t.error.message,this.toastService.error(e)):this.toastService.error(e),this.usersError.set(e),d(()=>new Error(e))}getQuestion(t){return this.http.get(`${this.apiUrl}/questions/${t}`).pipe(n(s=>this.handleQuestionError(s,"Failed to load question")))}createQuestion(t){return this.http.post(`${this.apiUrl}/questions`,t).pipe(o(s=>{this.toastService.success("Question created successfully")}),n(s=>this.handleQuestionError(s,"Failed to create question")))}updateQuestion(t,s){return this.http.put(`${this.apiUrl}/questions/${t}`,s).pipe(o(e=>{this.toastService.success("Question updated successfully")}),n(e=>this.handleQuestionError(e,"Failed to update question")))}getAllQuestions(t){let s={};return t.page&&(s.page=t.page),t.limit&&(s.limit=t.limit),t.search&&(s.search=t.search),t.category&&t.category!=="all"&&(s.category=t.category),t.difficulty&&t.difficulty!=="all"&&(s.difficulty=t.difficulty),t.sortBy&&(s.sortBy=t.sortBy),t.order&&(s.order=t.order.toUpperCase()),this.http.get(`${this.apiUrl}/questions`,{params:s}).pipe(n(e=>this.handleQuestionError(e,"Failed to load questions")))}deleteQuestion(t){return this.http.delete(`${this.apiUrl}/questions/${t}`).pipe(o(s=>{this.toastService.success("Question deleted successfully")}),n(s=>this.handleQuestionError(s,"Failed to delete question")))}handleQuestionError(t,s){let e=s;return t.status===401?(e="Unauthorized. Please login again.",this.toastService.error(e),this.router.navigate(["/login"])):t.status===403?(e="Access denied. Admin privileges required.",this.toastService.error(e),this.router.navigate(["/dashboard"])):t.status===400?(e=t.error?.message||"Invalid question data. Please check all fields.",this.toastService.error(e)):t.error?.message?(e=t.error.message,this.toastService.error(e)):this.toastService.error(e),d(()=>new Error(e))}resetState(){this.adminStatsState.set(null),this.isLoadingStats.set(!1),this.statsError.set(null),this.guestAnalyticsState.set(null),this.isLoadingAnalytics.set(!1),this.analyticsError.set(null),this.guestSettingsState.set(null),this.isLoadingSettings.set(!1),this.settingsError.set(null),this.adminUsersState.set([]),this.isLoadingUsers.set(!1),this.usersError.set(null),this.usersPagination.set(null),this.currentUserFilters.set({}),this.selectedUserDetail.set(null),this.isLoadingUserDetail.set(!1),this.userDetailError.set(null),this.dateRangeFilter.set({startDate:null,endDate:null}),this.clearCache()}static \u0275fac=function(s){return new(s||m)};static \u0275prov=b({token:m,factory:m.\u0275fac,providedIn:"root"})};export{D as a};
|