@minecraft-docker/mcctl-console 1.15.2 → 1.15.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/BUILD_ID +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/app-build-manifest.json +70 -70
- package/.next/standalone/platform/services/mcctl-console/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/build-manifest.json +2 -2
- package/.next/standalone/platform/services/mcctl-console/.next/prerender-manifest.json +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/(main)/audit-logs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/(main)/backups/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/(main)/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/(main)/players/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/(main)/routing/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/(main)/servers/[name]/console/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/(main)/servers/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/(main)/servers/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/(main)/worlds/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/audit-logs/[id]/route.js +11 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/audit-logs/export/route.js +11 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/audit-logs/route.js +11 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/audit-logs/stats/route.js +11 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/audit-logs/stream/route.js +11 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/auth/[...all]/route.js +11 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/backup/history/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/backup/restore/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/backup/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/players/ban/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/players/kick/route.js +11 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/players/op/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/players/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/players/whitelist/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/router/status/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/servers/[name]/[action]/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/servers/[name]/config/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/servers/[name]/exec/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/servers/[name]/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/servers/[name]/world/reset/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/servers/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/user-servers/[id]/route.js +11 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/user-servers/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/users/route.js +11 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/worlds/[name]/[action]/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/worlds/[name]/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/worlds/route.js +10 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/audit-logs.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/audit-logs.rsc +2 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/backups.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/backups.rsc +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/dashboard.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/dashboard.rsc +2 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/index.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/index.rsc +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/login.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/login.rsc +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/players.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/players.rsc +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/routing.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/routing.rsc +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/servers.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/servers.rsc +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/signup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/signup.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/signup.rsc +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/worlds.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app/worlds.rsc +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/app-paths-manifest.json +18 -18
- package/.next/standalone/platform/services/mcctl-console/.next/server/chunks/613.js +11 -2
- package/.next/standalone/platform/services/mcctl-console/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/platform/services/mcctl-console/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/next-font-manifest.json +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/pages/404.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/pages/500.html +1 -1
- package/.next/standalone/platform/services/mcctl-console/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/platform/services/mcctl-console/package.json +1 -1
- package/package.json +2 -2
- /package/.next/standalone/platform/services/mcctl-console/.next/static/{ddlfT0dafY0G-jGkapBmi → M6lBMs4O93dmAs487Ndg4}/_buildManifest.js +0 -0
- /package/.next/standalone/platform/services/mcctl-console/.next/static/{ddlfT0dafY0G-jGkapBmi → M6lBMs4O93dmAs487Ndg4}/_ssgManifest.js +0 -0
- /package/.next/standalone/platform/services/mcctl-console/.next/static/chunks/{2537-6c9d2dfd403b7448.js → 2537-ad3cb492fdff51d8.js} +0 -0
- /package/.next/standalone/platform/services/mcctl-console/.next/static/chunks/app/(main)/audit-logs/{page-7a5d1441bb2811cf.js → page-6379e4fb97ec58d0.js} +0 -0
- /package/.next/static/{ddlfT0dafY0G-jGkapBmi → M6lBMs4O93dmAs487Ndg4}/_buildManifest.js +0 -0
- /package/.next/static/{ddlfT0dafY0G-jGkapBmi → M6lBMs4O93dmAs487Ndg4}/_ssgManifest.js +0 -0
- /package/.next/static/chunks/{2537-6c9d2dfd403b7448.js → 2537-ad3cb492fdff51d8.js} +0 -0
- /package/.next/static/chunks/app/(main)/audit-logs/{page-7a5d1441bb2811cf.js → page-6379e4fb97ec58d0.js} +0 -0
package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/players/route.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{var e={};e.id=1838,e.ids=[1838],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},47975:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>
|
|
1
|
+
"use strict";(()=>{var e={};e.id=1838,e.ids=[1838],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},47975:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>h,patchFetch:()=>L,requestAsyncStorage:()=>T,routeModule:()=>m,serverHooks:()=>f,staticGenerationAsyncStorage:()=>E});var s={};r.r(s),r.d(s,{GET:()=>p,dynamic:()=>l});var a=r(3025),n=r(45086),o=r(74048),i=r(24517),d=r(78649),u=r(60154),c=r(77605);let l="force-dynamic";async function p(e){try{let e=await (0,u.mk)(await (0,c.headers)()),t=(0,d.F0)({username:e.user.name||e.user.email,role:e.user.role||"user"}),r=await t.getServers(),s=await Promise.all(r.servers.filter(e=>"running"===e.status&&"healthy"===e.health).map(async e=>{try{let r=await t.getServer(e.name);return{name:e.name,players:r.server.players?.list.map(e=>({name:e,uuid:""}))||[]}}catch{return{name:e.name,players:[]}}}));return i.NextResponse.json({servers:s})}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Unauthorized",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to fetch players:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to fetch players"},{status:500})}}let m=new a.AppRouteRouteModule({definition:{kind:n.x.APP_ROUTE,page:"/api/players/route",pathname:"/api/players",filename:"route",bundlePath:"app/api/players/route"},resolvedPagePath:"/home/runner/work/minecraft-server-manager/minecraft-server-manager/platform/services/mcctl-console/src/app/api/players/route.ts",nextConfigOutput:"standalone",userland:s}),{requestAsyncStorage:T,staticGenerationAsyncStorage:E,serverHooks:f}=m,h="/api/players/route";function L(){return(0,o.patchFetch)({serverHooks:f,staticGenerationAsyncStorage:E})}},78649:(e,t,r)=>{r.d(t,{F0:()=>n,zB:()=>s});class s extends Error{constructor(e,t,r){super(r),this.statusCode=e,this.error=t,this.name="McctlApiError"}}class a{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.userContext=e.userContext}async fetch(e,t={}){let r=`${this.baseUrl}${e}`,a={"X-API-Key":this.apiKey};t.body&&(a["Content-Type"]="application/json"),this.userContext&&(a["X-User"]=this.userContext.username,a["X-Role"]=this.userContext.role);let n=await fetch(r,{...t,headers:{...a,...t.headers}});if(!n.ok){let e=await n.json().catch(()=>({error:"UnknownError",message:n.statusText}));throw new s(n.status,e.error,e.message)}return n.json()}async getServers(){return this.fetch("/api/servers")}async getServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}`)}async createServer(e){return this.fetch("/api/servers",{method:"POST",body:JSON.stringify(e)})}async deleteServer(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async startServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/start`,{method:"POST"})}async stopServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/stop`,{method:"POST"})}async restartServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/restart`,{method:"POST"})}async execCommand(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/exec`,{method:"POST",body:JSON.stringify({command:t})})}async getLogs(e,t=100){return this.fetch(`/api/servers/${encodeURIComponent(e)}/logs?lines=${t}`)}async getWorlds(){return this.fetch("/api/worlds")}async getWorld(e){return this.fetch(`/api/worlds/${encodeURIComponent(e)}`)}async createWorld(e){return this.fetch("/api/worlds",{method:"POST",body:JSON.stringify(e)})}async assignWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/assign`,{method:"POST",body:JSON.stringify({serverName:t})})}async releaseWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/release${t?"?force=true":""}`,{method:"POST"})}async deleteWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async getServerConfig(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`)}async updateServerConfig(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`,{method:"PATCH",body:JSON.stringify(t)})}async resetWorld(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/world/reset`,{method:"POST"})}async getRouterStatus(){return this.fetch("/api/router/status")}async getBackupStatus(){return this.fetch("/api/backup/status")}async pushBackup(e){let t=e?JSON.stringify({message:e}):void 0;return this.fetch("/api/backup/push",{method:"POST",body:t})}async getBackupHistory(e=20){return this.fetch(`/api/backup/history?limit=${e}`)}async restoreBackup(e){return this.fetch("/api/backup/restore",{method:"POST",body:JSON.stringify({commitHash:e})})}}function n(e){let t=process.env.MCCTL_API_URL||"http://localhost:5001",r=process.env.MCCTL_API_KEY||"";return r||console.warn("MCCTL_API_KEY is not set. API requests may fail."),new a({baseUrl:t,apiKey:r,userContext:e})}},60154:(e,t,r)=>{r.d(t,{Ke:()=>c,kF:()=>u,l4:()=>i,mk:()=>d});var s=r(31969),a=r(22587),n=r(8290),o=r(30579);class i extends Error{constructor(e,t=401){super(e),this.statusCode=t,this.name="AuthError"}}async function d(e){let t=await s.I.api.getSession({headers:e});if(!t)throw new i("Unauthorized",401);return t}async function u(e){let t=await d(e);if("admin"!==t.user.role)throw new i("Forbidden: Admin access required",403);return t}async function c(e,t,r="view"){let s=await d(e);if("admin"===s.user.role)return s;let u=await a.db.select().from(n.userServers).where((0,o.xD)((0,o.eq)(n.userServers.userId,s.user.id),(0,o.eq)(n.userServers.serverId,t))).limit(1);if(0===u.length)throw new i("Forbidden: No access to this server",403);let c=u[0].permission,l={view:1,manage:2,admin:3};if(l[c]<l[r])throw new i(`Forbidden: Requires ${r} permission`,403);return s}},31969:(e,t,r)=>{r.d(t,{I:()=>d});var s=r(33580),a=r(5944),n=r(90224),o=r(22587),i=r(8290);let d=(0,s.kj)({database:(0,a.s)(o.db,{provider:"sqlite",schema:{user:i.users,session:i.sessions,account:i.accounts,verification:i.verifications}}),emailAndPassword:{enabled:!0,requireEmailVerification:!1},session:{expiresIn:604800,updateAge:86400,cookieCache:{enabled:!0,maxAge:300}},user:{additionalFields:{role:{type:"string",required:!1,defaultValue:"user",input:!1}}},plugins:[(0,n.SA)({defaultRole:"user",adminRole:"admin"})],trustedOrigins:["http://localhost:5000","http://localhost:3000",...process.env.BETTER_AUTH_BASE_URL?[process.env.BETTER_AUTH_BASE_URL]:[],...process.env.NEXT_PUBLIC_APP_URL?[process.env.NEXT_PUBLIC_APP_URL]:[]]})},22587:(e,t,r)=>{r.d(t,{db:()=>p});var s=r(85890),a=r.n(s),n=r(31590),o=r(8290),i=r(55315),d=r.n(i),u=r(92048);let c=function(){if(process.env.DATABASE_URL)return process.env.DATABASE_URL;let e=process.env.MCCTL_ROOT||process.cwd(),t=d().join(e,"data");return d().join(t,"mcctl.db")}();!function(e){if(":memory:"===e)return;let t=d().dirname(e);(0,u.existsSync)(t)||(0,u.mkdirSync)(t,{recursive:!0})}(c);let l=new(a())(c);l.pragma("journal_mode = WAL"),l.pragma("foreign_keys = ON"),l.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS users (
|
|
3
3
|
id TEXT PRIMARY KEY,
|
|
4
4
|
name TEXT NOT NULL,
|
|
@@ -45,4 +45,13 @@ CREATE TABLE IF NOT EXISTS verifications (
|
|
|
45
45
|
created_at INTEGER,
|
|
46
46
|
updated_at INTEGER
|
|
47
47
|
);
|
|
48
|
+
CREATE TABLE IF NOT EXISTS user_servers (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
51
|
+
server_id TEXT NOT NULL,
|
|
52
|
+
permission TEXT NOT NULL DEFAULT 'view',
|
|
53
|
+
created_at INTEGER NOT NULL,
|
|
54
|
+
updated_at INTEGER NOT NULL
|
|
55
|
+
);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS user_server_idx ON user_servers(user_id, server_id);
|
|
48
57
|
`);let p=(0,n.t)(l,{schema:o})},8290:(e,t,r)=>{r.r(t),r.d(t,{accounts:()=>u,sessions:()=>d,userServers:()=>l,users:()=>i,verifications:()=>c});var s=r(80722),a=r(10160),n=r(30304),o=r(76303);let i=(0,s.Px)("users",{id:(0,a.fL)("id").primaryKey(),name:(0,a.fL)("name").notNull(),email:(0,a.fL)("email").notNull().unique(),emailVerified:(0,n._L)("email_verified",{mode:"boolean"}).notNull().default(!1),image:(0,a.fL)("image"),role:(0,a.fL)("role").notNull().default("user"),banned:(0,n._L)("banned",{mode:"boolean"}).default(!1),banReason:(0,a.fL)("ban_reason"),banExpires:(0,n._L)("ban_expires",{mode:"timestamp"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),d=(0,s.Px)("sessions",{id:(0,a.fL)("id").primaryKey(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),token:(0,a.fL)("token").notNull().unique(),ipAddress:(0,a.fL)("ip_address"),userAgent:(0,a.fL)("user_agent"),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),u=(0,s.Px)("accounts",{id:(0,a.fL)("id").primaryKey(),accountId:(0,a.fL)("account_id").notNull(),providerId:(0,a.fL)("provider_id").notNull(),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),accessToken:(0,a.fL)("access_token"),refreshToken:(0,a.fL)("refresh_token"),idToken:(0,a.fL)("id_token"),accessTokenExpiresAt:(0,n._L)("access_token_expires_at",{mode:"timestamp"}),refreshTokenExpiresAt:(0,n._L)("refresh_token_expires_at",{mode:"timestamp"}),scope:(0,a.fL)("scope"),password:(0,a.fL)("password"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),c=(0,s.Px)("verifications",{id:(0,a.fL)("id").primaryKey(),identifier:(0,a.fL)("identifier").notNull(),value:(0,a.fL)("value").notNull(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)}),l=(0,s.Px)("user_servers",{id:(0,a.fL)("id").primaryKey().$defaultFn(()=>crypto.randomUUID()),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),serverId:(0,a.fL)("server_id").notNull(),permission:(0,a.fL)("permission").$type().notNull().default("view"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},e=>({userServerIdx:(0,o.Kz)("user_server_idx").on(e.userId,e.serverId)}))}};var t=require("../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),s=t.X(0,[9836,1489,7605,5309],()=>r(47975));module.exports=s})();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{var e={};e.id=2490,e.ids=[2490],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},39004:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>_,patchFetch:()=>v,requestAsyncStorage:()=>
|
|
1
|
+
"use strict";(()=>{var e={};e.id=2490,e.ids=[2490],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},39004:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>_,patchFetch:()=>v,requestAsyncStorage:()=>h,routeModule:()=>f,serverHooks:()=>L,staticGenerationAsyncStorage:()=>N});var s={};r.r(s),r.d(s,{DELETE:()=>E,GET:()=>m,POST:()=>T,dynamic:()=>l});var a=r(3025),n=r(45086),o=r(74048),i=r(24517),d=r(78649),u=r(60154),c=r(77605);let l="force-dynamic";function p(e){return{username:e.user.name||e.user.email,role:e.user.role||"user"}}async function m(e){try{let{searchParams:t}=new URL(e.url),r=t.get("server");if(!r)return i.NextResponse.json({error:"BadRequest",message:"Server name is required"},{status:400});let s=await (0,u.Ke)(await (0,c.headers)(),r,"view"),a=(0,d.F0)(p(s)),n=await a.execCommand(r,"whitelist list"),o=[],l=n.output.match(/:\s*(.+)$/);return l&&l[1].split(",").map(e=>e.trim()).filter(Boolean).forEach(e=>{o.push({name:e,uuid:""})}),i.NextResponse.json({players:o})}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Forbidden",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to fetch whitelist:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to fetch whitelist"},{status:500})}}async function T(e){try{let{player:t,server:r}=await e.json();if(!t||!r)return i.NextResponse.json({error:"BadRequest",message:"Player and server are required"},{status:400});let s=await (0,u.Ke)(await (0,c.headers)(),r,"manage"),a=(0,d.F0)(p(s)),n=await a.execCommand(r,`whitelist add ${t}`);return i.NextResponse.json({success:!0,message:n.output})}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Forbidden",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to add to whitelist:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to add to whitelist"},{status:500})}}async function E(e){try{let{searchParams:t}=new URL(e.url),r=t.get("player"),s=t.get("server");if(!r||!s)return i.NextResponse.json({error:"BadRequest",message:"Player and server are required"},{status:400});let a=await (0,u.Ke)(await (0,c.headers)(),s,"manage"),n=(0,d.F0)(p(a)),o=await n.execCommand(s,`whitelist remove ${r}`);return i.NextResponse.json({success:!0,message:o.output})}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Forbidden",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to remove from whitelist:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to remove from whitelist"},{status:500})}}let f=new a.AppRouteRouteModule({definition:{kind:n.x.APP_ROUTE,page:"/api/players/whitelist/route",pathname:"/api/players/whitelist",filename:"route",bundlePath:"app/api/players/whitelist/route"},resolvedPagePath:"/home/runner/work/minecraft-server-manager/minecraft-server-manager/platform/services/mcctl-console/src/app/api/players/whitelist/route.ts",nextConfigOutput:"standalone",userland:s}),{requestAsyncStorage:h,staticGenerationAsyncStorage:N,serverHooks:L}=f,_="/api/players/whitelist/route";function v(){return(0,o.patchFetch)({serverHooks:L,staticGenerationAsyncStorage:N})}},78649:(e,t,r)=>{r.d(t,{F0:()=>n,zB:()=>s});class s extends Error{constructor(e,t,r){super(r),this.statusCode=e,this.error=t,this.name="McctlApiError"}}class a{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.userContext=e.userContext}async fetch(e,t={}){let r=`${this.baseUrl}${e}`,a={"X-API-Key":this.apiKey};t.body&&(a["Content-Type"]="application/json"),this.userContext&&(a["X-User"]=this.userContext.username,a["X-Role"]=this.userContext.role);let n=await fetch(r,{...t,headers:{...a,...t.headers}});if(!n.ok){let e=await n.json().catch(()=>({error:"UnknownError",message:n.statusText}));throw new s(n.status,e.error,e.message)}return n.json()}async getServers(){return this.fetch("/api/servers")}async getServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}`)}async createServer(e){return this.fetch("/api/servers",{method:"POST",body:JSON.stringify(e)})}async deleteServer(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async startServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/start`,{method:"POST"})}async stopServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/stop`,{method:"POST"})}async restartServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/restart`,{method:"POST"})}async execCommand(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/exec`,{method:"POST",body:JSON.stringify({command:t})})}async getLogs(e,t=100){return this.fetch(`/api/servers/${encodeURIComponent(e)}/logs?lines=${t}`)}async getWorlds(){return this.fetch("/api/worlds")}async getWorld(e){return this.fetch(`/api/worlds/${encodeURIComponent(e)}`)}async createWorld(e){return this.fetch("/api/worlds",{method:"POST",body:JSON.stringify(e)})}async assignWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/assign`,{method:"POST",body:JSON.stringify({serverName:t})})}async releaseWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/release${t?"?force=true":""}`,{method:"POST"})}async deleteWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async getServerConfig(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`)}async updateServerConfig(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`,{method:"PATCH",body:JSON.stringify(t)})}async resetWorld(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/world/reset`,{method:"POST"})}async getRouterStatus(){return this.fetch("/api/router/status")}async getBackupStatus(){return this.fetch("/api/backup/status")}async pushBackup(e){let t=e?JSON.stringify({message:e}):void 0;return this.fetch("/api/backup/push",{method:"POST",body:t})}async getBackupHistory(e=20){return this.fetch(`/api/backup/history?limit=${e}`)}async restoreBackup(e){return this.fetch("/api/backup/restore",{method:"POST",body:JSON.stringify({commitHash:e})})}}function n(e){let t=process.env.MCCTL_API_URL||"http://localhost:5001",r=process.env.MCCTL_API_KEY||"";return r||console.warn("MCCTL_API_KEY is not set. API requests may fail."),new a({baseUrl:t,apiKey:r,userContext:e})}},60154:(e,t,r)=>{r.d(t,{Ke:()=>c,kF:()=>u,l4:()=>i,mk:()=>d});var s=r(31969),a=r(22587),n=r(8290),o=r(30579);class i extends Error{constructor(e,t=401){super(e),this.statusCode=t,this.name="AuthError"}}async function d(e){let t=await s.I.api.getSession({headers:e});if(!t)throw new i("Unauthorized",401);return t}async function u(e){let t=await d(e);if("admin"!==t.user.role)throw new i("Forbidden: Admin access required",403);return t}async function c(e,t,r="view"){let s=await d(e);if("admin"===s.user.role)return s;let u=await a.db.select().from(n.userServers).where((0,o.xD)((0,o.eq)(n.userServers.userId,s.user.id),(0,o.eq)(n.userServers.serverId,t))).limit(1);if(0===u.length)throw new i("Forbidden: No access to this server",403);let c=u[0].permission,l={view:1,manage:2,admin:3};if(l[c]<l[r])throw new i(`Forbidden: Requires ${r} permission`,403);return s}},31969:(e,t,r)=>{r.d(t,{I:()=>d});var s=r(33580),a=r(5944),n=r(90224),o=r(22587),i=r(8290);let d=(0,s.kj)({database:(0,a.s)(o.db,{provider:"sqlite",schema:{user:i.users,session:i.sessions,account:i.accounts,verification:i.verifications}}),emailAndPassword:{enabled:!0,requireEmailVerification:!1},session:{expiresIn:604800,updateAge:86400,cookieCache:{enabled:!0,maxAge:300}},user:{additionalFields:{role:{type:"string",required:!1,defaultValue:"user",input:!1}}},plugins:[(0,n.SA)({defaultRole:"user",adminRole:"admin"})],trustedOrigins:["http://localhost:5000","http://localhost:3000",...process.env.BETTER_AUTH_BASE_URL?[process.env.BETTER_AUTH_BASE_URL]:[],...process.env.NEXT_PUBLIC_APP_URL?[process.env.NEXT_PUBLIC_APP_URL]:[]]})},22587:(e,t,r)=>{r.d(t,{db:()=>p});var s=r(85890),a=r.n(s),n=r(31590),o=r(8290),i=r(55315),d=r.n(i),u=r(92048);let c=function(){if(process.env.DATABASE_URL)return process.env.DATABASE_URL;let e=process.env.MCCTL_ROOT||process.cwd(),t=d().join(e,"data");return d().join(t,"mcctl.db")}();!function(e){if(":memory:"===e)return;let t=d().dirname(e);(0,u.existsSync)(t)||(0,u.mkdirSync)(t,{recursive:!0})}(c);let l=new(a())(c);l.pragma("journal_mode = WAL"),l.pragma("foreign_keys = ON"),l.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS users (
|
|
3
3
|
id TEXT PRIMARY KEY,
|
|
4
4
|
name TEXT NOT NULL,
|
|
@@ -45,4 +45,13 @@ CREATE TABLE IF NOT EXISTS verifications (
|
|
|
45
45
|
created_at INTEGER,
|
|
46
46
|
updated_at INTEGER
|
|
47
47
|
);
|
|
48
|
+
CREATE TABLE IF NOT EXISTS user_servers (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
51
|
+
server_id TEXT NOT NULL,
|
|
52
|
+
permission TEXT NOT NULL DEFAULT 'view',
|
|
53
|
+
created_at INTEGER NOT NULL,
|
|
54
|
+
updated_at INTEGER NOT NULL
|
|
55
|
+
);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS user_server_idx ON user_servers(user_id, server_id);
|
|
48
57
|
`);let p=(0,n.t)(l,{schema:o})},8290:(e,t,r)=>{r.r(t),r.d(t,{accounts:()=>u,sessions:()=>d,userServers:()=>l,users:()=>i,verifications:()=>c});var s=r(80722),a=r(10160),n=r(30304),o=r(76303);let i=(0,s.Px)("users",{id:(0,a.fL)("id").primaryKey(),name:(0,a.fL)("name").notNull(),email:(0,a.fL)("email").notNull().unique(),emailVerified:(0,n._L)("email_verified",{mode:"boolean"}).notNull().default(!1),image:(0,a.fL)("image"),role:(0,a.fL)("role").notNull().default("user"),banned:(0,n._L)("banned",{mode:"boolean"}).default(!1),banReason:(0,a.fL)("ban_reason"),banExpires:(0,n._L)("ban_expires",{mode:"timestamp"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),d=(0,s.Px)("sessions",{id:(0,a.fL)("id").primaryKey(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),token:(0,a.fL)("token").notNull().unique(),ipAddress:(0,a.fL)("ip_address"),userAgent:(0,a.fL)("user_agent"),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),u=(0,s.Px)("accounts",{id:(0,a.fL)("id").primaryKey(),accountId:(0,a.fL)("account_id").notNull(),providerId:(0,a.fL)("provider_id").notNull(),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),accessToken:(0,a.fL)("access_token"),refreshToken:(0,a.fL)("refresh_token"),idToken:(0,a.fL)("id_token"),accessTokenExpiresAt:(0,n._L)("access_token_expires_at",{mode:"timestamp"}),refreshTokenExpiresAt:(0,n._L)("refresh_token_expires_at",{mode:"timestamp"}),scope:(0,a.fL)("scope"),password:(0,a.fL)("password"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),c=(0,s.Px)("verifications",{id:(0,a.fL)("id").primaryKey(),identifier:(0,a.fL)("identifier").notNull(),value:(0,a.fL)("value").notNull(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)}),l=(0,s.Px)("user_servers",{id:(0,a.fL)("id").primaryKey().$defaultFn(()=>crypto.randomUUID()),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),serverId:(0,a.fL)("server_id").notNull(),permission:(0,a.fL)("permission").$type().notNull().default("view"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},e=>({userServerIdx:(0,o.Kz)("user_server_idx").on(e.userId,e.serverId)}))}};var t=require("../../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),s=t.X(0,[9836,1489,7605,5309],()=>r(39004));module.exports=s})();
|
package/.next/standalone/platform/services/mcctl-console/.next/server/app/api/router/status/route.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{var e={};e.id=9481,e.ids=[9481],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},41781:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>
|
|
1
|
+
"use strict";(()=>{var e={};e.id=9481,e.ids=[9481],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},41781:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>L,patchFetch:()=>N,requestAsyncStorage:()=>m,routeModule:()=>T,serverHooks:()=>f,staticGenerationAsyncStorage:()=>E});var s={};r.r(s),r.d(s,{GET:()=>l,dynamic:()=>p});var a=r(3025),n=r(45086),o=r(74048),i=r(24517),d=r(78649),u=r(31969),c=r(77605);let p="force-dynamic";async function l(){try{let e=await u.I.api.getSession({headers:await (0,c.headers)()});if(!e)return i.NextResponse.json({error:"Unauthorized",message:"Authentication required"},{status:401});let t=(0,d.F0)({username:e.user.name||e.user.email,role:e.user.role||"user"}),r=await t.getRouterStatus();return i.NextResponse.json(r)}catch(e){if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to fetch router status:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to fetch router status"},{status:500})}}let T=new a.AppRouteRouteModule({definition:{kind:n.x.APP_ROUTE,page:"/api/router/status/route",pathname:"/api/router/status",filename:"route",bundlePath:"app/api/router/status/route"},resolvedPagePath:"/home/runner/work/minecraft-server-manager/minecraft-server-manager/platform/services/mcctl-console/src/app/api/router/status/route.ts",nextConfigOutput:"standalone",userland:s}),{requestAsyncStorage:m,staticGenerationAsyncStorage:E,serverHooks:f}=T,L="/api/router/status/route";function N(){return(0,o.patchFetch)({serverHooks:f,staticGenerationAsyncStorage:E})}},78649:(e,t,r)=>{r.d(t,{F0:()=>n,zB:()=>s});class s extends Error{constructor(e,t,r){super(r),this.statusCode=e,this.error=t,this.name="McctlApiError"}}class a{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.userContext=e.userContext}async fetch(e,t={}){let r=`${this.baseUrl}${e}`,a={"X-API-Key":this.apiKey};t.body&&(a["Content-Type"]="application/json"),this.userContext&&(a["X-User"]=this.userContext.username,a["X-Role"]=this.userContext.role);let n=await fetch(r,{...t,headers:{...a,...t.headers}});if(!n.ok){let e=await n.json().catch(()=>({error:"UnknownError",message:n.statusText}));throw new s(n.status,e.error,e.message)}return n.json()}async getServers(){return this.fetch("/api/servers")}async getServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}`)}async createServer(e){return this.fetch("/api/servers",{method:"POST",body:JSON.stringify(e)})}async deleteServer(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async startServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/start`,{method:"POST"})}async stopServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/stop`,{method:"POST"})}async restartServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/restart`,{method:"POST"})}async execCommand(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/exec`,{method:"POST",body:JSON.stringify({command:t})})}async getLogs(e,t=100){return this.fetch(`/api/servers/${encodeURIComponent(e)}/logs?lines=${t}`)}async getWorlds(){return this.fetch("/api/worlds")}async getWorld(e){return this.fetch(`/api/worlds/${encodeURIComponent(e)}`)}async createWorld(e){return this.fetch("/api/worlds",{method:"POST",body:JSON.stringify(e)})}async assignWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/assign`,{method:"POST",body:JSON.stringify({serverName:t})})}async releaseWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/release${t?"?force=true":""}`,{method:"POST"})}async deleteWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async getServerConfig(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`)}async updateServerConfig(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`,{method:"PATCH",body:JSON.stringify(t)})}async resetWorld(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/world/reset`,{method:"POST"})}async getRouterStatus(){return this.fetch("/api/router/status")}async getBackupStatus(){return this.fetch("/api/backup/status")}async pushBackup(e){let t=e?JSON.stringify({message:e}):void 0;return this.fetch("/api/backup/push",{method:"POST",body:t})}async getBackupHistory(e=20){return this.fetch(`/api/backup/history?limit=${e}`)}async restoreBackup(e){return this.fetch("/api/backup/restore",{method:"POST",body:JSON.stringify({commitHash:e})})}}function n(e){let t=process.env.MCCTL_API_URL||"http://localhost:5001",r=process.env.MCCTL_API_KEY||"";return r||console.warn("MCCTL_API_KEY is not set. API requests may fail."),new a({baseUrl:t,apiKey:r,userContext:e})}},31969:(e,t,r)=>{r.d(t,{I:()=>d});var s=r(33580),a=r(5944),n=r(90224),o=r(22587),i=r(8290);let d=(0,s.kj)({database:(0,a.s)(o.db,{provider:"sqlite",schema:{user:i.users,session:i.sessions,account:i.accounts,verification:i.verifications}}),emailAndPassword:{enabled:!0,requireEmailVerification:!1},session:{expiresIn:604800,updateAge:86400,cookieCache:{enabled:!0,maxAge:300}},user:{additionalFields:{role:{type:"string",required:!1,defaultValue:"user",input:!1}}},plugins:[(0,n.SA)({defaultRole:"user",adminRole:"admin"})],trustedOrigins:["http://localhost:5000","http://localhost:3000",...process.env.BETTER_AUTH_BASE_URL?[process.env.BETTER_AUTH_BASE_URL]:[],...process.env.NEXT_PUBLIC_APP_URL?[process.env.NEXT_PUBLIC_APP_URL]:[]]})},22587:(e,t,r)=>{r.d(t,{db:()=>l});var s=r(85890),a=r.n(s),n=r(31590),o=r(8290),i=r(55315),d=r.n(i),u=r(92048);let c=function(){if(process.env.DATABASE_URL)return process.env.DATABASE_URL;let e=process.env.MCCTL_ROOT||process.cwd(),t=d().join(e,"data");return d().join(t,"mcctl.db")}();!function(e){if(":memory:"===e)return;let t=d().dirname(e);(0,u.existsSync)(t)||(0,u.mkdirSync)(t,{recursive:!0})}(c);let p=new(a())(c);p.pragma("journal_mode = WAL"),p.pragma("foreign_keys = ON"),p.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS users (
|
|
3
3
|
id TEXT PRIMARY KEY,
|
|
4
4
|
name TEXT NOT NULL,
|
|
@@ -45,4 +45,13 @@ CREATE TABLE IF NOT EXISTS verifications (
|
|
|
45
45
|
created_at INTEGER,
|
|
46
46
|
updated_at INTEGER
|
|
47
47
|
);
|
|
48
|
+
CREATE TABLE IF NOT EXISTS user_servers (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
51
|
+
server_id TEXT NOT NULL,
|
|
52
|
+
permission TEXT NOT NULL DEFAULT 'view',
|
|
53
|
+
created_at INTEGER NOT NULL,
|
|
54
|
+
updated_at INTEGER NOT NULL
|
|
55
|
+
);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS user_server_idx ON user_servers(user_id, server_id);
|
|
48
57
|
`);let l=(0,n.t)(p,{schema:o})},8290:(e,t,r)=>{r.r(t),r.d(t,{accounts:()=>u,sessions:()=>d,userServers:()=>p,users:()=>i,verifications:()=>c});var s=r(80722),a=r(10160),n=r(30304),o=r(76303);let i=(0,s.Px)("users",{id:(0,a.fL)("id").primaryKey(),name:(0,a.fL)("name").notNull(),email:(0,a.fL)("email").notNull().unique(),emailVerified:(0,n._L)("email_verified",{mode:"boolean"}).notNull().default(!1),image:(0,a.fL)("image"),role:(0,a.fL)("role").notNull().default("user"),banned:(0,n._L)("banned",{mode:"boolean"}).default(!1),banReason:(0,a.fL)("ban_reason"),banExpires:(0,n._L)("ban_expires",{mode:"timestamp"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),d=(0,s.Px)("sessions",{id:(0,a.fL)("id").primaryKey(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),token:(0,a.fL)("token").notNull().unique(),ipAddress:(0,a.fL)("ip_address"),userAgent:(0,a.fL)("user_agent"),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),u=(0,s.Px)("accounts",{id:(0,a.fL)("id").primaryKey(),accountId:(0,a.fL)("account_id").notNull(),providerId:(0,a.fL)("provider_id").notNull(),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),accessToken:(0,a.fL)("access_token"),refreshToken:(0,a.fL)("refresh_token"),idToken:(0,a.fL)("id_token"),accessTokenExpiresAt:(0,n._L)("access_token_expires_at",{mode:"timestamp"}),refreshTokenExpiresAt:(0,n._L)("refresh_token_expires_at",{mode:"timestamp"}),scope:(0,a.fL)("scope"),password:(0,a.fL)("password"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),c=(0,s.Px)("verifications",{id:(0,a.fL)("id").primaryKey(),identifier:(0,a.fL)("identifier").notNull(),value:(0,a.fL)("value").notNull(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)}),p=(0,s.Px)("user_servers",{id:(0,a.fL)("id").primaryKey().$defaultFn(()=>crypto.randomUUID()),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),serverId:(0,a.fL)("server_id").notNull(),permission:(0,a.fL)("permission").$type().notNull().default("view"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},e=>({userServerIdx:(0,o.Kz)("user_server_idx").on(e.userId,e.serverId)}))}};var t=require("../../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),s=t.X(0,[9836,1489,7605,5309],()=>r(41781));module.exports=s})();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{var e={};e.id=7813,e.ids=[7813],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},16570:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>_,patchFetch:()=>v,requestAsyncStorage:()=>
|
|
1
|
+
"use strict";(()=>{var e={};e.id=7813,e.ids=[7813],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},16570:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>_,patchFetch:()=>v,requestAsyncStorage:()=>N,routeModule:()=>f,serverHooks:()=>L,staticGenerationAsyncStorage:()=>h});var s={};r.r(s),r.d(s,{GET:()=>T,POST:()=>E,dynamic:()=>l});var a=r(3025),n=r(45086),o=r(74048),i=r(24517),d=r(78649),u=r(60154),c=r(77605);let l="force-dynamic",p=["start","stop","restart","exec","logs"];function m(e){return{username:e.user.name||e.user.email,role:e.user.role||"user"}}async function T(e,{params:t}){try{let{name:r,action:s}=await t;if(!p.includes(s))return i.NextResponse.json({error:"BadRequest",message:`Invalid action: ${s}`},{status:400});let a=await (0,u.Ke)(await (0,c.headers)(),r,"view"),n=(0,d.F0)(m(a));if("logs"===s){let{searchParams:t}=new URL(e.url),s=parseInt(t.get("lines")||"100",10),a=await n.getLogs(r,s);return i.NextResponse.json(a)}return i.NextResponse.json({error:"MethodNotAllowed",message:"Use POST for this action"},{status:405})}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Forbidden",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to execute action:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to execute action"},{status:500})}}async function E(e,{params:t}){try{let{name:r,action:s}=await t;if(!p.includes(s))return i.NextResponse.json({error:"BadRequest",message:`Invalid action: ${s}`},{status:400});let a=await (0,u.Ke)(await (0,c.headers)(),r,"manage"),n=(0,d.F0)(m(a));switch(s){case"start":{let e=await n.startServer(r);return i.NextResponse.json(e)}case"stop":{let e=await n.stopServer(r);return i.NextResponse.json(e)}case"restart":{let e=await n.restartServer(r);return i.NextResponse.json(e)}case"exec":{let t=await e.json();if(!t.command)return i.NextResponse.json({error:"BadRequest",message:"Command is required"},{status:400});let s=await n.execCommand(r,t.command);return i.NextResponse.json(s)}default:return i.NextResponse.json({error:"BadRequest",message:`Invalid action: ${s}`},{status:400})}}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Forbidden",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to execute action:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to execute action"},{status:500})}}let f=new a.AppRouteRouteModule({definition:{kind:n.x.APP_ROUTE,page:"/api/servers/[name]/[action]/route",pathname:"/api/servers/[name]/[action]",filename:"route",bundlePath:"app/api/servers/[name]/[action]/route"},resolvedPagePath:"/home/runner/work/minecraft-server-manager/minecraft-server-manager/platform/services/mcctl-console/src/app/api/servers/[name]/[action]/route.ts",nextConfigOutput:"standalone",userland:s}),{requestAsyncStorage:N,staticGenerationAsyncStorage:h,serverHooks:L}=f,_="/api/servers/[name]/[action]/route";function v(){return(0,o.patchFetch)({serverHooks:L,staticGenerationAsyncStorage:h})}},78649:(e,t,r)=>{r.d(t,{F0:()=>n,zB:()=>s});class s extends Error{constructor(e,t,r){super(r),this.statusCode=e,this.error=t,this.name="McctlApiError"}}class a{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.userContext=e.userContext}async fetch(e,t={}){let r=`${this.baseUrl}${e}`,a={"X-API-Key":this.apiKey};t.body&&(a["Content-Type"]="application/json"),this.userContext&&(a["X-User"]=this.userContext.username,a["X-Role"]=this.userContext.role);let n=await fetch(r,{...t,headers:{...a,...t.headers}});if(!n.ok){let e=await n.json().catch(()=>({error:"UnknownError",message:n.statusText}));throw new s(n.status,e.error,e.message)}return n.json()}async getServers(){return this.fetch("/api/servers")}async getServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}`)}async createServer(e){return this.fetch("/api/servers",{method:"POST",body:JSON.stringify(e)})}async deleteServer(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async startServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/start`,{method:"POST"})}async stopServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/stop`,{method:"POST"})}async restartServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/restart`,{method:"POST"})}async execCommand(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/exec`,{method:"POST",body:JSON.stringify({command:t})})}async getLogs(e,t=100){return this.fetch(`/api/servers/${encodeURIComponent(e)}/logs?lines=${t}`)}async getWorlds(){return this.fetch("/api/worlds")}async getWorld(e){return this.fetch(`/api/worlds/${encodeURIComponent(e)}`)}async createWorld(e){return this.fetch("/api/worlds",{method:"POST",body:JSON.stringify(e)})}async assignWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/assign`,{method:"POST",body:JSON.stringify({serverName:t})})}async releaseWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/release${t?"?force=true":""}`,{method:"POST"})}async deleteWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async getServerConfig(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`)}async updateServerConfig(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`,{method:"PATCH",body:JSON.stringify(t)})}async resetWorld(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/world/reset`,{method:"POST"})}async getRouterStatus(){return this.fetch("/api/router/status")}async getBackupStatus(){return this.fetch("/api/backup/status")}async pushBackup(e){let t=e?JSON.stringify({message:e}):void 0;return this.fetch("/api/backup/push",{method:"POST",body:t})}async getBackupHistory(e=20){return this.fetch(`/api/backup/history?limit=${e}`)}async restoreBackup(e){return this.fetch("/api/backup/restore",{method:"POST",body:JSON.stringify({commitHash:e})})}}function n(e){let t=process.env.MCCTL_API_URL||"http://localhost:5001",r=process.env.MCCTL_API_KEY||"";return r||console.warn("MCCTL_API_KEY is not set. API requests may fail."),new a({baseUrl:t,apiKey:r,userContext:e})}},60154:(e,t,r)=>{r.d(t,{Ke:()=>c,kF:()=>u,l4:()=>i,mk:()=>d});var s=r(31969),a=r(22587),n=r(8290),o=r(30579);class i extends Error{constructor(e,t=401){super(e),this.statusCode=t,this.name="AuthError"}}async function d(e){let t=await s.I.api.getSession({headers:e});if(!t)throw new i("Unauthorized",401);return t}async function u(e){let t=await d(e);if("admin"!==t.user.role)throw new i("Forbidden: Admin access required",403);return t}async function c(e,t,r="view"){let s=await d(e);if("admin"===s.user.role)return s;let u=await a.db.select().from(n.userServers).where((0,o.xD)((0,o.eq)(n.userServers.userId,s.user.id),(0,o.eq)(n.userServers.serverId,t))).limit(1);if(0===u.length)throw new i("Forbidden: No access to this server",403);let c=u[0].permission,l={view:1,manage:2,admin:3};if(l[c]<l[r])throw new i(`Forbidden: Requires ${r} permission`,403);return s}},31969:(e,t,r)=>{r.d(t,{I:()=>d});var s=r(33580),a=r(5944),n=r(90224),o=r(22587),i=r(8290);let d=(0,s.kj)({database:(0,a.s)(o.db,{provider:"sqlite",schema:{user:i.users,session:i.sessions,account:i.accounts,verification:i.verifications}}),emailAndPassword:{enabled:!0,requireEmailVerification:!1},session:{expiresIn:604800,updateAge:86400,cookieCache:{enabled:!0,maxAge:300}},user:{additionalFields:{role:{type:"string",required:!1,defaultValue:"user",input:!1}}},plugins:[(0,n.SA)({defaultRole:"user",adminRole:"admin"})],trustedOrigins:["http://localhost:5000","http://localhost:3000",...process.env.BETTER_AUTH_BASE_URL?[process.env.BETTER_AUTH_BASE_URL]:[],...process.env.NEXT_PUBLIC_APP_URL?[process.env.NEXT_PUBLIC_APP_URL]:[]]})},22587:(e,t,r)=>{r.d(t,{db:()=>p});var s=r(85890),a=r.n(s),n=r(31590),o=r(8290),i=r(55315),d=r.n(i),u=r(92048);let c=function(){if(process.env.DATABASE_URL)return process.env.DATABASE_URL;let e=process.env.MCCTL_ROOT||process.cwd(),t=d().join(e,"data");return d().join(t,"mcctl.db")}();!function(e){if(":memory:"===e)return;let t=d().dirname(e);(0,u.existsSync)(t)||(0,u.mkdirSync)(t,{recursive:!0})}(c);let l=new(a())(c);l.pragma("journal_mode = WAL"),l.pragma("foreign_keys = ON"),l.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS users (
|
|
3
3
|
id TEXT PRIMARY KEY,
|
|
4
4
|
name TEXT NOT NULL,
|
|
@@ -45,4 +45,13 @@ CREATE TABLE IF NOT EXISTS verifications (
|
|
|
45
45
|
created_at INTEGER,
|
|
46
46
|
updated_at INTEGER
|
|
47
47
|
);
|
|
48
|
+
CREATE TABLE IF NOT EXISTS user_servers (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
51
|
+
server_id TEXT NOT NULL,
|
|
52
|
+
permission TEXT NOT NULL DEFAULT 'view',
|
|
53
|
+
created_at INTEGER NOT NULL,
|
|
54
|
+
updated_at INTEGER NOT NULL
|
|
55
|
+
);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS user_server_idx ON user_servers(user_id, server_id);
|
|
48
57
|
`);let p=(0,n.t)(l,{schema:o})},8290:(e,t,r)=>{r.r(t),r.d(t,{accounts:()=>u,sessions:()=>d,userServers:()=>l,users:()=>i,verifications:()=>c});var s=r(80722),a=r(10160),n=r(30304),o=r(76303);let i=(0,s.Px)("users",{id:(0,a.fL)("id").primaryKey(),name:(0,a.fL)("name").notNull(),email:(0,a.fL)("email").notNull().unique(),emailVerified:(0,n._L)("email_verified",{mode:"boolean"}).notNull().default(!1),image:(0,a.fL)("image"),role:(0,a.fL)("role").notNull().default("user"),banned:(0,n._L)("banned",{mode:"boolean"}).default(!1),banReason:(0,a.fL)("ban_reason"),banExpires:(0,n._L)("ban_expires",{mode:"timestamp"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),d=(0,s.Px)("sessions",{id:(0,a.fL)("id").primaryKey(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),token:(0,a.fL)("token").notNull().unique(),ipAddress:(0,a.fL)("ip_address"),userAgent:(0,a.fL)("user_agent"),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),u=(0,s.Px)("accounts",{id:(0,a.fL)("id").primaryKey(),accountId:(0,a.fL)("account_id").notNull(),providerId:(0,a.fL)("provider_id").notNull(),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),accessToken:(0,a.fL)("access_token"),refreshToken:(0,a.fL)("refresh_token"),idToken:(0,a.fL)("id_token"),accessTokenExpiresAt:(0,n._L)("access_token_expires_at",{mode:"timestamp"}),refreshTokenExpiresAt:(0,n._L)("refresh_token_expires_at",{mode:"timestamp"}),scope:(0,a.fL)("scope"),password:(0,a.fL)("password"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),c=(0,s.Px)("verifications",{id:(0,a.fL)("id").primaryKey(),identifier:(0,a.fL)("identifier").notNull(),value:(0,a.fL)("value").notNull(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)}),l=(0,s.Px)("user_servers",{id:(0,a.fL)("id").primaryKey().$defaultFn(()=>crypto.randomUUID()),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),serverId:(0,a.fL)("server_id").notNull(),permission:(0,a.fL)("permission").$type().notNull().default("view"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},e=>({userServerIdx:(0,o.Kz)("user_server_idx").on(e.userId,e.serverId)}))}};var t=require("../../../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),s=t.X(0,[9836,1489,7605,5309],()=>r(16570));module.exports=s})();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{var e={};e.id=1219,e.ids=[1219],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},19865:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>
|
|
1
|
+
"use strict";(()=>{var e={};e.id=1219,e.ids=[1219],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},19865:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>L,patchFetch:()=>_,requestAsyncStorage:()=>E,routeModule:()=>f,serverHooks:()=>h,staticGenerationAsyncStorage:()=>N});var s={};r.r(s),r.d(s,{GET:()=>m,PATCH:()=>T,dynamic:()=>p});var n=r(3025),a=r(45086),o=r(74048),i=r(24517),d=r(78649),u=r(60154),c=r(77605);let p="force-dynamic";function l(e){return{username:e.user.name||e.user.email,role:e.user.role||"user"}}async function m(e,{params:t}){try{let{name:e}=await t,r=await (0,u.Ke)(await (0,c.headers)(),e,"view"),s=(0,d.F0)(l(r)),n=await s.getServerConfig(e);return i.NextResponse.json(n)}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Forbidden",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to fetch server config:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to fetch server config"},{status:500})}}async function T(e,{params:t}){try{let{name:r}=await t,s=await (0,u.Ke)(await (0,c.headers)(),r,"manage"),n=await e.json(),a=(0,d.F0)(l(s)),o=await a.updateServerConfig(r,n);return i.NextResponse.json(o)}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Forbidden",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to update server config:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to update server config"},{status:500})}}let f=new n.AppRouteRouteModule({definition:{kind:a.x.APP_ROUTE,page:"/api/servers/[name]/config/route",pathname:"/api/servers/[name]/config",filename:"route",bundlePath:"app/api/servers/[name]/config/route"},resolvedPagePath:"/home/runner/work/minecraft-server-manager/minecraft-server-manager/platform/services/mcctl-console/src/app/api/servers/[name]/config/route.ts",nextConfigOutput:"standalone",userland:s}),{requestAsyncStorage:E,staticGenerationAsyncStorage:N,serverHooks:h}=f,L="/api/servers/[name]/config/route";function _(){return(0,o.patchFetch)({serverHooks:h,staticGenerationAsyncStorage:N})}},78649:(e,t,r)=>{r.d(t,{F0:()=>a,zB:()=>s});class s extends Error{constructor(e,t,r){super(r),this.statusCode=e,this.error=t,this.name="McctlApiError"}}class n{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.userContext=e.userContext}async fetch(e,t={}){let r=`${this.baseUrl}${e}`,n={"X-API-Key":this.apiKey};t.body&&(n["Content-Type"]="application/json"),this.userContext&&(n["X-User"]=this.userContext.username,n["X-Role"]=this.userContext.role);let a=await fetch(r,{...t,headers:{...n,...t.headers}});if(!a.ok){let e=await a.json().catch(()=>({error:"UnknownError",message:a.statusText}));throw new s(a.status,e.error,e.message)}return a.json()}async getServers(){return this.fetch("/api/servers")}async getServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}`)}async createServer(e){return this.fetch("/api/servers",{method:"POST",body:JSON.stringify(e)})}async deleteServer(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async startServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/start`,{method:"POST"})}async stopServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/stop`,{method:"POST"})}async restartServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/restart`,{method:"POST"})}async execCommand(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/exec`,{method:"POST",body:JSON.stringify({command:t})})}async getLogs(e,t=100){return this.fetch(`/api/servers/${encodeURIComponent(e)}/logs?lines=${t}`)}async getWorlds(){return this.fetch("/api/worlds")}async getWorld(e){return this.fetch(`/api/worlds/${encodeURIComponent(e)}`)}async createWorld(e){return this.fetch("/api/worlds",{method:"POST",body:JSON.stringify(e)})}async assignWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/assign`,{method:"POST",body:JSON.stringify({serverName:t})})}async releaseWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/release${t?"?force=true":""}`,{method:"POST"})}async deleteWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async getServerConfig(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`)}async updateServerConfig(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`,{method:"PATCH",body:JSON.stringify(t)})}async resetWorld(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/world/reset`,{method:"POST"})}async getRouterStatus(){return this.fetch("/api/router/status")}async getBackupStatus(){return this.fetch("/api/backup/status")}async pushBackup(e){let t=e?JSON.stringify({message:e}):void 0;return this.fetch("/api/backup/push",{method:"POST",body:t})}async getBackupHistory(e=20){return this.fetch(`/api/backup/history?limit=${e}`)}async restoreBackup(e){return this.fetch("/api/backup/restore",{method:"POST",body:JSON.stringify({commitHash:e})})}}function a(e){let t=process.env.MCCTL_API_URL||"http://localhost:5001",r=process.env.MCCTL_API_KEY||"";return r||console.warn("MCCTL_API_KEY is not set. API requests may fail."),new n({baseUrl:t,apiKey:r,userContext:e})}},60154:(e,t,r)=>{r.d(t,{Ke:()=>c,kF:()=>u,l4:()=>i,mk:()=>d});var s=r(31969),n=r(22587),a=r(8290),o=r(30579);class i extends Error{constructor(e,t=401){super(e),this.statusCode=t,this.name="AuthError"}}async function d(e){let t=await s.I.api.getSession({headers:e});if(!t)throw new i("Unauthorized",401);return t}async function u(e){let t=await d(e);if("admin"!==t.user.role)throw new i("Forbidden: Admin access required",403);return t}async function c(e,t,r="view"){let s=await d(e);if("admin"===s.user.role)return s;let u=await n.db.select().from(a.userServers).where((0,o.xD)((0,o.eq)(a.userServers.userId,s.user.id),(0,o.eq)(a.userServers.serverId,t))).limit(1);if(0===u.length)throw new i("Forbidden: No access to this server",403);let c=u[0].permission,p={view:1,manage:2,admin:3};if(p[c]<p[r])throw new i(`Forbidden: Requires ${r} permission`,403);return s}},31969:(e,t,r)=>{r.d(t,{I:()=>d});var s=r(33580),n=r(5944),a=r(90224),o=r(22587),i=r(8290);let d=(0,s.kj)({database:(0,n.s)(o.db,{provider:"sqlite",schema:{user:i.users,session:i.sessions,account:i.accounts,verification:i.verifications}}),emailAndPassword:{enabled:!0,requireEmailVerification:!1},session:{expiresIn:604800,updateAge:86400,cookieCache:{enabled:!0,maxAge:300}},user:{additionalFields:{role:{type:"string",required:!1,defaultValue:"user",input:!1}}},plugins:[(0,a.SA)({defaultRole:"user",adminRole:"admin"})],trustedOrigins:["http://localhost:5000","http://localhost:3000",...process.env.BETTER_AUTH_BASE_URL?[process.env.BETTER_AUTH_BASE_URL]:[],...process.env.NEXT_PUBLIC_APP_URL?[process.env.NEXT_PUBLIC_APP_URL]:[]]})},22587:(e,t,r)=>{r.d(t,{db:()=>l});var s=r(85890),n=r.n(s),a=r(31590),o=r(8290),i=r(55315),d=r.n(i),u=r(92048);let c=function(){if(process.env.DATABASE_URL)return process.env.DATABASE_URL;let e=process.env.MCCTL_ROOT||process.cwd(),t=d().join(e,"data");return d().join(t,"mcctl.db")}();!function(e){if(":memory:"===e)return;let t=d().dirname(e);(0,u.existsSync)(t)||(0,u.mkdirSync)(t,{recursive:!0})}(c);let p=new(n())(c);p.pragma("journal_mode = WAL"),p.pragma("foreign_keys = ON"),p.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS users (
|
|
3
3
|
id TEXT PRIMARY KEY,
|
|
4
4
|
name TEXT NOT NULL,
|
|
@@ -45,4 +45,13 @@ CREATE TABLE IF NOT EXISTS verifications (
|
|
|
45
45
|
created_at INTEGER,
|
|
46
46
|
updated_at INTEGER
|
|
47
47
|
);
|
|
48
|
+
CREATE TABLE IF NOT EXISTS user_servers (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
51
|
+
server_id TEXT NOT NULL,
|
|
52
|
+
permission TEXT NOT NULL DEFAULT 'view',
|
|
53
|
+
created_at INTEGER NOT NULL,
|
|
54
|
+
updated_at INTEGER NOT NULL
|
|
55
|
+
);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS user_server_idx ON user_servers(user_id, server_id);
|
|
48
57
|
`);let l=(0,a.t)(p,{schema:o})},8290:(e,t,r)=>{r.r(t),r.d(t,{accounts:()=>u,sessions:()=>d,userServers:()=>p,users:()=>i,verifications:()=>c});var s=r(80722),n=r(10160),a=r(30304),o=r(76303);let i=(0,s.Px)("users",{id:(0,n.fL)("id").primaryKey(),name:(0,n.fL)("name").notNull(),email:(0,n.fL)("email").notNull().unique(),emailVerified:(0,a._L)("email_verified",{mode:"boolean"}).notNull().default(!1),image:(0,n.fL)("image"),role:(0,n.fL)("role").notNull().default("user"),banned:(0,a._L)("banned",{mode:"boolean"}).default(!1),banReason:(0,n.fL)("ban_reason"),banExpires:(0,a._L)("ban_expires",{mode:"timestamp"}),createdAt:(0,a._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,a._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),d=(0,s.Px)("sessions",{id:(0,n.fL)("id").primaryKey(),expiresAt:(0,a._L)("expires_at",{mode:"timestamp"}).notNull(),token:(0,n.fL)("token").notNull().unique(),ipAddress:(0,n.fL)("ip_address"),userAgent:(0,n.fL)("user_agent"),userId:(0,n.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),createdAt:(0,a._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,a._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),u=(0,s.Px)("accounts",{id:(0,n.fL)("id").primaryKey(),accountId:(0,n.fL)("account_id").notNull(),providerId:(0,n.fL)("provider_id").notNull(),userId:(0,n.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),accessToken:(0,n.fL)("access_token"),refreshToken:(0,n.fL)("refresh_token"),idToken:(0,n.fL)("id_token"),accessTokenExpiresAt:(0,a._L)("access_token_expires_at",{mode:"timestamp"}),refreshTokenExpiresAt:(0,a._L)("refresh_token_expires_at",{mode:"timestamp"}),scope:(0,n.fL)("scope"),password:(0,n.fL)("password"),createdAt:(0,a._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,a._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),c=(0,s.Px)("verifications",{id:(0,n.fL)("id").primaryKey(),identifier:(0,n.fL)("identifier").notNull(),value:(0,n.fL)("value").notNull(),expiresAt:(0,a._L)("expires_at",{mode:"timestamp"}).notNull(),createdAt:(0,a._L)("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:(0,a._L)("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)}),p=(0,s.Px)("user_servers",{id:(0,n.fL)("id").primaryKey().$defaultFn(()=>crypto.randomUUID()),userId:(0,n.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),serverId:(0,n.fL)("server_id").notNull(),permission:(0,n.fL)("permission").$type().notNull().default("view"),createdAt:(0,a._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,a._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},e=>({userServerIdx:(0,o.Kz)("user_server_idx").on(e.userId,e.serverId)}))}};var t=require("../../../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),s=t.X(0,[9836,1489,7605,5309],()=>r(19865));module.exports=s})();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{var e={};e.id=6104,e.ids=[6104],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},4499:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>
|
|
1
|
+
"use strict";(()=>{var e={};e.id=6104,e.ids=[6104],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},4499:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>L,patchFetch:()=>N,requestAsyncStorage:()=>T,routeModule:()=>m,serverHooks:()=>f,staticGenerationAsyncStorage:()=>E});var s={};r.r(s),r.d(s,{POST:()=>l,dynamic:()=>p});var a=r(3025),n=r(45086),o=r(74048),i=r(24517),d=r(78649),u=r(60154),c=r(77605);let p="force-dynamic";async function l(e,{params:t}){try{let{name:r}=await t,s=await (0,u.Ke)(await (0,c.headers)(),r,"manage"),a=await e.json();if(!a.command||"string"!=typeof a.command)return i.NextResponse.json({error:"BadRequest",message:"Command is required and must be a string"},{status:400});let n=(0,d.F0)({username:s.user.name||s.user.email,role:s.user.role||"user"}),o=await n.execCommand(r,a.command);return i.NextResponse.json(o)}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Forbidden",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to execute command:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to execute command"},{status:500})}}let m=new a.AppRouteRouteModule({definition:{kind:n.x.APP_ROUTE,page:"/api/servers/[name]/exec/route",pathname:"/api/servers/[name]/exec",filename:"route",bundlePath:"app/api/servers/[name]/exec/route"},resolvedPagePath:"/home/runner/work/minecraft-server-manager/minecraft-server-manager/platform/services/mcctl-console/src/app/api/servers/[name]/exec/route.ts",nextConfigOutput:"standalone",userland:s}),{requestAsyncStorage:T,staticGenerationAsyncStorage:E,serverHooks:f}=m,L="/api/servers/[name]/exec/route";function N(){return(0,o.patchFetch)({serverHooks:f,staticGenerationAsyncStorage:E})}},78649:(e,t,r)=>{r.d(t,{F0:()=>n,zB:()=>s});class s extends Error{constructor(e,t,r){super(r),this.statusCode=e,this.error=t,this.name="McctlApiError"}}class a{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.userContext=e.userContext}async fetch(e,t={}){let r=`${this.baseUrl}${e}`,a={"X-API-Key":this.apiKey};t.body&&(a["Content-Type"]="application/json"),this.userContext&&(a["X-User"]=this.userContext.username,a["X-Role"]=this.userContext.role);let n=await fetch(r,{...t,headers:{...a,...t.headers}});if(!n.ok){let e=await n.json().catch(()=>({error:"UnknownError",message:n.statusText}));throw new s(n.status,e.error,e.message)}return n.json()}async getServers(){return this.fetch("/api/servers")}async getServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}`)}async createServer(e){return this.fetch("/api/servers",{method:"POST",body:JSON.stringify(e)})}async deleteServer(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async startServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/start`,{method:"POST"})}async stopServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/stop`,{method:"POST"})}async restartServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/restart`,{method:"POST"})}async execCommand(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/exec`,{method:"POST",body:JSON.stringify({command:t})})}async getLogs(e,t=100){return this.fetch(`/api/servers/${encodeURIComponent(e)}/logs?lines=${t}`)}async getWorlds(){return this.fetch("/api/worlds")}async getWorld(e){return this.fetch(`/api/worlds/${encodeURIComponent(e)}`)}async createWorld(e){return this.fetch("/api/worlds",{method:"POST",body:JSON.stringify(e)})}async assignWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/assign`,{method:"POST",body:JSON.stringify({serverName:t})})}async releaseWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/release${t?"?force=true":""}`,{method:"POST"})}async deleteWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async getServerConfig(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`)}async updateServerConfig(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`,{method:"PATCH",body:JSON.stringify(t)})}async resetWorld(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/world/reset`,{method:"POST"})}async getRouterStatus(){return this.fetch("/api/router/status")}async getBackupStatus(){return this.fetch("/api/backup/status")}async pushBackup(e){let t=e?JSON.stringify({message:e}):void 0;return this.fetch("/api/backup/push",{method:"POST",body:t})}async getBackupHistory(e=20){return this.fetch(`/api/backup/history?limit=${e}`)}async restoreBackup(e){return this.fetch("/api/backup/restore",{method:"POST",body:JSON.stringify({commitHash:e})})}}function n(e){let t=process.env.MCCTL_API_URL||"http://localhost:5001",r=process.env.MCCTL_API_KEY||"";return r||console.warn("MCCTL_API_KEY is not set. API requests may fail."),new a({baseUrl:t,apiKey:r,userContext:e})}},60154:(e,t,r)=>{r.d(t,{Ke:()=>c,kF:()=>u,l4:()=>i,mk:()=>d});var s=r(31969),a=r(22587),n=r(8290),o=r(30579);class i extends Error{constructor(e,t=401){super(e),this.statusCode=t,this.name="AuthError"}}async function d(e){let t=await s.I.api.getSession({headers:e});if(!t)throw new i("Unauthorized",401);return t}async function u(e){let t=await d(e);if("admin"!==t.user.role)throw new i("Forbidden: Admin access required",403);return t}async function c(e,t,r="view"){let s=await d(e);if("admin"===s.user.role)return s;let u=await a.db.select().from(n.userServers).where((0,o.xD)((0,o.eq)(n.userServers.userId,s.user.id),(0,o.eq)(n.userServers.serverId,t))).limit(1);if(0===u.length)throw new i("Forbidden: No access to this server",403);let c=u[0].permission,p={view:1,manage:2,admin:3};if(p[c]<p[r])throw new i(`Forbidden: Requires ${r} permission`,403);return s}},31969:(e,t,r)=>{r.d(t,{I:()=>d});var s=r(33580),a=r(5944),n=r(90224),o=r(22587),i=r(8290);let d=(0,s.kj)({database:(0,a.s)(o.db,{provider:"sqlite",schema:{user:i.users,session:i.sessions,account:i.accounts,verification:i.verifications}}),emailAndPassword:{enabled:!0,requireEmailVerification:!1},session:{expiresIn:604800,updateAge:86400,cookieCache:{enabled:!0,maxAge:300}},user:{additionalFields:{role:{type:"string",required:!1,defaultValue:"user",input:!1}}},plugins:[(0,n.SA)({defaultRole:"user",adminRole:"admin"})],trustedOrigins:["http://localhost:5000","http://localhost:3000",...process.env.BETTER_AUTH_BASE_URL?[process.env.BETTER_AUTH_BASE_URL]:[],...process.env.NEXT_PUBLIC_APP_URL?[process.env.NEXT_PUBLIC_APP_URL]:[]]})},22587:(e,t,r)=>{r.d(t,{db:()=>l});var s=r(85890),a=r.n(s),n=r(31590),o=r(8290),i=r(55315),d=r.n(i),u=r(92048);let c=function(){if(process.env.DATABASE_URL)return process.env.DATABASE_URL;let e=process.env.MCCTL_ROOT||process.cwd(),t=d().join(e,"data");return d().join(t,"mcctl.db")}();!function(e){if(":memory:"===e)return;let t=d().dirname(e);(0,u.existsSync)(t)||(0,u.mkdirSync)(t,{recursive:!0})}(c);let p=new(a())(c);p.pragma("journal_mode = WAL"),p.pragma("foreign_keys = ON"),p.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS users (
|
|
3
3
|
id TEXT PRIMARY KEY,
|
|
4
4
|
name TEXT NOT NULL,
|
|
@@ -45,4 +45,13 @@ CREATE TABLE IF NOT EXISTS verifications (
|
|
|
45
45
|
created_at INTEGER,
|
|
46
46
|
updated_at INTEGER
|
|
47
47
|
);
|
|
48
|
+
CREATE TABLE IF NOT EXISTS user_servers (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
51
|
+
server_id TEXT NOT NULL,
|
|
52
|
+
permission TEXT NOT NULL DEFAULT 'view',
|
|
53
|
+
created_at INTEGER NOT NULL,
|
|
54
|
+
updated_at INTEGER NOT NULL
|
|
55
|
+
);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS user_server_idx ON user_servers(user_id, server_id);
|
|
48
57
|
`);let l=(0,n.t)(p,{schema:o})},8290:(e,t,r)=>{r.r(t),r.d(t,{accounts:()=>u,sessions:()=>d,userServers:()=>p,users:()=>i,verifications:()=>c});var s=r(80722),a=r(10160),n=r(30304),o=r(76303);let i=(0,s.Px)("users",{id:(0,a.fL)("id").primaryKey(),name:(0,a.fL)("name").notNull(),email:(0,a.fL)("email").notNull().unique(),emailVerified:(0,n._L)("email_verified",{mode:"boolean"}).notNull().default(!1),image:(0,a.fL)("image"),role:(0,a.fL)("role").notNull().default("user"),banned:(0,n._L)("banned",{mode:"boolean"}).default(!1),banReason:(0,a.fL)("ban_reason"),banExpires:(0,n._L)("ban_expires",{mode:"timestamp"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),d=(0,s.Px)("sessions",{id:(0,a.fL)("id").primaryKey(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),token:(0,a.fL)("token").notNull().unique(),ipAddress:(0,a.fL)("ip_address"),userAgent:(0,a.fL)("user_agent"),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),u=(0,s.Px)("accounts",{id:(0,a.fL)("id").primaryKey(),accountId:(0,a.fL)("account_id").notNull(),providerId:(0,a.fL)("provider_id").notNull(),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),accessToken:(0,a.fL)("access_token"),refreshToken:(0,a.fL)("refresh_token"),idToken:(0,a.fL)("id_token"),accessTokenExpiresAt:(0,n._L)("access_token_expires_at",{mode:"timestamp"}),refreshTokenExpiresAt:(0,n._L)("refresh_token_expires_at",{mode:"timestamp"}),scope:(0,a.fL)("scope"),password:(0,a.fL)("password"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),c=(0,s.Px)("verifications",{id:(0,a.fL)("id").primaryKey(),identifier:(0,a.fL)("identifier").notNull(),value:(0,a.fL)("value").notNull(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)}),p=(0,s.Px)("user_servers",{id:(0,a.fL)("id").primaryKey().$defaultFn(()=>crypto.randomUUID()),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),serverId:(0,a.fL)("server_id").notNull(),permission:(0,a.fL)("permission").$type().notNull().default("view"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},e=>({userServerIdx:(0,o.Kz)("user_server_idx").on(e.userId,e.serverId)}))}};var t=require("../../../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),s=t.X(0,[9836,1489,7605,5309],()=>r(4499));module.exports=s})();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{var e={};e.id=3429,e.ids=[3429],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},87830:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>
|
|
1
|
+
"use strict";(()=>{var e={};e.id=3429,e.ids=[3429],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},87830:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>h,patchFetch:()=>_,requestAsyncStorage:()=>f,routeModule:()=>E,serverHooks:()=>L,staticGenerationAsyncStorage:()=>N});var s={};r.r(s),r.d(s,{DELETE:()=>T,GET:()=>m,dynamic:()=>l});var a=r(3025),n=r(45086),o=r(74048),i=r(24517),d=r(78649),u=r(60154),c=r(77605);let l="force-dynamic";function p(e){return{username:e.user.name||e.user.email,role:e.user.role||"user"}}async function m(e,{params:t}){try{let{name:e}=await t,r=await (0,u.Ke)(await (0,c.headers)(),e,"view"),s=(0,d.F0)(p(r)),a=await s.getServer(e);return i.NextResponse.json(a)}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Forbidden",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to fetch server:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to fetch server details"},{status:500})}}async function T(e,{params:t}){try{let{name:r}=await t,s=await (0,u.Ke)(await (0,c.headers)(),r,"admin"),{searchParams:a}=new URL(e.url),n="true"===a.get("force"),o=(0,d.F0)(p(s)),l=await o.deleteServer(r,n);return i.NextResponse.json(l)}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Forbidden",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to delete server:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to delete server"},{status:500})}}let E=new a.AppRouteRouteModule({definition:{kind:n.x.APP_ROUTE,page:"/api/servers/[name]/route",pathname:"/api/servers/[name]",filename:"route",bundlePath:"app/api/servers/[name]/route"},resolvedPagePath:"/home/runner/work/minecraft-server-manager/minecraft-server-manager/platform/services/mcctl-console/src/app/api/servers/[name]/route.ts",nextConfigOutput:"standalone",userland:s}),{requestAsyncStorage:f,staticGenerationAsyncStorage:N,serverHooks:L}=E,h="/api/servers/[name]/route";function _(){return(0,o.patchFetch)({serverHooks:L,staticGenerationAsyncStorage:N})}},78649:(e,t,r)=>{r.d(t,{F0:()=>n,zB:()=>s});class s extends Error{constructor(e,t,r){super(r),this.statusCode=e,this.error=t,this.name="McctlApiError"}}class a{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.userContext=e.userContext}async fetch(e,t={}){let r=`${this.baseUrl}${e}`,a={"X-API-Key":this.apiKey};t.body&&(a["Content-Type"]="application/json"),this.userContext&&(a["X-User"]=this.userContext.username,a["X-Role"]=this.userContext.role);let n=await fetch(r,{...t,headers:{...a,...t.headers}});if(!n.ok){let e=await n.json().catch(()=>({error:"UnknownError",message:n.statusText}));throw new s(n.status,e.error,e.message)}return n.json()}async getServers(){return this.fetch("/api/servers")}async getServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}`)}async createServer(e){return this.fetch("/api/servers",{method:"POST",body:JSON.stringify(e)})}async deleteServer(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async startServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/start`,{method:"POST"})}async stopServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/stop`,{method:"POST"})}async restartServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/restart`,{method:"POST"})}async execCommand(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/exec`,{method:"POST",body:JSON.stringify({command:t})})}async getLogs(e,t=100){return this.fetch(`/api/servers/${encodeURIComponent(e)}/logs?lines=${t}`)}async getWorlds(){return this.fetch("/api/worlds")}async getWorld(e){return this.fetch(`/api/worlds/${encodeURIComponent(e)}`)}async createWorld(e){return this.fetch("/api/worlds",{method:"POST",body:JSON.stringify(e)})}async assignWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/assign`,{method:"POST",body:JSON.stringify({serverName:t})})}async releaseWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/release${t?"?force=true":""}`,{method:"POST"})}async deleteWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async getServerConfig(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`)}async updateServerConfig(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`,{method:"PATCH",body:JSON.stringify(t)})}async resetWorld(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/world/reset`,{method:"POST"})}async getRouterStatus(){return this.fetch("/api/router/status")}async getBackupStatus(){return this.fetch("/api/backup/status")}async pushBackup(e){let t=e?JSON.stringify({message:e}):void 0;return this.fetch("/api/backup/push",{method:"POST",body:t})}async getBackupHistory(e=20){return this.fetch(`/api/backup/history?limit=${e}`)}async restoreBackup(e){return this.fetch("/api/backup/restore",{method:"POST",body:JSON.stringify({commitHash:e})})}}function n(e){let t=process.env.MCCTL_API_URL||"http://localhost:5001",r=process.env.MCCTL_API_KEY||"";return r||console.warn("MCCTL_API_KEY is not set. API requests may fail."),new a({baseUrl:t,apiKey:r,userContext:e})}},60154:(e,t,r)=>{r.d(t,{Ke:()=>c,kF:()=>u,l4:()=>i,mk:()=>d});var s=r(31969),a=r(22587),n=r(8290),o=r(30579);class i extends Error{constructor(e,t=401){super(e),this.statusCode=t,this.name="AuthError"}}async function d(e){let t=await s.I.api.getSession({headers:e});if(!t)throw new i("Unauthorized",401);return t}async function u(e){let t=await d(e);if("admin"!==t.user.role)throw new i("Forbidden: Admin access required",403);return t}async function c(e,t,r="view"){let s=await d(e);if("admin"===s.user.role)return s;let u=await a.db.select().from(n.userServers).where((0,o.xD)((0,o.eq)(n.userServers.userId,s.user.id),(0,o.eq)(n.userServers.serverId,t))).limit(1);if(0===u.length)throw new i("Forbidden: No access to this server",403);let c=u[0].permission,l={view:1,manage:2,admin:3};if(l[c]<l[r])throw new i(`Forbidden: Requires ${r} permission`,403);return s}},31969:(e,t,r)=>{r.d(t,{I:()=>d});var s=r(33580),a=r(5944),n=r(90224),o=r(22587),i=r(8290);let d=(0,s.kj)({database:(0,a.s)(o.db,{provider:"sqlite",schema:{user:i.users,session:i.sessions,account:i.accounts,verification:i.verifications}}),emailAndPassword:{enabled:!0,requireEmailVerification:!1},session:{expiresIn:604800,updateAge:86400,cookieCache:{enabled:!0,maxAge:300}},user:{additionalFields:{role:{type:"string",required:!1,defaultValue:"user",input:!1}}},plugins:[(0,n.SA)({defaultRole:"user",adminRole:"admin"})],trustedOrigins:["http://localhost:5000","http://localhost:3000",...process.env.BETTER_AUTH_BASE_URL?[process.env.BETTER_AUTH_BASE_URL]:[],...process.env.NEXT_PUBLIC_APP_URL?[process.env.NEXT_PUBLIC_APP_URL]:[]]})},22587:(e,t,r)=>{r.d(t,{db:()=>p});var s=r(85890),a=r.n(s),n=r(31590),o=r(8290),i=r(55315),d=r.n(i),u=r(92048);let c=function(){if(process.env.DATABASE_URL)return process.env.DATABASE_URL;let e=process.env.MCCTL_ROOT||process.cwd(),t=d().join(e,"data");return d().join(t,"mcctl.db")}();!function(e){if(":memory:"===e)return;let t=d().dirname(e);(0,u.existsSync)(t)||(0,u.mkdirSync)(t,{recursive:!0})}(c);let l=new(a())(c);l.pragma("journal_mode = WAL"),l.pragma("foreign_keys = ON"),l.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS users (
|
|
3
3
|
id TEXT PRIMARY KEY,
|
|
4
4
|
name TEXT NOT NULL,
|
|
@@ -45,4 +45,13 @@ CREATE TABLE IF NOT EXISTS verifications (
|
|
|
45
45
|
created_at INTEGER,
|
|
46
46
|
updated_at INTEGER
|
|
47
47
|
);
|
|
48
|
+
CREATE TABLE IF NOT EXISTS user_servers (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
51
|
+
server_id TEXT NOT NULL,
|
|
52
|
+
permission TEXT NOT NULL DEFAULT 'view',
|
|
53
|
+
created_at INTEGER NOT NULL,
|
|
54
|
+
updated_at INTEGER NOT NULL
|
|
55
|
+
);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS user_server_idx ON user_servers(user_id, server_id);
|
|
48
57
|
`);let p=(0,n.t)(l,{schema:o})},8290:(e,t,r)=>{r.r(t),r.d(t,{accounts:()=>u,sessions:()=>d,userServers:()=>l,users:()=>i,verifications:()=>c});var s=r(80722),a=r(10160),n=r(30304),o=r(76303);let i=(0,s.Px)("users",{id:(0,a.fL)("id").primaryKey(),name:(0,a.fL)("name").notNull(),email:(0,a.fL)("email").notNull().unique(),emailVerified:(0,n._L)("email_verified",{mode:"boolean"}).notNull().default(!1),image:(0,a.fL)("image"),role:(0,a.fL)("role").notNull().default("user"),banned:(0,n._L)("banned",{mode:"boolean"}).default(!1),banReason:(0,a.fL)("ban_reason"),banExpires:(0,n._L)("ban_expires",{mode:"timestamp"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),d=(0,s.Px)("sessions",{id:(0,a.fL)("id").primaryKey(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),token:(0,a.fL)("token").notNull().unique(),ipAddress:(0,a.fL)("ip_address"),userAgent:(0,a.fL)("user_agent"),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),u=(0,s.Px)("accounts",{id:(0,a.fL)("id").primaryKey(),accountId:(0,a.fL)("account_id").notNull(),providerId:(0,a.fL)("provider_id").notNull(),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),accessToken:(0,a.fL)("access_token"),refreshToken:(0,a.fL)("refresh_token"),idToken:(0,a.fL)("id_token"),accessTokenExpiresAt:(0,n._L)("access_token_expires_at",{mode:"timestamp"}),refreshTokenExpiresAt:(0,n._L)("refresh_token_expires_at",{mode:"timestamp"}),scope:(0,a.fL)("scope"),password:(0,a.fL)("password"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),c=(0,s.Px)("verifications",{id:(0,a.fL)("id").primaryKey(),identifier:(0,a.fL)("identifier").notNull(),value:(0,a.fL)("value").notNull(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)}),l=(0,s.Px)("user_servers",{id:(0,a.fL)("id").primaryKey().$defaultFn(()=>crypto.randomUUID()),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),serverId:(0,a.fL)("server_id").notNull(),permission:(0,a.fL)("permission").$type().notNull().default("view"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},e=>({userServerIdx:(0,o.Kz)("user_server_idx").on(e.userId,e.serverId)}))}};var t=require("../../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),s=t.X(0,[9836,1489,7605,5309],()=>r(87830));module.exports=s})();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{var e={};e.id=5442,e.ids=[5442],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},25138:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>
|
|
1
|
+
"use strict";(()=>{var e={};e.id=5442,e.ids=[5442],e.modules={85890:e=>{e.exports=require("better-sqlite3")},72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},25138:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>L,patchFetch:()=>N,requestAsyncStorage:()=>T,routeModule:()=>m,serverHooks:()=>f,staticGenerationAsyncStorage:()=>E});var s={};r.r(s),r.d(s,{POST:()=>p,dynamic:()=>l});var a=r(3025),n=r(45086),o=r(74048),i=r(24517),d=r(78649),u=r(60154),c=r(77605);let l="force-dynamic";async function p(e,{params:t}){try{let{name:e}=await t,r=await (0,u.Ke)(await (0,c.headers)(),e,"admin"),s=(0,d.F0)({username:r.user.name||r.user.email,role:r.user.role||"user"}),a=await s.resetWorld(e);return i.NextResponse.json(a)}catch(e){if(e instanceof u.l4)return i.NextResponse.json({error:"Forbidden",message:e.message},{status:e.statusCode});if(e instanceof d.zB)return i.NextResponse.json({error:e.error,message:e.message},{status:e.statusCode});return console.error("Failed to reset world:",e),i.NextResponse.json({error:"InternalServerError",message:"Failed to reset world"},{status:500})}}let m=new a.AppRouteRouteModule({definition:{kind:n.x.APP_ROUTE,page:"/api/servers/[name]/world/reset/route",pathname:"/api/servers/[name]/world/reset",filename:"route",bundlePath:"app/api/servers/[name]/world/reset/route"},resolvedPagePath:"/home/runner/work/minecraft-server-manager/minecraft-server-manager/platform/services/mcctl-console/src/app/api/servers/[name]/world/reset/route.ts",nextConfigOutput:"standalone",userland:s}),{requestAsyncStorage:T,staticGenerationAsyncStorage:E,serverHooks:f}=m,L="/api/servers/[name]/world/reset/route";function N(){return(0,o.patchFetch)({serverHooks:f,staticGenerationAsyncStorage:E})}},78649:(e,t,r)=>{r.d(t,{F0:()=>n,zB:()=>s});class s extends Error{constructor(e,t,r){super(r),this.statusCode=e,this.error=t,this.name="McctlApiError"}}class a{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.userContext=e.userContext}async fetch(e,t={}){let r=`${this.baseUrl}${e}`,a={"X-API-Key":this.apiKey};t.body&&(a["Content-Type"]="application/json"),this.userContext&&(a["X-User"]=this.userContext.username,a["X-Role"]=this.userContext.role);let n=await fetch(r,{...t,headers:{...a,...t.headers}});if(!n.ok){let e=await n.json().catch(()=>({error:"UnknownError",message:n.statusText}));throw new s(n.status,e.error,e.message)}return n.json()}async getServers(){return this.fetch("/api/servers")}async getServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}`)}async createServer(e){return this.fetch("/api/servers",{method:"POST",body:JSON.stringify(e)})}async deleteServer(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async startServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/start`,{method:"POST"})}async stopServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/stop`,{method:"POST"})}async restartServer(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/restart`,{method:"POST"})}async execCommand(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/exec`,{method:"POST",body:JSON.stringify({command:t})})}async getLogs(e,t=100){return this.fetch(`/api/servers/${encodeURIComponent(e)}/logs?lines=${t}`)}async getWorlds(){return this.fetch("/api/worlds")}async getWorld(e){return this.fetch(`/api/worlds/${encodeURIComponent(e)}`)}async createWorld(e){return this.fetch("/api/worlds",{method:"POST",body:JSON.stringify(e)})}async assignWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/assign`,{method:"POST",body:JSON.stringify({serverName:t})})}async releaseWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}/release${t?"?force=true":""}`,{method:"POST"})}async deleteWorld(e,t){return this.fetch(`/api/worlds/${encodeURIComponent(e)}${t?"?force=true":""}`,{method:"DELETE"})}async getServerConfig(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`)}async updateServerConfig(e,t){return this.fetch(`/api/servers/${encodeURIComponent(e)}/config`,{method:"PATCH",body:JSON.stringify(t)})}async resetWorld(e){return this.fetch(`/api/servers/${encodeURIComponent(e)}/world/reset`,{method:"POST"})}async getRouterStatus(){return this.fetch("/api/router/status")}async getBackupStatus(){return this.fetch("/api/backup/status")}async pushBackup(e){let t=e?JSON.stringify({message:e}):void 0;return this.fetch("/api/backup/push",{method:"POST",body:t})}async getBackupHistory(e=20){return this.fetch(`/api/backup/history?limit=${e}`)}async restoreBackup(e){return this.fetch("/api/backup/restore",{method:"POST",body:JSON.stringify({commitHash:e})})}}function n(e){let t=process.env.MCCTL_API_URL||"http://localhost:5001",r=process.env.MCCTL_API_KEY||"";return r||console.warn("MCCTL_API_KEY is not set. API requests may fail."),new a({baseUrl:t,apiKey:r,userContext:e})}},60154:(e,t,r)=>{r.d(t,{Ke:()=>c,kF:()=>u,l4:()=>i,mk:()=>d});var s=r(31969),a=r(22587),n=r(8290),o=r(30579);class i extends Error{constructor(e,t=401){super(e),this.statusCode=t,this.name="AuthError"}}async function d(e){let t=await s.I.api.getSession({headers:e});if(!t)throw new i("Unauthorized",401);return t}async function u(e){let t=await d(e);if("admin"!==t.user.role)throw new i("Forbidden: Admin access required",403);return t}async function c(e,t,r="view"){let s=await d(e);if("admin"===s.user.role)return s;let u=await a.db.select().from(n.userServers).where((0,o.xD)((0,o.eq)(n.userServers.userId,s.user.id),(0,o.eq)(n.userServers.serverId,t))).limit(1);if(0===u.length)throw new i("Forbidden: No access to this server",403);let c=u[0].permission,l={view:1,manage:2,admin:3};if(l[c]<l[r])throw new i(`Forbidden: Requires ${r} permission`,403);return s}},31969:(e,t,r)=>{r.d(t,{I:()=>d});var s=r(33580),a=r(5944),n=r(90224),o=r(22587),i=r(8290);let d=(0,s.kj)({database:(0,a.s)(o.db,{provider:"sqlite",schema:{user:i.users,session:i.sessions,account:i.accounts,verification:i.verifications}}),emailAndPassword:{enabled:!0,requireEmailVerification:!1},session:{expiresIn:604800,updateAge:86400,cookieCache:{enabled:!0,maxAge:300}},user:{additionalFields:{role:{type:"string",required:!1,defaultValue:"user",input:!1}}},plugins:[(0,n.SA)({defaultRole:"user",adminRole:"admin"})],trustedOrigins:["http://localhost:5000","http://localhost:3000",...process.env.BETTER_AUTH_BASE_URL?[process.env.BETTER_AUTH_BASE_URL]:[],...process.env.NEXT_PUBLIC_APP_URL?[process.env.NEXT_PUBLIC_APP_URL]:[]]})},22587:(e,t,r)=>{r.d(t,{db:()=>p});var s=r(85890),a=r.n(s),n=r(31590),o=r(8290),i=r(55315),d=r.n(i),u=r(92048);let c=function(){if(process.env.DATABASE_URL)return process.env.DATABASE_URL;let e=process.env.MCCTL_ROOT||process.cwd(),t=d().join(e,"data");return d().join(t,"mcctl.db")}();!function(e){if(":memory:"===e)return;let t=d().dirname(e);(0,u.existsSync)(t)||(0,u.mkdirSync)(t,{recursive:!0})}(c);let l=new(a())(c);l.pragma("journal_mode = WAL"),l.pragma("foreign_keys = ON"),l.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS users (
|
|
3
3
|
id TEXT PRIMARY KEY,
|
|
4
4
|
name TEXT NOT NULL,
|
|
@@ -45,4 +45,13 @@ CREATE TABLE IF NOT EXISTS verifications (
|
|
|
45
45
|
created_at INTEGER,
|
|
46
46
|
updated_at INTEGER
|
|
47
47
|
);
|
|
48
|
+
CREATE TABLE IF NOT EXISTS user_servers (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
51
|
+
server_id TEXT NOT NULL,
|
|
52
|
+
permission TEXT NOT NULL DEFAULT 'view',
|
|
53
|
+
created_at INTEGER NOT NULL,
|
|
54
|
+
updated_at INTEGER NOT NULL
|
|
55
|
+
);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS user_server_idx ON user_servers(user_id, server_id);
|
|
48
57
|
`);let p=(0,n.t)(l,{schema:o})},8290:(e,t,r)=>{r.r(t),r.d(t,{accounts:()=>u,sessions:()=>d,userServers:()=>l,users:()=>i,verifications:()=>c});var s=r(80722),a=r(10160),n=r(30304),o=r(76303);let i=(0,s.Px)("users",{id:(0,a.fL)("id").primaryKey(),name:(0,a.fL)("name").notNull(),email:(0,a.fL)("email").notNull().unique(),emailVerified:(0,n._L)("email_verified",{mode:"boolean"}).notNull().default(!1),image:(0,a.fL)("image"),role:(0,a.fL)("role").notNull().default("user"),banned:(0,n._L)("banned",{mode:"boolean"}).default(!1),banReason:(0,a.fL)("ban_reason"),banExpires:(0,n._L)("ban_expires",{mode:"timestamp"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),d=(0,s.Px)("sessions",{id:(0,a.fL)("id").primaryKey(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),token:(0,a.fL)("token").notNull().unique(),ipAddress:(0,a.fL)("ip_address"),userAgent:(0,a.fL)("user_agent"),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),u=(0,s.Px)("accounts",{id:(0,a.fL)("id").primaryKey(),accountId:(0,a.fL)("account_id").notNull(),providerId:(0,a.fL)("provider_id").notNull(),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),accessToken:(0,a.fL)("access_token"),refreshToken:(0,a.fL)("refresh_token"),idToken:(0,a.fL)("id_token"),accessTokenExpiresAt:(0,n._L)("access_token_expires_at",{mode:"timestamp"}),refreshTokenExpiresAt:(0,n._L)("refresh_token_expires_at",{mode:"timestamp"}),scope:(0,a.fL)("scope"),password:(0,a.fL)("password"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)}),c=(0,s.Px)("verifications",{id:(0,a.fL)("id").primaryKey(),identifier:(0,a.fL)("identifier").notNull(),value:(0,a.fL)("value").notNull(),expiresAt:(0,n._L)("expires_at",{mode:"timestamp"}).notNull(),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)}),l=(0,s.Px)("user_servers",{id:(0,a.fL)("id").primaryKey().$defaultFn(()=>crypto.randomUUID()),userId:(0,a.fL)("user_id").notNull().references(()=>i.id,{onDelete:"cascade"}),serverId:(0,a.fL)("server_id").notNull(),permission:(0,a.fL)("permission").$type().notNull().default("view"),createdAt:(0,n._L)("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:(0,n._L)("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},e=>({userServerIdx:(0,o.Kz)("user_server_idx").on(e.userId,e.serverId)}))}};var t=require("../../../../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),s=t.X(0,[9836,1489,7605,5309],()=>r(25138));module.exports=s})();
|