Files
mamad-app/.next/server/app/api/admin/toggle-user-lock/route.js
2026-01-16 17:48:46 +02:00

96 lines
48 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(() => {
var exports = {};
exports.id = "app/api/admin/toggle-user-lock/route";
exports.ids = ["app/api/admin/toggle-user-lock/route"];
exports.modules = {
/***/ "mysql2/promise":
/*!*********************************!*\
!*** external "mysql2/promise" ***!
\*********************************/
/***/ ((module) => {
module.exports = require("mysql2/promise");
/***/ }),
/***/ "next/dist/compiled/next-server/app-page.runtime.dev.js":
/*!*************************************************************************!*\
!*** external "next/dist/compiled/next-server/app-page.runtime.dev.js" ***!
\*************************************************************************/
/***/ ((module) => {
module.exports = require("next/dist/compiled/next-server/app-page.runtime.dev.js");
/***/ }),
/***/ "next/dist/compiled/next-server/app-route.runtime.dev.js":
/*!**************************************************************************!*\
!*** external "next/dist/compiled/next-server/app-route.runtime.dev.js" ***!
\**************************************************************************/
/***/ ((module) => {
module.exports = require("next/dist/compiled/next-server/app-route.runtime.dev.js");
/***/ }),
/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&page=%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute.ts&appDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app%5Capp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!":
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&page=%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute.ts&appDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app%5Capp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D! ***!
\**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ originalPathname: () => (/* binding */ originalPathname),\n/* harmony export */ patchFetch: () => (/* binding */ patchFetch),\n/* harmony export */ requestAsyncStorage: () => (/* binding */ requestAsyncStorage),\n/* harmony export */ routeModule: () => (/* binding */ routeModule),\n/* harmony export */ serverHooks: () => (/* binding */ serverHooks),\n/* harmony export */ staticGenerationAsyncStorage: () => (/* binding */ staticGenerationAsyncStorage)\n/* harmony export */ });\n/* harmony import */ var next_dist_server_future_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/dist/server/future/route-modules/app-route/module.compiled */ \"(rsc)/./node_modules/next/dist/server/future/route-modules/app-route/module.compiled.js\");\n/* harmony import */ var next_dist_server_future_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_future_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_dist_server_future_route_kind__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/dist/server/future/route-kind */ \"(rsc)/./node_modules/next/dist/server/future/route-kind.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/dist/server/lib/patch-fetch */ \"(rsc)/./node_modules/next/dist/server/lib/patch-fetch.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var C_Users_tom_VS_Code_MamadApp_mamad_app_app_api_admin_toggle_user_lock_route_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./app/api/admin/toggle-user-lock/route.ts */ \"(rsc)/./app/api/admin/toggle-user-lock/route.ts\");\n\n\n\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new next_dist_server_future_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__.AppRouteRouteModule({\n definition: {\n kind: next_dist_server_future_route_kind__WEBPACK_IMPORTED_MODULE_1__.RouteKind.APP_ROUTE,\n page: \"/api/admin/toggle-user-lock/route\",\n pathname: \"/api/admin/toggle-user-lock\",\n filename: \"route\",\n bundlePath: \"app/api/admin/toggle-user-lock/route\"\n },\n resolvedPagePath: \"C:\\\\Users\\\\tom\\\\VS Code\\\\MamadApp\\\\mamad-app\\\\app\\\\api\\\\admin\\\\toggle-user-lock\\\\route.ts\",\n nextConfigOutput,\n userland: C_Users_tom_VS_Code_MamadApp_mamad_app_app_api_admin_toggle_user_lock_route_ts__WEBPACK_IMPORTED_MODULE_3__\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { requestAsyncStorage, staticGenerationAsyncStorage, serverHooks } = routeModule;\nconst originalPathname = \"/api/admin/toggle-user-lock/route\";\nfunction patchFetch() {\n return (0,next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__.patchFetch)({\n serverHooks,\n staticGenerationAsyncStorage\n });\n}\n\n\n//# sourceMappingURL=app-route.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LWFwcC1sb2FkZXIuanM/bmFtZT1hcHAlMkZhcGklMkZhZG1pbiUyRnRvZ2dsZS11c2VyLWxvY2slMkZyb3V0ZSZwYWdlPSUyRmFwaSUyRmFkbWluJTJGdG9nZ2xlLXVzZXItbG9jayUyRnJvdXRlJmFwcFBhdGhzPSZwYWdlUGF0aD1wcml2YXRlLW5leHQtYXBwLWRpciUyRmFwaSUyRmFkbWluJTJGdG9nZ2xlLXVzZXItbG9jayUyRnJvdXRlLnRzJmFwcERpcj1DJTNBJTVDVXNlcnMlNUN0b20lNUNWUyUyMENvZGUlNUNNYW1hZEFwcCU1Q21hbWFkLWFwcCU1Q2FwcCZwYWdlRXh0ZW5zaW9ucz10c3gmcGFnZUV4dGVuc2lvbnM9dHMmcGFnZUV4dGVuc2lvbnM9anN4JnBhZ2VFeHRlbnNpb25zPWpzJnJvb3REaXI9QyUzQSU1Q1VzZXJzJTVDdG9tJTVDVlMlMjBDb2RlJTVDTWFtYWRBcHAlNUNtYW1hZC1hcHAmaXNEZXY9dHJ1ZSZ0c2NvbmZpZ1BhdGg9dHNjb25maWcuanNvbiZiYXNlUGF0aD0mYXNzZXRQcmVmaXg9Jm5leHRDb25maWdPdXRwdXQ9JnByZWZlcnJlZFJlZ2lvbj0mbWlkZGxld2FyZUNvbmZpZz1lMzAlM0QhIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFzRztBQUN2QztBQUNjO0FBQ3lDO0FBQ3RIO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnSEFBbUI7QUFDM0M7QUFDQSxjQUFjLHlFQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxZQUFZO0FBQ1osQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaUVBQWlFO0FBQ3pFO0FBQ0E7QUFDQSxXQUFXLDRFQUFXO0FBQ3RCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDdUg7O0FBRXZIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWFtYWQtYXBwLz9lYzcxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcFJvdXRlUm91dGVNb2R1bGUgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9mdXR1cmUvcm91dGUtbW9kdWxlcy9hcHAtcm91dGUvbW9kdWxlLmNvbXBpbGVkXCI7XG5pbXBvcnQgeyBSb3V0ZUtpbmQgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9mdXR1cmUvcm91dGUta2luZFwiO1xuaW1wb3J0IHsgcGF0Y2hGZXRjaCBhcyBfcGF0Y2hGZXRjaCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2xpYi9wYXRjaC1mZXRjaFwiO1xuaW1wb3J0ICogYXMgdXNlcmxhbmQgZnJvbSBcIkM6XFxcXFVzZXJzXFxcXHRvbVxcXFxWUyBDb2RlXFxcXE1hbWFkQXBwXFxcXG1hbWFkLWFwcFxcXFxhcHBcXFxcYXBpXFxcXGFkbWluXFxcXHRvZ2dsZS11c2VyLWxvY2tcXFxccm91dGUudHNcIjtcbi8vIFdlIGluamVjdCB0aGUgbmV4dENvbmZpZ091dHB1dCBoZXJlIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtIGluIHRoZSByb3V0ZVxuLy8gbW9kdWxlLlxuY29uc3QgbmV4dENvbmZpZ091dHB1dCA9IFwiXCJcbmNvbnN0IHJvdXRlTW9kdWxlID0gbmV3IEFwcFJvdXRlUm91dGVNb2R1bGUoe1xuICAgIGRlZmluaXRpb246IHtcbiAgICAgICAga2luZDogUm91dGVLaW5kLkFQUF9ST1VURSxcbiAgICAgICAgcGFnZTogXCIvYXBpL2FkbWluL3RvZ2dsZS11c2VyLWxvY2svcm91dGVcIixcbiAgICAgICAgcGF0aG5hbWU6IFwiL2FwaS9hZG1pbi90b2dnbGUtdXNlci1sb2NrXCIsXG4gICAgICAgIGZpbGVuYW1lOiBcInJvdXRlXCIsXG4gICAgICAgIGJ1bmRsZVBhdGg6IFwiYXBwL2FwaS9hZG1pbi90b2dnbGUtdXNlci1sb2NrL3JvdXRlXCJcbiAgICB9LFxuICAgIHJlc29sdmVkUGFnZVBhdGg6IFwiQzpcXFxcVXNlcnNcXFxcdG9tXFxcXFZTIENvZGVcXFxcTWFtYWRBcHBcXFxcbWFtYWQtYXBwXFxcXGFwcFxcXFxhcGlcXFxcYWRtaW5cXFxcdG9nZ2xlLXVzZXItbG9ja1xcXFxyb3V0ZS50c1wiLFxuICAgIG5leHRDb25maWdPdXRwdXQsXG4gICAgdXNlcmxhbmRcbn0pO1xuLy8gUHVsbCBvdXQgdGhlIGV4cG9ydHMgdGhhdCB3ZSBuZWVkIHRvIGV4cG9zZSBmcm9tIHRoZSBtb2R1bGUuIFRoaXMgc2hvdWxkXG4vLyBiZSBlbGltaW5hdGVkIHdoZW4gd2UndmUgbW92ZWQgdGhlIG90aGVyIHJvdXRlcyB0byB0aGUgbmV3IGZvcm1hdC4gVGhlc2Vcbi8vIGFyZSB1c2VkIHRvIGhvb2sgaW50byB0aGUgcm91dGUuXG5jb25zdCB7IHJlcXVlc3RBc3luY1N0b3JhZ2UsIHN0YXRpY0dlbmVyYXRpb25Bc3luY1N0b3JhZ2UsIHNlcnZlckhvb2tzIH0gPSByb3V0ZU1vZHVsZTtcbmNvbnN0IG9yaWdpbmFsUGF0aG5hbWUgPSBcIi9hcGkvYWRtaW4vdG9nZ2xlLXVzZXItbG9jay9yb3V0ZVwiO1xuZnVuY3Rpb24gcGF0Y2hGZXRjaCgpIHtcbiAgICByZXR1cm4gX3BhdGNoRmV0Y2goe1xuICAgICAgICBzZXJ2ZXJIb29rcyxcbiAgICAgICAgc3RhdGljR2VuZXJhdGlvbkFzeW5jU3RvcmFnZVxuICAgIH0pO1xufVxuZXhwb3J0IHsgcm91dGVNb2R1bGUsIHJlcXVlc3RBc3luY1N0b3JhZ2UsIHN0YXRpY0dlbmVyYXRpb25Bc3luY1N0b3JhZ2UsIHNlcnZlckhvb2tzLCBvcmlnaW5hbFBhdGhuYW1lLCBwYXRjaEZldGNoLCAgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXBwLXJvdXRlLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&page=%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute.ts&appDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app%5Capp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!\n");
/***/ }),
/***/ "(rsc)/./app/api/admin/toggle-user-lock/route.ts":
/*!*************************************************!*\
!*** ./app/api/admin/toggle-user-lock/route.ts ***!
\*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ POST: () => (/* binding */ POST)\n/* harmony export */ });\n/* harmony import */ var next_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/server */ \"(rsc)/./node_modules/next/dist/api/server.js\");\n/* harmony import */ var _lib_database__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/database */ \"(rsc)/./lib/database.ts\");\n\n\nasync function POST(request) {\n try {\n const { adminId, targetUserId, lockStatus } = await request.json();\n if (!adminId || !targetUserId || typeof lockStatus !== \"boolean\") {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"נתונים חסרים\"\n }, {\n status: 400\n });\n }\n // Get admin data\n const adminData = await (0,_lib_database__WEBPACK_IMPORTED_MODULE_1__.safeQuery)(\"SELECT role, field, department, team FROM users WHERE national_id = ?\", [\n adminId\n ]);\n if (adminData.length === 0) {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"מנהל לא נמצא\"\n }, {\n status: 404\n });\n }\n const admin = adminData[0];\n // Get target user data\n const targetData = await (0,_lib_database__WEBPACK_IMPORTED_MODULE_1__.safeQuery)(\"SELECT field, department, team, name, lock_status FROM users WHERE national_id = ?\", [\n targetUserId\n ]);\n if (targetData.length === 0) {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"משתמש לא נמצא\"\n }, {\n status: 404\n });\n }\n const target = targetData[0];\n // Check if admin can manage this user based on hierarchy\n let canManage = false;\n if (admin.role === \"global_admin\") {\n canManage = true;\n } else if (admin.role === \"field_admin\" && admin.field === target.field) {\n canManage = true;\n } else if (admin.role === \"department_admin\" && admin.department === target.department) {\n canManage = true;\n } else if (admin.role === \"team_admin\" && admin.team === target.team) {\n canManage = true;\n }\n if (!canManage) {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"אין הרשאה לנעול/לבטל נעילה של משתמש זה\"\n }, {\n status: 403\n });\n }\n // Update user lock status\n await (0,_lib_database__WEBPACK_IMPORTED_MODULE_1__.safeQuery)(\"UPDATE users SET lock_status = ? WHERE national_id = ?\", [\n lockStatus,\n targetUserId\n ]);\n // Log the action\n const actionType = lockStatus ? \"lock_user\" : \"unlock_user\";\n await (0,_lib_database__WEBPACK_IMPORTED_MODULE_1__.safeQuery)(\"INSERT INTO admin_actions (admin_id, action_type, target_user_id) VALUES (?, ?, ?)\", [\n adminId,\n actionType,\n targetUserId\n ]);\n const statusText = lockStatus ? \"נעול\" : \"לא נעול\";\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n success: true,\n message: `סטטוס נעילה של ${target.name} שונה ל: ${statusText}`,\n lockStatus\n });\n } catch (error) {\n console.error(\"Toggle user lock error:\", error);\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"שגיאה בשינוי סטטוס נעילה\"\n }, {\n status: 500\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9hcHAvYXBpL2FkbWluL3RvZ2dsZS11c2VyLWxvY2svcm91dGUudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQTREO0FBQ2xCO0FBRW5DLGVBQWVFLEtBQUtDLE9BQW9CO0lBQzdDLElBQUk7UUFDRixNQUFNLEVBQUVDLE9BQU8sRUFBRUMsWUFBWSxFQUFFQyxVQUFVLEVBQUUsR0FBRyxNQUFNSCxRQUFRSSxJQUFJO1FBRWhFLElBQUksQ0FBQ0gsV0FBVyxDQUFDQyxnQkFBZ0IsT0FBT0MsZUFBZSxXQUFXO1lBQ2hFLE9BQU9OLHFEQUFZQSxDQUFDTyxJQUFJLENBQUM7Z0JBQUVDLE9BQU87WUFBZSxHQUFHO2dCQUFFQyxRQUFRO1lBQUk7UUFDcEU7UUFFQSxpQkFBaUI7UUFDakIsTUFBTUMsWUFBYSxNQUFNVCx3REFBU0EsQ0FBQyx5RUFBeUU7WUFDMUdHO1NBQ0Q7UUFFRCxJQUFJTSxVQUFVQyxNQUFNLEtBQUssR0FBRztZQUMxQixPQUFPWCxxREFBWUEsQ0FBQ08sSUFBSSxDQUFDO2dCQUFFQyxPQUFPO1lBQWUsR0FBRztnQkFBRUMsUUFBUTtZQUFJO1FBQ3BFO1FBRUEsTUFBTUcsUUFBUUYsU0FBUyxDQUFDLEVBQUU7UUFFMUIsdUJBQXVCO1FBQ3ZCLE1BQU1HLGFBQWMsTUFBTVosd0RBQVNBLENBQ2pDLHNGQUNBO1lBQUNJO1NBQWE7UUFHaEIsSUFBSVEsV0FBV0YsTUFBTSxLQUFLLEdBQUc7WUFDM0IsT0FBT1gscURBQVlBLENBQUNPLElBQUksQ0FBQztnQkFBRUMsT0FBTztZQUFnQixHQUFHO2dCQUFFQyxRQUFRO1lBQUk7UUFDckU7UUFFQSxNQUFNSyxTQUFTRCxVQUFVLENBQUMsRUFBRTtRQUU1Qix5REFBeUQ7UUFDekQsSUFBSUUsWUFBWTtRQUVoQixJQUFJSCxNQUFNSSxJQUFJLEtBQUssZ0JBQWdCO1lBQ2pDRCxZQUFZO1FBQ2QsT0FBTyxJQUFJSCxNQUFNSSxJQUFJLEtBQUssaUJBQWlCSixNQUFNSyxLQUFLLEtBQUtILE9BQU9HLEtBQUssRUFBRTtZQUN2RUYsWUFBWTtRQUNkLE9BQU8sSUFBSUgsTUFBTUksSUFBSSxLQUFLLHNCQUFzQkosTUFBTU0sVUFBVSxLQUFLSixPQUFPSSxVQUFVLEVBQUU7WUFDdEZILFlBQVk7UUFDZCxPQUFPLElBQUlILE1BQU1JLElBQUksS0FBSyxnQkFBZ0JKLE1BQU1PLElBQUksS0FBS0wsT0FBT0ssSUFBSSxFQUFFO1lBQ3BFSixZQUFZO1FBQ2Q7UUFFQSxJQUFJLENBQUNBLFdBQVc7WUFDZCxPQUFPZixxREFBWUEsQ0FBQ08sSUFBSSxDQUFDO2dCQUFFQyxPQUFPO1lBQXlDLEdBQUc7Z0JBQUVDLFFBQVE7WUFBSTtRQUM5RjtRQUVBLDBCQUEwQjtRQUMxQixNQUFNUix3REFBU0EsQ0FBQywwREFBMEQ7WUFBQ0s7WUFBWUQ7U0FBYTtRQUVwRyxpQkFBaUI7UUFDakIsTUFBTWUsYUFBYWQsYUFBYSxjQUFjO1FBQzlDLE1BQU1MLHdEQUFTQSxDQUFDLHNGQUFzRjtZQUNwR0c7WUFDQWdCO1lBQ0FmO1NBQ0Q7UUFFRCxNQUFNZ0IsYUFBYWYsYUFBYSxTQUFTO1FBRXpDLE9BQU9OLHFEQUFZQSxDQUFDTyxJQUFJLENBQUM7WUFDdkJlLFNBQVM7WUFDVEMsU0FBUyxDQUFDLGVBQWUsRUFBRVQsT0FBT1UsSUFBSSxDQUFDLFNBQVMsRUFBRUgsV0FBVyxDQUFDO1lBQzlEZjtRQUNGO0lBQ0YsRUFBRSxPQUFPRSxPQUFPO1FBQ2RpQixRQUFRakIsS0FBSyxDQUFDLDJCQUEyQkE7UUFDekMsT0FBT1IscURBQVlBLENBQUNPLElBQUksQ0FBQztZQUFFQyxPQUFPO1FBQTJCLEdBQUc7WUFBRUMsUUFBUTtRQUFJO0lBQ2hGO0FBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tYW1hZC1hcHAvLi9hcHAvYXBpL2FkbWluL3RvZ2dsZS11c2VyLWxvY2svcm91dGUudHM/OTI2MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIE5leHRSZXF1ZXN0LCBOZXh0UmVzcG9uc2UgfSBmcm9tIFwibmV4dC9zZXJ2ZXJcIlxyXG5pbXBvcnQgeyBzYWZlUXVlcnkgfSBmcm9tIFwiQC9saWIvZGF0YWJhc2VcIlxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIFBPU1QocmVxdWVzdDogTmV4dFJlcXVlc3QpIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgeyBhZG1pbklkLCB0YXJnZXRVc2VySWQsIGxvY2tTdGF0dXMgfSA9IGF3YWl0IHJlcXVlc3QuanNvbigpXHJcblxyXG4gICAgaWYgKCFhZG1pbklkIHx8ICF0YXJnZXRVc2VySWQgfHwgdHlwZW9mIGxvY2tTdGF0dXMgIT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IGVycm9yOiBcIteg16rXldeg15nXnSDXl9eh16jXmdedXCIgfSwgeyBzdGF0dXM6IDQwMCB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCBhZG1pbiBkYXRhXHJcbiAgICBjb25zdCBhZG1pbkRhdGEgPSAoYXdhaXQgc2FmZVF1ZXJ5KFwiU0VMRUNUIHJvbGUsIGZpZWxkLCBkZXBhcnRtZW50LCB0ZWFtIEZST00gdXNlcnMgV0hFUkUgbmF0aW9uYWxfaWQgPSA/XCIsIFtcclxuICAgICAgYWRtaW5JZCxcclxuICAgIF0pKSBhcyBhbnlbXVxyXG5cclxuICAgIGlmIChhZG1pbkRhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IGVycm9yOiBcItee16DXlNecINec15Ag16DXntem15BcIiB9LCB7IHN0YXR1czogNDA0IH0pXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWRtaW4gPSBhZG1pbkRhdGFbMF1cclxuXHJcbiAgICAvLyBHZXQgdGFyZ2V0IHVzZXIgZGF0YVxyXG4gICAgY29uc3QgdGFyZ2V0RGF0YSA9IChhd2FpdCBzYWZlUXVlcnkoXHJcbiAgICAgIFwiU0VMRUNUIGZpZWxkLCBkZXBhcnRtZW50LCB0ZWFtLCBuYW1lLCBsb2NrX3N0YXR1cyBGUk9NIHVzZXJzIFdIRVJFIG5hdGlvbmFsX2lkID0gP1wiLFxyXG4gICAgICBbdGFyZ2V0VXNlcklkXSxcclxuICAgICkpIGFzIGFueVtdXHJcblxyXG4gICAgaWYgKHRhcmdldERhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IGVycm9yOiBcItee16nXqtee16kg15zXkCDXoNee16bXkFwiIH0sIHsgc3RhdHVzOiA0MDQgfSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXREYXRhWzBdXHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgYWRtaW4gY2FuIG1hbmFnZSB0aGlzIHVzZXIgYmFzZWQgb24gaGllcmFyY2h5XHJcbiAgICBsZXQgY2FuTWFuYWdlID0gZmFsc2VcclxuXHJcbiAgICBpZiAoYWRtaW4ucm9sZSA9PT0gXCJnbG9iYWxfYWRtaW5cIikge1xyXG4gICAgICBjYW5NYW5hZ2UgPSB0cnVlXHJcbiAgICB9IGVsc2UgaWYgKGFkbWluLnJvbGUgPT09IFwiZmllbGRfYWRtaW5cIiAmJiBhZG1pbi5maWVsZCA9PT0gdGFyZ2V0LmZpZWxkKSB7XHJcbiAgICAgIGNhbk1hbmFnZSA9IHRydWVcclxuICAgIH0gZWxzZSBpZiAoYWRtaW4ucm9sZSA9PT0gXCJkZXBhcnRtZW50X2FkbWluXCIgJiYgYWRtaW4uZGVwYXJ0bWVudCA9PT0gdGFyZ2V0LmRlcGFydG1lbnQpIHtcclxuICAgICAgY2FuTWFuYWdlID0gdHJ1ZVxyXG4gICAgfSBlbHNlIGlmIChhZG1pbi5yb2xlID09PSBcInRlYW1fYWRtaW5cIiAmJiBhZG1pbi50ZWFtID09PSB0YXJnZXQudGVhbSkge1xyXG4gICAgICBjYW5NYW5hZ2UgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjYW5NYW5hZ2UpIHtcclxuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHsgZXJyb3I6IFwi15DXmdefINeU16jXqdeQ15Qg15zXoNei15XXnC/XnNeR15jXnCDXoNei15nXnNeUINep15wg157Xqdeq157XqSDXlteUXCIgfSwgeyBzdGF0dXM6IDQwMyB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSB1c2VyIGxvY2sgc3RhdHVzXHJcbiAgICBhd2FpdCBzYWZlUXVlcnkoXCJVUERBVEUgdXNlcnMgU0VUIGxvY2tfc3RhdHVzID0gPyBXSEVSRSBuYXRpb25hbF9pZCA9ID9cIiwgW2xvY2tTdGF0dXMsIHRhcmdldFVzZXJJZF0pXHJcblxyXG4gICAgLy8gTG9nIHRoZSBhY3Rpb25cclxuICAgIGNvbnN0IGFjdGlvblR5cGUgPSBsb2NrU3RhdHVzID8gXCJsb2NrX3VzZXJcIiA6IFwidW5sb2NrX3VzZXJcIlxyXG4gICAgYXdhaXQgc2FmZVF1ZXJ5KFwiSU5TRVJUIElOVE8gYWRtaW5fYWN0aW9ucyAoYWRtaW5faWQsIGFjdGlvbl90eXBlLCB0YXJnZXRfdXNlcl9pZCkgVkFMVUVTICg/LCA/LCA/KVwiLCBbXHJcbiAgICAgIGFkbWluSWQsXHJcbiAgICAgIGFjdGlvblR5cGUsXHJcbiAgICAgIHRhcmdldFVzZXJJZCxcclxuICAgIF0pXHJcblxyXG4gICAgY29uc3Qgc3RhdHVzVGV4dCA9IGxvY2tTdGF0dXMgPyBcIteg16LXldecXCIgOiBcItec15Ag16DXoteV15xcIlxyXG5cclxuICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7XHJcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgIG1lc3NhZ2U6IGDXodeY15jXldehINeg16LXmdec15Qg16nXnCAke3RhcmdldC5uYW1lfSDXqdeV16DXlCDXnDogJHtzdGF0dXNUZXh0fWAsXHJcbiAgICAgIGxvY2tTdGF0dXMsXHJcbiAgICB9KVxyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKFwiVG9nZ2xlIHVzZXIgbG9jayBlcnJvcjpcIiwgZXJyb3IpXHJcbiAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oeyBlcnJvcjogXCLXqdeS15nXkNeUINeR16nXmdeg15XXmSDXodeY15jXldehINeg16LXmdec15RcIiB9LCB7IHN0YXR1czogNTAwIH0pXHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJOZXh0UmVzcG9uc2UiLCJzYWZlUXVlcnkiLCJQT1NUIiwicmVxdWVzdCIsImFkbWluSWQiLCJ0YXJnZXRVc2VySWQiLCJsb2NrU3RhdHVzIiwianNvbiIsImVycm9yIiwic3RhdHVzIiwiYWRtaW5EYXRhIiwibGVuZ3RoIiwiYWRtaW4iLCJ0YXJnZXREYXRhIiwidGFyZ2V0IiwiY2FuTWFuYWdlIiwicm9sZSIsImZpZWxkIiwiZGVwYXJ0bWVudCIsInRlYW0iLCJhY3Rpb25UeXBlIiwic3RhdHVzVGV4dCIsInN1Y2Nlc3MiLCJtZXNzYWdlIiwibmFtZSIsImNvbnNvbGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./app/api/admin/toggle-user-lock/route.ts\n");
/***/ }),
/***/ "(rsc)/./lib/database.ts":
/*!*************************!*\
!*** ./lib/database.ts ***!
\*************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ closePool: () => (/* binding */ closePool),\n/* harmony export */ createPool: () => (/* binding */ createPool),\n/* harmony export */ executeQuery: () => (/* binding */ executeQuery),\n/* harmony export */ executeTransaction: () => (/* binding */ executeTransaction),\n/* harmony export */ getConnection: () => (/* binding */ getConnection),\n/* harmony export */ getPoolStats: () => (/* binding */ getPoolStats),\n/* harmony export */ healthCheck: () => (/* binding */ healthCheck),\n/* harmony export */ safeQuery: () => (/* binding */ safeQuery),\n/* harmony export */ testConnection: () => (/* binding */ testConnection)\n/* harmony export */ });\n/* harmony import */ var mysql2_promise__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mysql2/promise */ \"mysql2/promise\");\n/* harmony import */ var mysql2_promise__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(mysql2_promise__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_json__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../config.json */ \"(rsc)/./config.json\");\n\n\n// Connection pool configuration\nconst poolConfig = {\n host: _config_json__WEBPACK_IMPORTED_MODULE_1__.database.host,\n user: _config_json__WEBPACK_IMPORTED_MODULE_1__.database.user,\n password: _config_json__WEBPACK_IMPORTED_MODULE_1__.database.password,\n database: _config_json__WEBPACK_IMPORTED_MODULE_1__.database.database,\n charset: \"utf8mb4\",\n connectionLimit: 5,\n acquireTimeout: 30000,\n timeout: 30000,\n reconnect: true,\n idleTimeout: 180000,\n maxIdle: 2,\n enableKeepAlive: true,\n keepAliveInitialDelay: 0,\n // Add these to prevent excessive connections\n queueLimit: 0,\n dateStrings: false,\n debug: false\n};\nlet pool = null;\n// Create connection pool\nfunction createPool() {\n if (!pool) {\n try {\n pool = mysql2_promise__WEBPACK_IMPORTED_MODULE_0___default().createPool(poolConfig);\n console.log(\"Database connection pool created successfully\");\n // Handle pool events\n pool.on(\"connection\", (connection)=>{\n console.log(`New database connection established as id ${connection.threadId}`);\n });\n pool.on(\"error\", (err)=>{\n console.error(\"Database pool error:\", err);\n // Don't recreate pool automatically - let it handle reconnections\n if (err.code === \"PROTOCOL_CONNECTION_LOST\") {\n console.log(\"Connection lost, pool will handle reconnection automatically\");\n }\n });\n pool.on(\"acquire\", (connection)=>{\n console.log(`Connection ${connection.threadId} acquired from pool`);\n });\n pool.on(\"release\", (connection)=>{\n console.log(`Connection ${connection.threadId} released back to pool`);\n });\n } catch (error) {\n console.error(\"Failed to create database pool:\", error);\n throw error;\n }\n }\n return pool;\n}\n// Get connection from pool\nasync function getConnection() {\n try {\n const connectionPool = createPool();\n const connection = await connectionPool.getConnection();\n // Don't set session timeouts - let pool handle this\n return connection;\n } catch (error) {\n console.error(\"Failed to get database connection:\", error);\n throw new Error(\"Database connection failed\");\n }\n}\n// Execute query with automatic connection management\nasync function executeQuery(query, params = []) {\n let connection = null;\n try {\n connection = await getConnection();\n const [results] = await connection.execute(query, params);\n return results;\n } catch (error) {\n console.error(\"Query execution failed:\", error);\n console.error(\"Query:\", query);\n console.error(\"Params:\", params);\n throw error;\n } finally{\n // Always release connection back to pool\n if (connection) {\n connection.release();\n }\n }\n}\n// Safe query execution with automatic parameter binding and connection management\nasync function safeQuery(query, params = []) {\n try {\n return await executeQuery(query, params);\n } catch (error) {\n console.error(\"Database query error:\", error);\n throw new Error(\"Database operation failed\");\n }\n}\n// Execute transaction with automatic connection management\nasync function executeTransaction(queries) {\n let connection = null;\n try {\n connection = await getConnection();\n // Start transaction\n await connection.beginTransaction();\n const results = [];\n // Execute all queries in transaction\n for (const { query, params = [] } of queries){\n const [result] = await connection.execute(query, params);\n results.push(result);\n }\n // Commit transaction\n await connection.commit();\n return results;\n } catch (error) {\n // Rollback transaction on error\n if (connection) {\n try {\n await connection.rollback();\n } catch (rollbackError) {\n console.error(\"Transaction rollback failed:\", rollbackError);\n }\n }\n console.error(\"Transaction failed:\", error);\n throw error;\n } finally{\n // Always release connection back to pool\n if (connection) {\n connection.release();\n }\n }\n}\n// Test database connection and pool health\nasync function testConnection() {\n let connection = null;\n try {\n connection = await getConnection();\n await connection.ping();\n console.log(\"Database connection test successful\");\n return true;\n } catch (error) {\n console.error(\"Database connection test failed:\", error);\n return false;\n } finally{\n if (connection) {\n connection.release();\n }\n }\n}\n// Get pool statistics\nfunction getPoolStats() {\n if (!pool) {\n return null;\n }\n return {\n totalConnections: pool.pool._allConnections.length,\n freeConnections: pool.pool._freeConnections.length,\n acquiringConnections: pool.pool._acquiringConnections.length,\n connectionLimit: poolConfig.connectionLimit\n };\n}\n// Close all connections in pool (for graceful shutdown)\nasync function closePool() {\n if (pool) {\n try {\n await pool.end();\n pool = null;\n console.log(\"Database pool closed successfully\");\n } catch (error) {\n console.error(\"Error closing database pool:\", error);\n }\n }\n}\n// Health check for monitoring\nasync function healthCheck() {\n let connection = null;\n try {\n const startTime = Date.now();\n connection = await getConnection();\n // Test basic query\n const [result] = await connection.execute(\"SELECT 1 as health_check\");\n const responseTime = Date.now() - startTime;\n const stats = getPoolStats();\n return {\n status: \"healthy\",\n responseTime,\n poolStats: stats,\n timestamp: new Date().toISOString()\n };\n } catch (error) {\n return {\n status: \"unhealthy\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n timestamp: new Date().toISOString()\n };\n } finally{\n if (connection) {\n connection.release();\n }\n }\n}\n// Initialize pool on module load\n// createPool()\n// Graceful shutdown handler\nprocess.on(\"SIGINT\", async ()=>{\n console.log(\"Received SIGINT, closing database pool...\");\n await closePool();\n process.exit(0);\n});\nprocess.on(\"SIGTERM\", async ()=>{\n console.log(\"Received SIGTERM, closing database pool...\");\n await closePool();\n process.exit(0);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDNUJpQyxRQUFRL0MsRUFBRSxDQUFDLFVBQVU7SUFDbkJGLFFBQVFDLEdBQUcsQ0FBQztJQUNaLE1BQU1tQztJQUNOYSxRQUFRQyxJQUFJLENBQUM7QUFDZjtBQUVBRCxRQUFRL0MsRUFBRSxDQUFDLFdBQVc7SUFDcEJGLFFBQVFDLEdBQUcsQ0FBQztJQUNaLE1BQU1tQztJQUNOYSxRQUFRQyxJQUFJLENBQUM7QUFDZiIsInNvdXJjZXMiOlsid2VicGFjazovL21hbWFkLWFwcC8uL2xpYi9kYXRhYmFzZS50cz80ZDQ5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBteXNxbCBmcm9tIFwibXlzcWwyL3Byb21pc2VcIlxyXG5pbXBvcnQgY29uZmlnIGZyb20gXCIuLi9jb25maWcuanNvblwiXHJcblxyXG4vLyBDb25uZWN0aW9uIHBvb2wgY29uZmlndXJhdGlvblxyXG5jb25zdCBwb29sQ29uZmlnID0ge1xyXG4gIGhvc3Q6IGNvbmZpZy5kYXRhYmFzZS5ob3N0LFxyXG4gIHVzZXI6IGNvbmZpZy5kYXRhYmFzZS51c2VyLFxyXG4gIHBhc3N3b3JkOiBjb25maWcuZGF0YWJhc2UucGFzc3dvcmQsXHJcbiAgZGF0YWJhc2U6IGNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSxcclxuICBjaGFyc2V0OiBcInV0ZjhtYjRcIixcclxuICBjb25uZWN0aW9uTGltaXQ6IDUsIC8vIFJlZHVjZWQgZnJvbSAxMFxyXG4gIGFjcXVpcmVUaW1lb3V0OiAzMDAwMCwgLy8gUmVkdWNlZCBmcm9tIDYwIHNlY29uZHNcclxuICB0aW1lb3V0OiAzMDAwMCwgLy8gUmVkdWNlZCBmcm9tIDYwIHNlY29uZHNcclxuICByZWNvbm5lY3Q6IHRydWUsXHJcbiAgaWRsZVRpbWVvdXQ6IDE4MDAwMCwgLy8gUmVkdWNlZCB0byAzIG1pbnV0ZXNcclxuICBtYXhJZGxlOiAyLCAvLyBSZWR1Y2VkIGZyb20gNVxyXG4gIGVuYWJsZUtlZXBBbGl2ZTogdHJ1ZSxcclxuICBrZWVwQWxpdmVJbml0aWFsRGVsYXk6IDAsXHJcbiAgLy8gQWRkIHRoZXNlIHRvIHByZXZlbnQgZXhjZXNzaXZlIGNvbm5lY3Rpb25zXHJcbiAgcXVldWVMaW1pdDogMCxcclxuICBkYXRlU3RyaW5nczogZmFsc2UsXHJcbiAgZGVidWc6IGZhbHNlLFxyXG59XHJcblxyXG5sZXQgcG9vbDogbXlzcWwuUG9vbCB8IG51bGwgPSBudWxsXHJcblxyXG4vLyBDcmVhdGUgY29ubmVjdGlvbiBwb29sXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQb29sKCkge1xyXG4gIGlmICghcG9vbCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcG9vbCA9IG15c3FsLmNyZWF0ZVBvb2wocG9vbENvbmZpZylcclxuICAgICAgY29uc29sZS5sb2coXCJEYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wgY3JlYXRlZCBzdWNjZXNzZnVsbHlcIilcclxuXHJcbiAgICAgIC8vIEhhbmRsZSBwb29sIGV2ZW50c1xyXG4gICAgICBwb29sLm9uKFwiY29ubmVjdGlvblwiLCAoY29ubmVjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBOZXcgZGF0YWJhc2UgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCBhcyBpZCAke2Nvbm5lY3Rpb24udGhyZWFkSWR9YClcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHBvb2wub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkRhdGFiYXNlIHBvb2wgZXJyb3I6XCIsIGVycilcclxuICAgICAgICAvLyBEb24ndCByZWNyZWF0ZSBwb29sIGF1dG9tYXRpY2FsbHkgLSBsZXQgaXQgaGFuZGxlIHJlY29ubmVjdGlvbnNcclxuICAgICAgICBpZiAoZXJyLmNvZGUgPT09IFwiUFJPVE9DT0xfQ09OTkVDVElPTl9MT1NUXCIpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ29ubmVjdGlvbiBsb3N0LCBwb29sIHdpbGwgaGFuZGxlIHJlY29ubmVjdGlvbiBhdXRvbWF0aWNhbGx5XCIpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgcG9vbC5vbihcImFjcXVpcmVcIiwgKGNvbm5lY3Rpb24pID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgQ29ubmVjdGlvbiAke2Nvbm5lY3Rpb24udGhyZWFkSWR9IGFjcXVpcmVkIGZyb20gcG9vbGApXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBwb29sLm9uKFwicmVsZWFzZVwiLCAoY29ubmVjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBDb25uZWN0aW9uICR7Y29ubmVjdGlvbi50aHJlYWRJZH0gcmVsZWFzZWQgYmFjayB0byBwb29sYClcclxuICAgICAgfSlcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY3JlYXRlIGRhdGFiYXNlIHBvb2w6XCIsIGVycm9yKVxyXG4gICAgICB0aHJvdyBlcnJvclxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcG9vbFxyXG59XHJcblxyXG4vLyBHZXQgY29ubmVjdGlvbiBmcm9tIHBvb2xcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbm5lY3Rpb24oKTogUHJvbWlzZTxteXNxbC5Qb29sQ29ubmVjdGlvbj4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBjb25uZWN0aW9uUG9vbCA9IGNyZWF0ZVBvb2woKVxyXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IGNvbm5lY3Rpb25Qb29sLmdldENvbm5lY3Rpb24oKVxyXG5cclxuICAgIC8vIERvbid0IHNldCBzZXNzaW9uIHRpbWVvdXRzIC0gbGV0IHBvb2wgaGFuZGxlIHRoaXNcclxuICAgIHJldHVybiBjb25uZWN0aW9uXHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZ2V0IGRhdGFiYXNlIGNvbm5lY3Rpb246XCIsIGVycm9yKVxyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJhc2UgY29ubmVjdGlvbiBmYWlsZWRcIilcclxuICB9XHJcbn1cclxuXHJcbi8vIEV4ZWN1dGUgcXVlcnkgd2l0aCBhdXRvbWF0aWMgY29ubmVjdGlvbiBtYW5hZ2VtZW50XHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlUXVlcnkocXVlcnk6IHN0cmluZywgcGFyYW1zOiBhbnlbXSA9IFtdKSB7XHJcbiAgbGV0IGNvbm5lY3Rpb246IG15c3FsLlBvb2xDb25uZWN0aW9uIHwgbnVsbCA9IG51bGxcclxuXHJcbiAgdHJ5IHtcclxuICAgIGNvbm5lY3Rpb24gPSBhd2FpdCBnZXRDb25uZWN0aW9uKClcclxuICAgIGNvbnN0IFtyZXN1bHRzXSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlY3V0ZShxdWVyeSwgcGFyYW1zKVxyXG4gICAgcmV0dXJuIHJlc3VsdHNcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5lcnJvcihcIlF1ZXJ5IGV4ZWN1dGlvbiBmYWlsZWQ6XCIsIGVycm9yKVxyXG4gICAgY29uc29sZS5lcnJvcihcIlF1ZXJ5OlwiLCBxdWVyeSlcclxuICAgIGNvbnNvbGUuZXJyb3IoXCJQYXJhbXM6XCIsIHBhcmFtcylcclxuICAgIHRocm93IGVycm9yXHJcbiAgfSBmaW5hbGx5IHtcclxuICAgIC8vIEFsd2F5cyByZWxlYXNlIGNvbm5lY3Rpb24gYmFjayB0byBwb29sXHJcbiAgICBpZiAoY29ubmVjdGlvbikge1xyXG4gICAgICBjb25uZWN0aW9uLnJlbGVhc2UoKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gU2FmZSBxdWVyeSBleGVjdXRpb24gd2l0aCBhdXRvbWF0aWMgcGFyYW1ldGVyIGJpbmRpbmcgYW5kIGNvbm5lY3Rpb24gbWFuYWdlbWVudFxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FmZVF1ZXJ5KHF1ZXJ5OiBzdHJpbmcsIHBhcmFtczogYW55W10gPSBbXSkge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZVF1ZXJ5KHF1ZXJ5LCBwYXJhbXMpXHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoXCJEYXRhYmFzZSBxdWVyeSBlcnJvcjpcIiwgZXJyb3IpXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYmFzZSBvcGVyYXRpb24gZmFpbGVkXCIpXHJcbiAgfVxyXG59XHJcblxyXG4vLyBFeGVjdXRlIHRyYW5zYWN0aW9uIHdpdGggYXV0b21hdGljIGNvbm5lY3Rpb24gbWFuYWdlbWVudFxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVRyYW5zYWN0aW9uKHF1ZXJpZXM6IEFycmF5PHsgcXVlcnk6IHN0cmluZzsgcGFyYW1zPzogYW55W10gfT4pIHtcclxuICBsZXQgY29ubmVjdGlvbjogbXlzcWwuUG9vbENvbm5lY3Rpb24gfCBudWxsID0gbnVsbFxyXG5cclxuICB0cnkge1xyXG4gICAgY29ubmVjdGlvbiA9IGF3YWl0IGdldENvbm5lY3Rpb24oKVxyXG5cclxuICAgIC8vIFN0YXJ0IHRyYW5zYWN0aW9uXHJcbiAgICBhd2FpdCBjb25uZWN0aW9uLmJlZ2luVHJhbnNhY3Rpb24oKVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXVxyXG5cclxuICAgIC8vIEV4ZWN1dGUgYWxsIHF1ZXJpZXMgaW4gdHJhbnNhY3Rpb25cclxuICAgIGZvciAoY29uc3QgeyBxdWVyeSwgcGFyYW1zID0gW10gfSBvZiBxdWVyaWVzKSB7XHJcbiAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgY29ubmVjdGlvbi5leGVjdXRlKHF1ZXJ5LCBwYXJhbXMpXHJcbiAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29tbWl0IHRyYW5zYWN0aW9uXHJcbiAgICBhd2FpdCBjb25uZWN0aW9uLmNvbW1pdCgpXHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHNcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgLy8gUm9sbGJhY2sgdHJhbnNhY3Rpb24gb24gZXJyb3JcclxuICAgIGlmIChjb25uZWN0aW9uKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5yb2xsYmFjaygpXHJcbiAgICAgIH0gY2F0Y2ggKHJvbGxiYWNrRXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiVHJhbnNhY3Rpb24gcm9sbGJhY2sgZmFpbGVkOlwiLCByb2xsYmFja0Vycm9yKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5lcnJvcihcIlRyYW5zYWN0aW9uIGZhaWxlZDpcIiwgZXJyb3IpXHJcbiAgICB0aHJvdyBlcnJvclxyXG4gIH0gZmluYWxseSB7XHJcbiAgICAvLyBBbHdheXMgcmVsZWFzZSBjb25uZWN0aW9uIGJhY2sgdG8gcG9vbFxyXG4gICAgaWYgKGNvbm5lY3Rpb24pIHtcclxuICAgICAgY29ubmVjdGlvbi5yZWxlYXNlKClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIFRlc3QgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgcG9vbCBoZWFsdGhcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RDb25uZWN0aW9uKCkge1xyXG4gIGxldCBjb25uZWN0aW9uOiBteXNxbC5Qb29sQ29ubmVjdGlvbiB8IG51bGwgPSBudWxsXHJcblxyXG4gIHRyeSB7XHJcbiAgICBjb25uZWN0aW9uID0gYXdhaXQgZ2V0Q29ubmVjdGlvbigpXHJcbiAgICBhd2FpdCBjb25uZWN0aW9uLnBpbmcoKVxyXG4gICAgY29uc29sZS5sb2coXCJEYXRhYmFzZSBjb25uZWN0aW9uIHRlc3Qgc3VjY2Vzc2Z1bFwiKVxyXG4gICAgcmV0dXJuIHRydWVcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5lcnJvcihcIkRhdGFiYXNlIGNvbm5lY3Rpb24gdGVzdCBmYWlsZWQ6XCIsIGVycm9yKVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfSBmaW5hbGx5IHtcclxuICAgIGlmIChjb25uZWN0aW9uKSB7XHJcbiAgICAgIGNvbm5lY3Rpb24ucmVsZWFzZSgpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBHZXQgcG9vbCBzdGF0aXN0aWNzXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQb29sU3RhdHMoKSB7XHJcbiAgaWYgKCFwb29sKSB7XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHRvdGFsQ29ubmVjdGlvbnM6IHBvb2wucG9vbC5fYWxsQ29ubmVjdGlvbnMubGVuZ3RoLFxyXG4gICAgZnJlZUNvbm5lY3Rpb25zOiBwb29sLnBvb2wuX2ZyZWVDb25uZWN0aW9ucy5sZW5ndGgsXHJcbiAgICBhY3F1aXJpbmdDb25uZWN0aW9uczogcG9vbC5wb29sLl9hY3F1aXJpbmdDb25uZWN0aW9ucy5sZW5ndGgsXHJcbiAgICBjb25uZWN0aW9uTGltaXQ6IHBvb2xDb25maWcuY29ubmVjdGlvbkxpbWl0LFxyXG4gIH1cclxufVxyXG5cclxuLy8gQ2xvc2UgYWxsIGNvbm5lY3Rpb25zIGluIHBvb2wgKGZvciBncmFjZWZ1bCBzaHV0ZG93bilcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlUG9vbCgpIHtcclxuICBpZiAocG9vbCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgcG9vbC5lbmQoKVxyXG4gICAgICBwb29sID0gbnVsbFxyXG4gICAgICBjb25zb2xlLmxvZyhcIkRhdGFiYXNlIHBvb2wgY2xvc2VkIHN1Y2Nlc3NmdWxseVwiKVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNsb3NpbmcgZGF0YWJhc2UgcG9vbDpcIiwgZXJyb3IpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBIZWFsdGggY2hlY2sgZm9yIG1vbml0b3JpbmdcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhlYWx0aENoZWNrKCkge1xyXG4gIGxldCBjb25uZWN0aW9uOiBteXNxbC5Qb29sQ29ubmVjdGlvbiB8IG51bGwgPSBudWxsXHJcblxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXHJcbiAgICBjb25uZWN0aW9uID0gYXdhaXQgZ2V0Q29ubmVjdGlvbigpXHJcblxyXG4gICAgLy8gVGVzdCBiYXNpYyBxdWVyeVxyXG4gICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWN1dGUoXCJTRUxFQ1QgMSBhcyBoZWFsdGhfY2hlY2tcIilcclxuICAgIGNvbnN0IHJlc3BvbnNlVGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWVcclxuXHJcbiAgICBjb25zdCBzdGF0cyA9IGdldFBvb2xTdGF0cygpXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RhdHVzOiBcImhlYWx0aHlcIixcclxuICAgICAgcmVzcG9uc2VUaW1lLFxyXG4gICAgICBwb29sU3RhdHM6IHN0YXRzLFxyXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcclxuICAgIH1cclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RhdHVzOiBcInVuaGVhbHRoeVwiLFxyXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIixcclxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXHJcbiAgICB9XHJcbiAgfSBmaW5hbGx5IHtcclxuICAgIGlmIChjb25uZWN0aW9uKSB7XHJcbiAgICAgIGNvbm5lY3Rpb24ucmVsZWFzZSgpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBJbml0aWFsaXplIHBvb2wgb24gbW9kdWxlIGxvYWRcclxuLy8gY3JlYXRlUG9vbCgpXHJcblxyXG4vLyBHcmFjZWZ1bCBzaHV0ZG93biBoYW5kbGVyXHJcbnByb2Nlc3Mub24oXCJTSUdJTlRcIiwgYXN5bmMgKCkgPT4ge1xyXG4gIGNvbnNvbGUubG9nKFwiUmVjZWl2ZWQgU0lHSU5ULCBjbG9zaW5nIGRhdGFiYXNlIHBvb2wuLi5cIilcclxuICBhd2FpdCBjbG9zZVBvb2woKVxyXG4gIHByb2Nlc3MuZXhpdCgwKVxyXG59KVxyXG5cclxucHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgYXN5bmMgKCkgPT4ge1xyXG4gIGNvbnNvbGUubG9nKFwiUmVjZWl2ZWQgU0lHVEVSTSwgY2xvc2luZyBkYXRhYmFzZSBwb29sLi4uXCIpXHJcbiAgYXdhaXQgY2xvc2VQb29sKClcclxuICBwcm9jZXNzLmV4aXQoMClcclxufSlcclxuIl0sIm5hbWVzIjpbIm15c3FsIiwiY29uZmlnIiwicG9vbENvbmZpZyIsImhvc3QiLCJkYXRhYmFzZSIsInVzZXIiLCJwYXNzd29yZCIsImNoYXJzZXQiLCJjb25uZWN0aW9uTGltaXQiLCJhY3F1aXJlVGltZW91dCIsInRpbWVvdXQiLCJyZWNvbm5lY3QiLCJpZGxlVGltZW91dCIsIm1heElkbGUiLCJlbmFibGVLZWVwQWxpdmUiLCJrZWVwQWxpdmVJbml0aWFsRGVsYXkiLCJxdWV1ZUxpbWl0IiwiZGF0ZVN0cmluZ3MiLCJkZWJ1ZyIsInBvb2wiLCJjcmVhdGVQb29sIiwiY29uc29sZSIsImxvZyIsIm9uIiwiY29ubmVjdGlvbiIsInRocmVhZElkIiwiZXJyIiwiZXJyb3IiLCJjb2RlIiwiZ2V0Q29ubmVjdGlvbiIsImNvbm5lY3Rpb25Qb29sIiwiRXJyb3IiLCJleGVjdXRlUXVlcnkiLCJxdWVyeSIsInBhcmFtcyIsInJlc3VsdHMiLCJleGVjdXRlIiwicmVsZWFzZSIsInNhZmVRdWVyeSIsImV4ZWN1dGVUcmFuc2FjdGlvbiIsInF1ZXJpZXMiLCJiZWdpblRyYW5zYWN0aW9uIiwicmVzdWx0IiwicHVzaCIsImNvbW1pdCIsInJvbGxiYWNrIiwicm9sbGJhY2tFcnJvciIsInRlc3RDb25uZWN0aW9uIiwicGluZyIsImdldFBvb2xTdGF0cyIsInRvdGFsQ29ubmVjdGlvbnMiLCJfYWxsQ29ubmVjdGlvbnMiLCJsZW5ndGgiLCJmcmVlQ29ubmVjdGlvbnMiLCJfZnJlZUNvbm5lY3Rpb25zIiwiYWNxdWlyaW5nQ29ubmVjdGlvbnMiLCJfYWNxdWlyaW5nQ29ubmVjdGlvbnMiLCJjbG9zZVBvb2wiLCJlbmQiLCJoZWFsdGhDaGVjayIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJyZXNwb25zZVRpbWUiLCJzdGF0cyIsInN0YXR1cyIsInBvb2xTdGF0cyIsInRpbWVzdGFtcCIsInRvSVNPU3RyaW5nIiwibWVzc2FnZSIsInByb2Nlc3MiLCJleGl0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./lib/database.ts\n");
/***/ }),
/***/ "(rsc)/./config.json":
/*!*********************!*\
!*** ./config.json ***!
\*********************/
/***/ ((module) => {
module.exports = /*#__PURE__*/JSON.parse('{"database":{"host":"10.0.5.1","user":"mamad-app","password":"K[7w1@N!Uvdu@ls!","database":"mamad-app"},"app":{"resetCooldownMinutes":1}}');
/***/ })
};
;
// load runtime
var __webpack_require__ = require("../../../../webpack-runtime.js");
__webpack_require__.C(exports);
var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
var __webpack_exports__ = __webpack_require__.X(0, ["vendor-chunks/next"], () => (__webpack_exec__("(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&page=%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute.ts&appDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app%5Capp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!")));
module.exports = __webpack_exports__;
})();