diff --git a/logs/backend/.31d2357fa2026a78b8cb786880c7c733460d7dbe-audit.json b/logs/backend/.31d2357fa2026a78b8cb786880c7c733460d7dbe-audit.json index c36243a8..7f265053 100644 --- a/logs/backend/.31d2357fa2026a78b8cb786880c7c733460d7dbe-audit.json +++ b/logs/backend/.31d2357fa2026a78b8cb786880c7c733460d7dbe-audit.json @@ -5,16 +5,6 @@ }, "auditLog": "logs/backend/.31d2357fa2026a78b8cb786880c7c733460d7dbe-audit.json", "files": [ - { - "date": 1737425815219, - "name": "logs/backend/combined-2025-01-21.log", - "hash": "b9cbc8d149568aaeb134725613e3cbf7e862bfe2acb7e6db56292abbf79e51a1" - }, - { - "date": 1737497241982, - "name": "logs/backend/combined-2025-01-22.log", - "hash": "574f8bfec27f059626b3174fe1911a733e84d38ac91be87f853456aae15b11a7" - }, { "date": 1737685849478, "name": "logs/backend/combined-2025-01-24.log", @@ -54,6 +44,16 @@ "date": 1738549408639, "name": "logs/backend/combined-2025-02-03.log", "hash": "f3f6220a7d5836dbdd5893576479feee4d13abcdfe1ee2e89375e18abea72ee5" + }, + { + "date": 1738635038169, + "name": "logs/backend/combined-2025-02-04.log", + "hash": "b197eb2d58bbab3566e05fdb2bcc52ee608c4fe6ffb54fc958060c8dc4ff305f" + }, + { + "date": 1738709515069, + "name": "logs/backend/combined-2025-02-05.log", + "hash": "04d27d0d5708dfb4655dbb708eb49f663c063c8f571ea5aa4da9e5bee9daa0f3" } ], "hashType": "sha256" diff --git a/logs/backend/.5d9a990e0c6075347623def466341a14f8ba4a12-audit.json b/logs/backend/.5d9a990e0c6075347623def466341a14f8ba4a12-audit.json index 6ca6c1de..2ffc44e0 100644 --- a/logs/backend/.5d9a990e0c6075347623def466341a14f8ba4a12-audit.json +++ b/logs/backend/.5d9a990e0c6075347623def466341a14f8ba4a12-audit.json @@ -5,16 +5,6 @@ }, "auditLog": "logs/backend/.5d9a990e0c6075347623def466341a14f8ba4a12-audit.json", "files": [ - { - "date": 1737425815214, - "name": "logs/backend/error-2025-01-21.log", - "hash": "d35389a53138894117f18cdd8210378c4ccfeea9921a52e42837102cad72c108" - }, - { - "date": 1737497241981, - "name": "logs/backend/error-2025-01-22.log", - "hash": "cb0bde065d94357687bece5102573a1876e3f00e1513ff9189e07f56cdadb82e" - }, { "date": 1737685849475, "name": "logs/backend/error-2025-01-24.log", @@ -54,6 +44,16 @@ "date": 1738549408637, "name": "logs/backend/error-2025-02-03.log", "hash": "ffd13b033c90d60d10c935a41fe42f3a4d065311cbf7beda1b76b9c5c985e90b" + }, + { + "date": 1738635038164, + "name": "logs/backend/error-2025-02-04.log", + "hash": "7490b9f6c36fa2500bafa66c4aa590053c50234150ad9ad86ad9400f0ba76a43" + }, + { + "date": 1738709515065, + "name": "logs/backend/error-2025-02-05.log", + "hash": "b76580b2a8b76ee8941e0d913ff1b38d66ad7bd45f154ed371c913ff898e5dfd" } ], "hashType": "sha256" diff --git a/logs/backend/combined-2025-01-21.log b/logs/backend/combined-2025-01-21.log deleted file mode 100644 index f8447571..00000000 --- a/logs/backend/combined-2025-01-21.log +++ /dev/null @@ -1,4 +0,0 @@ -{"level":"info","message":"Server status code: 201","timestamp":"2025-01-21T05:44:04.245Z"} -{"level":"info","message":"Success upload donasi_bukti_transfer: {\"id\":\"cm661vcrb002a7r93gbyi7y0g\",\"name\":\"56FE8EB6-BB7C-45BF-8879-A3EB7C59CA58.PNG\",\"path\":\"/cm0ur1yxw000056nsjlr6187p/2025/01/21/56FE8EB6-BB7C-45BF-8879-A3EB7C59CA58.PNG\",\"mime\":\"image/png\",\"ext\":\".PNG\",\"desc\":null,\"size\":2531618,\"active\":true,\"createdAt\":\"2025-01-21T05:44:03.670Z\",\"updatedAt\":\"2025-01-21T05:44:03.671Z\",\"userId\":\"cm0ur1yxw000056nsjlr6187p\",\"dirId\":\"cm0yk1pmh000h10njhi6m8b8t\"}","timestamp":"2025-01-21T05:44:04.331Z"} -{"level":"info","message":"Server status code: 201","timestamp":"2025-01-21T05:53:55.644Z"} -{"level":"info","message":"Success upload event_sponsor: {\"id\":\"cm66281fn001rc9dcdf7m74ji\",\"name\":\"56FE8EB6-BB7C-45BF-8879-A3EB7C59CA58-1.PNG\",\"path\":\"/cm0ur1yxw000056nsjlr6187p/2025/01/21/56FE8EB6-BB7C-45BF-8879-A3EB7C59CA58-1.PNG\",\"mime\":\"image/png\",\"ext\":\".PNG\",\"desc\":null,\"size\":2531618,\"active\":true,\"createdAt\":\"2025-01-21T05:53:55.522Z\",\"updatedAt\":\"2025-01-21T05:53:55.523Z\",\"userId\":\"cm0ur1yxw000056nsjlr6187p\",\"dirId\":\"cm65zlbyf001udvmggnd6i0oh\"}","timestamp":"2025-01-21T05:53:55.647Z"} diff --git a/logs/backend/combined-2025-01-22.log b/logs/backend/combined-2025-01-22.log deleted file mode 100644 index 538b3c85..00000000 --- a/logs/backend/combined-2025-01-22.log +++ /dev/null @@ -1,3 +0,0 @@ -{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","originalColumn":16,"originalLine":1069,"stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1217)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1084)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-01-21T22:11:48.296Z"} -{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","originalColumn":16,"originalLine":1069,"stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1217)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1084)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-01-21T22:24:18.884Z"} -{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","originalColumn":16,"originalLine":1069,"stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1217)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1084)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-01-21T22:31:50.770Z"} diff --git a/logs/backend/combined-2025-02-03.log b/logs/backend/combined-2025-02-03.log index cc577fc7..90ff1a4a 100644 --- a/logs/backend/combined-2025-02-03.log +++ b/logs/backend/combined-2025-02-03.log @@ -5,3 +5,4 @@ {"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-02-03T06:56:34.648Z"} {"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-03T07:06:48.864Z"} {"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-03T07:32:02.910Z"} +{"id":"f6b224a2-3aeb-4cbc-afee-075a7965ab70","level":"info","message":"Success send message","status":"success","timestamp":"2025-02-03T09:53:34.492Z"} diff --git a/logs/backend/combined-2025-02-04.log b/logs/backend/combined-2025-02-04.log new file mode 100644 index 00000000..aacd117d --- /dev/null +++ b/logs/backend/combined-2025-02-04.log @@ -0,0 +1,2 @@ +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-04T03:16:37.809Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-04T06:54:35.085Z"} diff --git a/logs/backend/combined-2025-02-05.log b/logs/backend/combined-2025-02-05.log new file mode 100644 index 00000000..1c99acf3 --- /dev/null +++ b/logs/backend/combined-2025-02-05.log @@ -0,0 +1,26 @@ +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-05T02:30:14.963Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-05T02:44:11.043Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-05T03:13:24.349Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-02-05T03:48:26.606Z"} +{"clientVersion":"6.3.0","code":"UND_ERR_SOCKET","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.deleteMany()` invocation:\n\n\nother side closed","meta":{"modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.deleteMany()` invocation:\n\n\nother side closed\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T04:24:29.510Z"} +{"clientVersion":"6.3.0","code":"UND_ERR_SOCKET","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.deleteMany()` invocation:\n\n\nother side closed","meta":{"modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.deleteMany()` invocation:\n\n\nother side closed\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T05:56:01.792Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:33.579Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:38.069Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:39.386Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:40.316Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:41.037Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:41.842Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:42.615Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:42.784Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:42.982Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:43.131Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:43.278Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:25:00.025Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:25:00.028Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:25:00.029Z"} +{"clientVersion":"6.3.0","code":"UND_ERR_SOCKET","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nother side closed","meta":{"modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nother side closed\n at new PrismaClientKnownRequestError (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:148:1500)\n at handleRequestError (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:7367)\n at handleAndLogRequestError (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:6687)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:6394)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:35:53.417Z"} +{"id":"c65237f0-e0cf-4961-9454-2405c4f4fe05","level":"info","message":"Success send message","status":"success","timestamp":"2025-02-05T06:41:30.785Z"} +{"clientVersion":"6.3.0","code":"UND_ERR_SOCKET","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nother side closed","meta":{"modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nother side closed\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:53:59.012Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-05T07:23:58.983Z"} +{"id":"64e3a991-7e44-407c-94b4-1693dc8a4417","level":"info","message":"Success send message","status":"success","timestamp":"2025-02-05T09:14:22.961Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-05T09:43:37.753Z"} diff --git a/logs/backend/error-2025-01-21.log b/logs/backend/error-2025-01-21.log deleted file mode 100644 index e69de29b..00000000 diff --git a/logs/backend/error-2025-01-22.log b/logs/backend/error-2025-01-22.log deleted file mode 100644 index 538b3c85..00000000 --- a/logs/backend/error-2025-01-22.log +++ /dev/null @@ -1,3 +0,0 @@ -{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","originalColumn":16,"originalLine":1069,"stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1217)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1084)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-01-21T22:11:48.296Z"} -{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","originalColumn":16,"originalLine":1069,"stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1217)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1084)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-01-21T22:24:18.884Z"} -{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","originalColumn":16,"originalLine":1069,"stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1217)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1084)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-01-21T22:31:50.770Z"} diff --git a/logs/backend/error-2025-02-04.log b/logs/backend/error-2025-02-04.log new file mode 100644 index 00000000..aacd117d --- /dev/null +++ b/logs/backend/error-2025-02-04.log @@ -0,0 +1,2 @@ +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-04T03:16:37.809Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-04T06:54:35.085Z"} diff --git a/logs/backend/error-2025-02-05.log b/logs/backend/error-2025-02-05.log new file mode 100644 index 00000000..b26e7137 --- /dev/null +++ b/logs/backend/error-2025-02-05.log @@ -0,0 +1,24 @@ +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-05T02:30:14.963Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-05T02:44:11.043Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-05T03:13:24.349Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-02-05T03:48:26.606Z"} +{"clientVersion":"6.3.0","code":"UND_ERR_SOCKET","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.deleteMany()` invocation:\n\n\nother side closed","meta":{"modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.deleteMany()` invocation:\n\n\nother side closed\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T04:24:29.510Z"} +{"clientVersion":"6.3.0","code":"UND_ERR_SOCKET","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.deleteMany()` invocation:\n\n\nother side closed","meta":{"modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.deleteMany()` invocation:\n\n\nother side closed\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T05:56:01.792Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:33.579Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:38.069Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:39.386Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:40.316Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:41.037Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:41.842Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:42.615Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:42.784Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:42.982Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:43.131Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:24:43.278Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:25:00.025Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:25:00.028Z"} +{"clientVersion":"6.3.0","code":"P2025","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.","meta":{"cause":"Record to delete does not exist.","modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nAn operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:25:00.029Z"} +{"clientVersion":"6.3.0","code":"UND_ERR_SOCKET","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nother side closed","meta":{"modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nother side closed\n at new PrismaClientKnownRequestError (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:148:1500)\n at handleRequestError (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:7367)\n at handleAndLogRequestError (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:6687)\n at (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:6394)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:35:53.417Z"} +{"clientVersion":"6.3.0","code":"UND_ERR_SOCKET","level":"error","message":"Error deleting OTP: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nother side closed","meta":{"modelName":"KodeOtp"},"name":"PrismaClientKnownRequestError","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.kodeOtp.delete()` invocation:\n\n\nother side closed\n at new PrismaClientKnownRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:148:1505)\n at handleRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:7369)\n at handleAndLogRequestError (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6705)\n at (webpack-internal:///(ssr)/./node_modules/@prisma/client/runtime/binary.js:258:6418)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-05T06:53:59.012Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-05T07:23:58.983Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at Object.e_ [as staticGenerationBailout] (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27571)\n at i (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32508)\n at Object.get (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32604)\n at GET (/Users/bagasbanuna/Documents/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1219)\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39715\n at /Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36\n at NoopContextManager.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:7057)\n at ContextAPI.with (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:516)\n at NoopTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18086)\n at ProxyTracer.startActiveSpan (/Users/bagasbanuna/Documents/BIP/hipmi/node_modules/next/dist/compiled/@opentelemetry/api/index.js:1:18847)","timestamp":"2025-02-05T09:43:37.753Z"} diff --git a/src/app/auth/_lib/decrypt.ts b/src/app/(auth)/_lib/decrypt.ts similarity index 100% rename from src/app/auth/_lib/decrypt.ts rename to src/app/(auth)/_lib/decrypt.ts diff --git a/src/app/auth/_lib/encrypt.ts b/src/app/(auth)/_lib/encrypt.ts similarity index 100% rename from src/app/auth/_lib/encrypt.ts rename to src/app/(auth)/_lib/encrypt.ts diff --git a/src/app/auth/_lib/session_create.ts b/src/app/(auth)/_lib/session_create.ts similarity index 100% rename from src/app/auth/_lib/session_create.ts rename to src/app/(auth)/_lib/session_create.ts diff --git a/src/app/(user)/login/page.tsx b/src/app/(auth)/login/page.tsx similarity index 100% rename from src/app/(user)/login/page.tsx rename to src/app/(auth)/login/page.tsx diff --git a/src/app/(user)/register/page.tsx b/src/app/(auth)/register/page.tsx similarity index 100% rename from src/app/(user)/register/page.tsx rename to src/app/(auth)/register/page.tsx diff --git a/src/app/(user)/splash/page.tsx b/src/app/(auth)/splash/page.tsx similarity index 100% rename from src/app/(user)/splash/page.tsx rename to src/app/(auth)/splash/page.tsx diff --git a/src/app/(user)/validasi/page.tsx b/src/app/(auth)/validasi/page.tsx similarity index 100% rename from src/app/(user)/validasi/page.tsx rename to src/app/(auth)/validasi/page.tsx diff --git a/src/app/(user)/waiting-room/page.tsx b/src/app/(auth)/waiting-room/page.tsx similarity index 100% rename from src/app/(user)/waiting-room/page.tsx rename to src/app/(auth)/waiting-room/page.tsx diff --git a/src/app/api/admin/donasi/[status]/route.ts b/src/app/api/admin/donasi/[status]/route.ts new file mode 100644 index 00000000..b8cc0bfe --- /dev/null +++ b/src/app/api/admin/donasi/[status]/route.ts @@ -0,0 +1,152 @@ +import { prisma } from "@/app/lib"; +import backendLogger from "@/util/backendLogger"; +import { data } from "autoprefixer"; +import _, { take } from "lodash"; +import moment from "moment"; +import { NextResponse } from "next/server"; + +export async function GET(request: Request, + { params }: { params: { status: string } }) { + const method = request.method; + if (method !== "GET") { + return NextResponse.json({ + succes: false, + message: "Method not allowed" + }, + { status: 405 } + ); + } + + const { status } = params; + const { searchParams } = new URL(request.url); + const search = searchParams.get("search"); + const page = searchParams.get("page"); + const takeData = 10; + const skipData = Number(page) * takeData - takeData; + + try { + let fixData; + const fixStatus = _.startCase(status); + + + if (!page && !search) { + fixData = await prisma.donasi.findMany({ + orderBy: { + updatedAt: "desc", + }, + where: { + active: true, + DonasiMaster_Status: { + name: fixStatus + } + }, + include: { + Author: { + select: { + id: true, + username: true, + Profile: { + select: { + name: true + } + } + } + }, + DonasiMaster_Status: true, + DonasiMaster_Ketegori: true, + DonasiMaster_Durasi: true + } + }) + } else if (!page && search) { + fixData = await prisma.donasi.findMany({ + orderBy: { + updatedAt: "desc" + }, + where: { + active: true, + DonasiMaster_Status: { + name: fixStatus + }, + title: { + contains: search, + mode: "insensitive" + } + }, + include: { + Author: { + select: { + id: true, + username: true, + Profile: { + select: { + name: true + } + } + } + }, + DonasiMaster_Status: true, + DonasiMaster_Ketegori: true, + DonasiMaster_Durasi: true + } + }) + } else if (page && !search) { + const data = await prisma.donasi.findMany({ + take: takeData, + skip: skipData, + orderBy: [ + { + publishTime: "desc" + } + ], + where: { + active: true, + DonasiMaster_Status: { + name: fixStatus + } + }, + include: { + Author: true, + imageDonasi: true, + DonasiMaster_Status: true, + DonasiMaster_Ketegori: true, + DonasiMaster_Durasi: true + } + }) + + const nCount = await prisma.donasi.count({ + where: { + active: true, + DonasiMaster_Status: { + name: fixStatus + }, + } + }) + + console.log("data >", data) + fixData = { + data: data, + nCount: _.ceil(nCount / takeData) + } + } + + return NextResponse.json({ + success: true, + message: "Success", + data: fixData + }, + { status: 200 } + ) + + } catch (error) { + backendLogger.error("Error geta data table donasi event dashboard>>", error) + return NextResponse.json({ + success: false, + message: "Failed get data table donasi dashboard", + reason: (error as Error).message + }, + { status: 500 } + ); + } finally { + await prisma.$disconnect(); + } +} \ No newline at end of file diff --git a/src/app/api/admin/investasi/[status]/route.ts b/src/app/api/admin/investasi/[status]/route.ts new file mode 100644 index 00000000..04acca4f --- /dev/null +++ b/src/app/api/admin/investasi/[status]/route.ts @@ -0,0 +1,164 @@ +import { prisma } from "@/app/lib"; +import _ from "lodash"; +import moment from "moment"; +import { NextResponse } from "next/server"; + +export async function GET(request: Request, { params }: { + params: { status: string } +} +) { + const method = request.method; + if (method !== "GET") { + return NextResponse.json({ + success: false, + message: "Method not allowed", + }, + { status: 405 } + ) + } + + const { status } = params; + const { searchParams } = new URL(request.url); + const search = searchParams.get("search"); + const page = searchParams.get("page"); + const takeData = 10 + const skipData = Number(page) * takeData - takeData; + + console.log("Ini Status", status); + console.log("Ini Page", page) + + try { + let fixData; + const fixStatus = _.startCase(status); + + if (!page && !search) { + fixData = await prisma.investasi.findMany({ + orderBy: { + updatedAt: "desc", + }, + where: { + active: true, + MasterStatusInvestasi: { + name: fixStatus + }, + }, + include: { + author: { + select: { + id: true, + username: true, + Profile: { + select: { + name: true, + }, + }, + }, + }, + MasterStatusInvestasi: true, + }, + }); + } else if (!page && search) { + fixData = await prisma.investasi.findMany({ + orderBy: { + updatedAt: "desc", + }, + where: { + active: true, + MasterStatusInvestasi: { + name: fixStatus + }, + title: { + contains: search, + mode: "insensitive", + }, + }, + include: { + author: { + select: { + id: true, + username: true, + Profile: { + select: { + name: true, + }, + }, + }, + }, + MasterStatusInvestasi: true, + }, + }); + } else if (page && !search) { + + const data = await prisma.investasi.findMany({ + take: takeData, + skip: skipData, + orderBy: [ + { + countDown: "desc", + }, + ], + where: { + active: true, + MasterStatusInvestasi: { + name: fixStatus + } + + }, + include: { + MasterStatusInvestasi: true, + BeritaInvestasi: true, + DokumenInvestasi: true, + ProspektusInvestasi: true, + MasterPembagianDeviden: true, + MasterPencarianInvestor: true, + MasterPeriodeDeviden: true, + author: true, + Investasi_Invoice: { + where: { + statusInvoiceId: "2", + }, + }, + }, + }); + + const nCount = await prisma.investasi.count({ + where: { + active: true, + MasterStatusInvestasi: { + name: fixStatus + } + + }, + }); + + console.log("data >", data) + + fixData = { + data: data, + nPage: _.ceil(nCount / takeData), + }; + + } + + return NextResponse.json({ + success: true, + message: "Success", + data: fixData, + }, + { status: 200 } + ) + + } catch (error) { + console.log(error) + return NextResponse.json({ + success: false, + message: "Failed", + reason: (error as Error).message, + }, + { status: 500 } + ) + + } + + +} \ No newline at end of file diff --git a/src/app/api/auth/check/[id]/route.ts b/src/app/api/auth/check/[id]/route.ts new file mode 100644 index 00000000..4e073fb5 --- /dev/null +++ b/src/app/api/auth/check/[id]/route.ts @@ -0,0 +1,30 @@ +import { prisma } from "@/app/lib"; +import backendLogger from "@/util/backendLogger"; +import { NextRequest, NextResponse } from "next/server"; +export const dynamic = "force-dynamic"; + +export async function GET( + request: Request, + { params }: { params: { id: string } } +) { + if (request.method !== "GET") { + return NextResponse.json( + { success: false, message: "Method not allowed" }, + { status: 405 } + ); + } + + try { + const { id } = params; + const data = await prisma.kodeOtp.findFirst({ + where: { + id: id as string, + }, + }); + + return NextResponse.json(data, { status: 200 }); + } catch (error) { + backendLogger.error("Error get code otp", error); //(error); + return NextResponse.json(null, { status: 500 }); + } +} diff --git a/src/app/api/auth/check/route.ts b/src/app/api/auth/check/route.ts deleted file mode 100644 index b51a6f31..00000000 --- a/src/app/api/auth/check/route.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { prisma } from "@/app/lib"; -import { data } from "autoprefixer"; -import { NextRequest, NextResponse } from "next/server"; -export const dynamic = "force-dynamic"; - -export async function GET(request: NextRequest) { - const id = request.nextUrl.searchParams.get("id"); - // const { searchParams } = new URL(request.url); - // const id = searchParams.get("id"); - - try { - const data = await prisma.kodeOtp.findFirst({ - where: { - id: id as string, - }, - }); - - return NextResponse.json(data, { status: 200 }); - } catch (error) { - console.log(error); - } - - return NextResponse.json(null, { status: 500 }); -} diff --git a/src/app/api/auth/code/[id]/route.ts b/src/app/api/auth/code/[id]/route.ts new file mode 100644 index 00000000..b2193ed3 --- /dev/null +++ b/src/app/api/auth/code/[id]/route.ts @@ -0,0 +1,56 @@ +import { prisma } from "@/app/lib"; +import backendLogger from "@/util/backendLogger"; +import { NextResponse } from "next/server"; + +export { DELETE }; +async function DELETE( + request: Request, + { params }: { params: { id: string } } +) { + if (request.method !== "DELETE") { + return NextResponse.json( + { success: false, message: "Method not allowed" }, + { status: 405 } + ); + } + try { + // Ambil parameter id dari URL + const { id } = params; + + if (!id) { + return NextResponse.json( + { + success: false, + message: "Parameter 'id' diperlukan", + }, + { status: 400 } + ); + } + + // Hapus data OTP + await prisma.kodeOtp.delete({ + where: { + id: id, + }, + }); + + return NextResponse.json( + { + success: true, + message: "Berhasil menghapus data OTP", + }, + { status: 200 } + ); + } catch (error) { + backendLogger.error("Error deleting OTP:", error); + return NextResponse.json( + { + success: false, + message: "Terjadi kesalahan saat menghapus data OTP", + }, + { status: 500 } + ); + } finally { + await prisma.$disconnect(); + } +} diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts index 871e8f3f..1d22ba3c 100644 --- a/src/app/api/auth/login/route.ts +++ b/src/app/api/auth/login/route.ts @@ -4,59 +4,60 @@ import backendLogger from "@/util/backendLogger"; import { NextResponse } from "next/server"; export async function POST(req: Request) { - if (req.method === "POST") { + if (req.method !== "POST") { + return NextResponse.json( + { success: false, message: "Method Not Allowed" }, + { status: 405 } + ); + } + + try { const codeOtp = randomOTP(); const body = await req.json(); const { nomor } = body; - - try { - const res = await fetch( - `https://wa.wibudev.com/code?nom=${nomor}&text=HIPMI - Kode ini bersifat RAHASIA dan JANGAN DI BAGIKAN KEPADA SIAPAPUN, termasuk anggota ataupun pengurus HIPMI lainnya. + const res = await fetch( + `https://wa.wibudev.com/code?nom=${nomor}&text=HIPMI - Kode ini bersifat RAHASIA dan JANGAN DI BAGIKAN KEPADA SIAPAPUN, termasuk anggota ataupun pengurus HIPMI lainnya. \n >> Kode OTP anda: ${codeOtp}. ` - ); + ); - const sendWa = await res.json(); - - if (sendWa.status !== "success") - return NextResponse.json( - { success: false, message: "Nomor Whatsapp Tidak Aktif" }, - { status: 400 } - ); - - const createOtpId = await prisma.kodeOtp.create({ - data: { - nomor: nomor, - otp: codeOtp, - }, - }); - - if (!createOtpId) - return NextResponse.json( - { success: false, message: "Gagal Membuat Kode OTP" }, - { status: 400 } - ); + const sendWa = await res.json(); + if (sendWa.status !== "success") return NextResponse.json( - { - success: true, - message: "Kode Verifikasi Dikirim", - kodeId: createOtpId.id, - }, - { status: 200 } + { success: false, message: "Nomor Whatsapp Tidak Aktif" }, + { status: 400 } ); - } catch (error) { - backendLogger.log("Error Login", error); + + const createOtpId = await prisma.kodeOtp.create({ + data: { + nomor: nomor, + otp: codeOtp, + }, + }); + + if (!createOtpId) return NextResponse.json( - { success: false, message: error as Error }, - { status: 500 } + { success: false, message: "Gagal mengirim kode OTP" }, + { status: 400 } ); - } + + return NextResponse.json( + { + success: true, + message: "Kode verifikasi terkirim", + kodeId: createOtpId.id, + }, + { status: 200 } + ); + } catch (error) { + backendLogger.log("Error Login", error); + return NextResponse.json( + { success: false, message: "Terjadi masalah saat login" , reason: error as Error }, + { status: 500 } + ); + } finally { + await prisma.$disconnect(); } - - return NextResponse.json( - { success: false, message: "Method Not Allowed" }, - { status: 405 } - ); } diff --git a/src/app/api/auth/register/route.ts b/src/app/api/auth/register/route.ts index 53f83014..41f11fd4 100644 --- a/src/app/api/auth/register/route.ts +++ b/src/app/api/auth/register/route.ts @@ -1,11 +1,19 @@ -import { sessionCreate } from "@/app/auth/_lib/session_create"; +import { sessionCreate } from "@/app/(auth)/_lib/session_create"; import prisma from "@/app/lib/prisma"; import backendLogger from "@/util/backendLogger"; import { NextResponse } from "next/server"; export async function POST(req: Request) { - if (req.method === "POST") { + if (req.method !== "POST") { + return NextResponse.json( + { success: false, message: "Method Not Allowed" }, + { status: 405 } + ); + } + + try { const { data } = await req.json(); + console.log("data api register", data); const cekUsername = await prisma.user.findUnique({ where: { @@ -13,46 +21,51 @@ export async function POST(req: Request) { }, }); - try { - if (cekUsername) - return NextResponse.json( - { success: false, message: "Username sudah digunakan" }, - { status: 400 } - ); - - const createUser = await prisma.user.create({ - data: { - username: data.username, - nomor: data.nomor, - active: false, - }, + if (cekUsername) + return NextResponse.json({ + success: false, + message: "Username sudah digunakan", }); - const token = await sessionCreate({ - sessionKey: process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, - encodedKey: process.env.NEXT_PUBLIC_BASE_TOKEN_KEY!, - user: createUser as any, - }); + const createUser = await prisma.user.create({ + data: { + username: data.username, + nomor: data.nomor, + active: false, + }, + }); + if (!createUser) return NextResponse.json( - { success: true, message: "Berhasil Login", data: createUser }, - { status: 200 } - ); - } catch (error) { - backendLogger.log("Error registrasi:", error); - return NextResponse.json( - { - success: false, - message: "Server Error", - reason: (error as Error).message, - }, + { success: false, message: "Gagal Registrasi" }, { status: 500 } ); - } - } - return NextResponse.json( - { success: false, message: "Method Not Allowed" }, - { status: 405 } - ); + const token = await sessionCreate({ + sessionKey: process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, + encodedKey: process.env.NEXT_PUBLIC_BASE_TOKEN_KEY!, + user: createUser as any, + }); + + return NextResponse.json( + { + success: true, + message: "Registrasi Berhasil, Anda Sedang Login", + // data: createUser, + }, + { status: 201 } + ); + } catch (error) { + backendLogger.error("Error registrasi:", error); + return NextResponse.json( + { + success: false, + message: "Maaf, Terjadi Keselahan", + reason: (error as Error).message, + }, + { status: 500 } + ); + } finally { + await prisma.$disconnect(); + } } diff --git a/src/app/api/auth/resend/route.ts b/src/app/api/auth/resend/route.ts index 3e02b0ef..b77a7a97 100644 --- a/src/app/api/auth/resend/route.ts +++ b/src/app/api/auth/resend/route.ts @@ -1,69 +1,72 @@ import { prisma } from "@/app/lib"; import { randomOTP } from "@/app_modules/auth/fun/rondom_otp"; +import backendLogger from "@/util/backendLogger"; import { NextResponse } from "next/server"; export async function POST(req: Request) { - if (req.method === "POST") { + if (req.method !== "POST") { + return NextResponse.json( + { success: false, message: "Method Not Allowed" }, + { status: 405 } + ); + } + + try { const codeOtp = randomOTP(); const body = await req.json(); const { nomor } = body; - try { - const res = await fetch( - `https://wa.wibudev.com/code?nom=${nomor}&text=HIPMI - Kode ini bersifat RAHASIA dan JANGAN DI BAGIKAN KEPADA SIAPAPUN, termasuk anggota ataupun pengurus HIPMI lainnya. + const res = await fetch( + `https://wa.wibudev.com/code?nom=${nomor}&text=HIPMI - Kode ini bersifat RAHASIA dan JANGAN DI BAGIKAN KEPADA SIAPAPUN, termasuk anggota ataupun pengurus HIPMI lainnya. \n >> Kode OTP anda: ${codeOtp}. ` - ); - - const sendWa = await res.json(); - if (sendWa.status !== "success") - return NextResponse.json( - { - success: false, - message: "Nomor Whatsapp Tidak Aktif", - }, - { status: 400 } - ); - - const createOtpId = await prisma.kodeOtp.create({ - data: { - nomor: nomor, - otp: codeOtp, - }, - }); - - if (!createOtpId) - return NextResponse.json( - { - success: false, - message: "Gagal Membuat Kode OTP", - }, - { status: 400 } - ); - - return NextResponse.json( - { - success: true, - message: "Kode Verifikasi Dikirim", - kodeId: createOtpId.id, - }, - { status: 200 } - ); - } catch (error) { - console.log(error); + ); + const sendWa = await res.json(); + if (sendWa.status !== "success") return NextResponse.json( { success: false, - message: "Server Whatsapp Error !!", + message: "Nomor Whatsapp Tidak Aktif", }, - { status: 500 } + { status: 400 } ); - } + + const createOtpId = await prisma.kodeOtp.create({ + data: { + nomor: nomor, + otp: codeOtp, + }, + }); + + if (!createOtpId) + return NextResponse.json( + { + success: false, + message: "Gagal Membuat Kode OTP", + }, + { status: 400 } + ); + + return NextResponse.json( + { + success: true, + message: "Kode Verifikasi Dikirim", + kodeId: createOtpId.id, + }, + { status: 200 } + ); + } catch (error) { + backendLogger.error(" Error Resend OTP", error); + return NextResponse.json( + { + success: false, + message: "Server Whatsapp Error !!", + }, + { status: 500 } + ); + } finally { + await prisma.$disconnect(); } - return NextResponse.json( - { success: false, message: "Method Not Allowed" }, - { status: 405 } - ); } diff --git a/src/app/api/auth/validasi/route.ts b/src/app/api/auth/validasi/route.ts index c8c2e9ea..c9f9814e 100644 --- a/src/app/api/auth/validasi/route.ts +++ b/src/app/api/auth/validasi/route.ts @@ -1,61 +1,63 @@ -import { sessionCreate } from "@/app/auth/_lib/session_create"; +import { sessionCreate } from "@/app/(auth)/_lib/session_create"; import prisma from "@/app/lib/prisma"; import backendLogger from "@/util/backendLogger"; import { NextResponse } from "next/server"; export async function POST(req: Request) { - if (req.method === "POST") { + if (req.method !== "POST") { + return NextResponse.json( + { success: false, message: "Method Not Allowed" }, + { status: 405 } + ); + } + + try { const { nomor } = await req.json(); + const dataUser = await prisma.user.findUnique({ + where: { + nomor: nomor, + }, + select: { + id: true, + nomor: true, + username: true, + active: true, + masterUserRoleId: true, + }, + }); - try { - const dataUser = await prisma.user.findUnique({ - where: { - nomor: nomor, - }, - select: { - id: true, - nomor: true, - username: true, - active: true, - masterUserRoleId: true, - }, - }); - - if (dataUser == null) - return NextResponse.json( - { success: false, message: "Nomor Belum Terdaftar" }, - { status: 404 } - ); - - const token = await sessionCreate({ - sessionKey: process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, - encodedKey: process.env.NEXT_PUBLIC_BASE_TOKEN_KEY!, - user: dataUser as any, - }); - + if (dataUser == null) return NextResponse.json( - { - success: true, - message: "Berhasil Login", - roleId: dataUser.masterUserRoleId, - active: dataUser.active, - }, + { success: false, message: "Nomor Belum Terdaftar" }, { status: 200 } ); - } catch (error) { - backendLogger.log("Error Validasi:", error); - return NextResponse.json( - { - success: false, - message: "Server Error", - reason: (error as Error).message, - }, - { status: 500 } - ); - } + + const token = await sessionCreate({ + sessionKey: process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, + encodedKey: process.env.NEXT_PUBLIC_BASE_TOKEN_KEY!, + user: dataUser as any, + }); + + return NextResponse.json( + { + success: true, + message: "Berhasil Login", + roleId: dataUser.masterUserRoleId, + active: dataUser.active, + }, + { status: 200 } + ); + } catch (error) { + backendLogger.log("API Error or Server Error", error); + return NextResponse.json( + { + success: false, + message: "Maaf, Terjadi Keselahan", + reason: (error as Error).message, + }, + { status: 500 } + ); + } finally { + await prisma.$disconnect(); } - return NextResponse.json( - { success: false, message: "Method Not Allowed" }, - { status: 405 } - ); } diff --git a/src/app/api/new/home/route.ts b/src/app/api/new/home/route.ts index 7ef3a890..2e74f72b 100644 --- a/src/app/api/new/home/route.ts +++ b/src/app/api/new/home/route.ts @@ -3,67 +3,82 @@ import { funGetUserIdByToken } from "@/app_modules/_global/fun/get"; import { NextResponse } from "next/server"; export const dynamic = "force-dynamic"; - // GET DATA HOME export async function GET(request: Request) { - try { - let fixData - const { searchParams } = new URL(request.url) - const kategori = searchParams.get("cat") + try { + let fixData; + const { searchParams } = new URL(request.url); + const kategori = searchParams.get("cat"); - const userLoginId = await funGetUserIdByToken() - if (userLoginId == null) { - return NextResponse.json({ success: false, message: "Gagal mendapatkan data, user id tidak ada" }, { status: 500 }); - } + const userLoginId = await funGetUserIdByToken(); + if (userLoginId == null) { + return NextResponse.json( + { + success: false, + message: "Gagal mendapatkan data, user id tidak ada", + }, + { status: 500 } + ); + } - if (kategori == "job") { - fixData = await prisma.job.findMany({ - take: 2, - orderBy: { - createdAt: "desc", - }, - where: { - isActive: true, - masterStatusId: "1" - }, + if (kategori == "job") { + fixData = await prisma.job.findMany({ + take: 2, + orderBy: { + createdAt: "desc", + }, + where: { + isActive: true, + masterStatusId: "1", + }, + select: { + id: true, + Author: { select: { - id: true, - Author: { - select: { - id: true, - username: true, - }, - }, - title: true, - deskripsi: true + id: true, + username: true, }, - }); - } else if (kategori == "cek_profile") { - const data = await prisma.user.findUnique({ - where: { - id: userLoginId, + }, + title: true, + deskripsi: true, + }, + }); + } else if (kategori == "cek_profile") { + const data = await prisma.user.findUnique({ + where: { + id: userLoginId, + }, + include: { + Profile: { + select: { + id: true, + imageId: true, }, - include: { - Profile: { - select: { - id: true, - imageId: true, - } - } - } - }); + }, + }, + }); - fixData = { - profile: data?.Profile?.id, - imageId: data?.Profile?.imageId - } + fixData = { + profile: data?.Profile?.id, + imageId: data?.Profile?.imageId, + }; + } - } - - return NextResponse.json({ success: true, message: "Berhasil mendapatkan data", data: fixData }, { status: 200 }); - - } catch (error) { - console.error(error); - return NextResponse.json({ success: false, message: "Gagal mendapatkan data, coba lagi nanti ", reason: (error as Error).message, }, { status: 500 }); - } -} \ No newline at end of file + return NextResponse.json( + { success: true, message: "Berhasil mendapatkan data", data: fixData }, + { status: 200 } + ); + } catch (error) { + console.error(error); + return NextResponse.json( + { + success: false, + message: "Gagal mendapatkan data, coba lagi nanti ", + reason: (error as Error).message, + }, + { status: 500 } + ); + } finally { + await prisma.$disconnect(); + } +} diff --git a/src/app/api/user-validate/route.ts b/src/app/api/user-validate/route.ts index 0b5c8cf3..505c65ae 100644 --- a/src/app/api/user-validate/route.ts +++ b/src/app/api/user-validate/route.ts @@ -1,4 +1,4 @@ -import { decrypt } from "@/app/auth/_lib/decrypt"; +import { decrypt } from "@/app/(auth)/_lib/decrypt"; import { prisma } from "@/app/lib"; import { cookies } from "next/headers"; import { NextRequest, NextResponse } from "next/server"; @@ -32,7 +32,6 @@ export async function GET(req: NextRequest) { }); // Disconnect after successful query - await prisma.$disconnect(); return NextResponse.json({ success: true, @@ -41,7 +40,6 @@ export async function GET(req: NextRequest) { }); } catch (error) { // Ensure connection is closed even if error occurs - await prisma.$disconnect(); console.error("Error in user validation:", error); return NextResponse.json( @@ -51,5 +49,7 @@ export async function GET(req: NextRequest) { }, { status: 500 } ); + } finally { + await prisma.$disconnect(); } } diff --git a/src/app/api/user/get-cookies/route.ts b/src/app/api/user/get-cookies/route.ts index f59b5fe8..812242cb 100644 --- a/src/app/api/user/get-cookies/route.ts +++ b/src/app/api/user/get-cookies/route.ts @@ -1,4 +1,4 @@ -import { decrypt } from "@/app/auth/_lib/decrypt"; +import { decrypt } from "@/app/(auth)/_lib/decrypt"; import _ from "lodash"; import { cookies } from "next/headers"; import { NextResponse } from "next/server"; diff --git a/src/app/api/user/route.ts b/src/app/api/user/route.ts index 1ae5f208..06f4d909 100644 --- a/src/app/api/user/route.ts +++ b/src/app/api/user/route.ts @@ -1,5 +1,5 @@ -import { decrypt } from "@/app/auth/_lib/decrypt"; +import { decrypt } from "@/app/(auth)/_lib/decrypt"; import _ from "lodash"; import { cookies } from "next/headers"; import { NextResponse } from "next/server"; diff --git a/src/app/api/validation/route.ts b/src/app/api/validation/route.ts index ba9c6587..ddf3d1cc 100644 --- a/src/app/api/validation/route.ts +++ b/src/app/api/validation/route.ts @@ -1,10 +1,9 @@ - import { NextResponse } from "next/server"; - export async function GET(req: Request) { const auth = req.headers.get("Authorization"); const token = auth?.split(" ")[1]; + if (!token) return NextResponse.json({ success: false }, { status: 401 }); return NextResponse.json({ success: true }); diff --git a/src/app/auth/api/login/route.ts b/src/app/auth/api/login/route.ts deleted file mode 100644 index eb59a9f0..00000000 --- a/src/app/auth/api/login/route.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { prisma } from "@/app/lib"; -import { sessionCreate } from "../../_lib/session_create"; -import { NextResponse } from "next/server"; - -export async function POST(req: Request) { - const user = await prisma.user.findUnique({ - where: { - nomor: "6281339158911", - }, - select: { - id: true, - nomor: true, - }, - }); - - if (!user) return NextResponse.json({ success: false }, { status: 404 }); - - const token = await sessionCreate({ - sessionKey: process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, - encodedKey: process.env.NEXT_PUBLIC_BASE_TOKEN_KEY!, - user: user as any, - }); - - return NextResponse.json({ success: true, token }); -} diff --git a/src/app/auth/api/logout/route.ts b/src/app/auth/api/logout/route.ts deleted file mode 100644 index 25aab3db..00000000 --- a/src/app/auth/api/logout/route.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { cookies } from "next/headers"; -import { NextResponse } from "next/server"; - -export async function GET() { - const del = cookies().delete(process.env.NEXT_PUBLIC_BASE_SESSION_KEY!); - - return NextResponse.json({ success: true, message: "Logout Berhasil" }); -} diff --git a/src/app/auth/login/page.tsx b/src/app/auth/login/page.tsx deleted file mode 100644 index 7fe848b8..00000000 --- a/src/app/auth/login/page.tsx +++ /dev/null @@ -1,39 +0,0 @@ -"use client"; -import { Button } from "@mantine/core"; -import { useState } from "react"; - -export default function Page() { - const [loading, setLoading] = useState(false); - - - async function login() { - setLoading(true); - try { - const res = await fetch("/auth/api/login", { - method: "POST", - }); - - const dataText = await res.text(); - - if (!res.ok) { - console.error(dataText); - throw new Error(res.statusText); - } - - const dataJson = JSON.parse(dataText); - console.log(dataJson); - // window.location.replace("/dev/home"); - } catch (error) { - console.error(error); - } finally { - setLoading(false); - } - } - return ( - <> - - - ); -} diff --git a/src/app/dev/admin/donasi/sub-menu/publish/page.tsx b/src/app/dev/admin/donasi/sub-menu/publish/page.tsx index a0171588..a38784c8 100644 --- a/src/app/dev/admin/donasi/sub-menu/publish/page.tsx +++ b/src/app/dev/admin/donasi/sub-menu/publish/page.tsx @@ -2,11 +2,11 @@ import { AdminDonasi_TablePublish } from "@/app_modules/admin/donasi"; import adminDonasi_getListPublish from "@/app_modules/admin/donasi/fun/get/get_list_publish"; export default async function Page() { - const listPublish = await adminDonasi_getListPublish({ - page: 1, - }); + // const listPublish = await adminDonasi_getListPublish({ + // page: 1, + // }); // console.log(listPublish) return<> - + } \ No newline at end of file diff --git a/src/app/dev/admin/donasi/sub-menu/reject/page.tsx b/src/app/dev/admin/donasi/sub-menu/reject/page.tsx index 76c38ec8..8c1228c4 100644 --- a/src/app/dev/admin/donasi/sub-menu/reject/page.tsx +++ b/src/app/dev/admin/donasi/sub-menu/reject/page.tsx @@ -2,11 +2,11 @@ import { AdminDonasi_TableReject } from "@/app_modules/admin/donasi"; import adminDonasi_getListReject from "@/app_modules/admin/donasi/fun/get/get_list_reject"; export default async function Page() { - const dataReject = await adminDonasi_getListReject({ page: 1 }); + // const dataReject = await adminDonasi_getListReject({ page: 1 }); // console.log(dataReject) return ( <> - + ); } diff --git a/src/app/dev/admin/donasi/sub-menu/review/page.tsx b/src/app/dev/admin/donasi/sub-menu/review/page.tsx index 6e25d7fe..987917a5 100644 --- a/src/app/dev/admin/donasi/sub-menu/review/page.tsx +++ b/src/app/dev/admin/donasi/sub-menu/review/page.tsx @@ -2,7 +2,7 @@ import { AdminDonasi_TableReview } from "@/app_modules/admin/donasi"; import adminDonasi_getListReview from "@/app_modules/admin/donasi/fun/get/get_list_review"; export default async function Page() { - const listReview = await adminDonasi_getListReview({page: 1}); + // const listReview = await adminDonasi_getListReview({page: 1}); // console.log(listReview); - return ; + return ; } diff --git a/src/app/dev/admin/investasi/sub-menu/publish/page.tsx b/src/app/dev/admin/investasi/sub-menu/publish/page.tsx index 02de99d3..f37e97d2 100644 --- a/src/app/dev/admin/investasi/sub-menu/publish/page.tsx +++ b/src/app/dev/admin/investasi/sub-menu/publish/page.tsx @@ -2,11 +2,11 @@ import { Admin_TablePublishInvestasi } from "@/app_modules/admin/investasi"; import { adminInvestasi_funGetAllPublish } from "@/app_modules/admin/investasi/fun/get/get_all_publish"; export default async function Page() { - const listInvestasi = await adminInvestasi_funGetAllPublish({page: 1}); + // const listInvestasi = await adminInvestasi_funGetAllPublish({page: 1}); return ( <> - + ); } diff --git a/src/app/dev/admin/investasi/sub-menu/reject/page.tsx b/src/app/dev/admin/investasi/sub-menu/reject/page.tsx index 9f4af9e0..9d2b186b 100644 --- a/src/app/dev/admin/investasi/sub-menu/reject/page.tsx +++ b/src/app/dev/admin/investasi/sub-menu/reject/page.tsx @@ -2,10 +2,10 @@ import { Admin_TableRejectInvestasi } from "@/app_modules/admin/investasi"; import { adminInvestasi_funGetAllReject } from "@/app_modules/admin/investasi/fun/get/get_all_reject"; export default async function Page() { - const dataInvestsi = await adminInvestasi_funGetAllReject({page: 1}); + // const dataInvestsi = await adminInvestasi_funGetAllReject({page: 1}); return ( <> - + ); } diff --git a/src/app/dev/admin/investasi/sub-menu/review/page.tsx b/src/app/dev/admin/investasi/sub-menu/review/page.tsx index 454397aa..0d493140 100644 --- a/src/app/dev/admin/investasi/sub-menu/review/page.tsx +++ b/src/app/dev/admin/investasi/sub-menu/review/page.tsx @@ -2,10 +2,10 @@ import { Admin_TableReviewInvestasi } from "@/app_modules/admin/investasi"; import { adminInvestasi_funGetAllReview } from "@/app_modules/admin/investasi/fun/get/get_all_review"; export default async function Page() { - const dataInvestsi = await adminInvestasi_funGetAllReview({ page: 1 }); + // const dataInvestsi = await adminInvestasi_funGetAllReview({ page: 1 }); return ( <> - + ); } diff --git a/src/app_modules/_global/fun/get/fun_get_user_id_by_token.ts b/src/app_modules/_global/fun/get/fun_get_user_id_by_token.ts index cfbdb1e2..3164efdf 100644 --- a/src/app_modules/_global/fun/get/fun_get_user_id_by_token.ts +++ b/src/app_modules/_global/fun/get/fun_get_user_id_by_token.ts @@ -1,7 +1,7 @@ "use server"; import { cookies } from "next/headers"; -import { decrypt } from "../../../../app/auth/_lib/decrypt"; +import { decrypt } from "../../../../app/(auth)/_lib/decrypt"; export async function funGetUserIdByToken() { const SESSION_KEY = process.env.NEXT_PUBLIC_BASE_SESSION_KEY!; diff --git a/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts b/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts index be1e50e4..348d7f3f 100644 --- a/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts +++ b/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts @@ -1,12 +1,13 @@ export { - apiGetDonasiStatusCountDashboard, - apiGetDonasiKategoriCountDashboard + apiGetAdminDonasiStatusCountDashboard, + apiGetAdminDonasiKategoriCountDashboard, + apiGetAdminDonasiByStatus }; -const apiGetDonasiStatusCountDashboard = async ({ name }: +const apiGetAdminDonasiStatusCountDashboard = async ({ name }: { name: "Publish" | "Review" | "Reject" }) => { const { token } = await fetch("/api/get-cookie").then((res) => res.json()); if (!token) return await token.json().catch(() => null); - + const response = await fetch(`/api/admin/donasi/dashboard/${name}`, { method: "GET", headers: { @@ -19,7 +20,7 @@ const apiGetDonasiStatusCountDashboard = async ({ name }: return await response.json().catch(() => null); }; -const apiGetDonasiKategoriCountDashboard = async () => { +const apiGetAdminDonasiKategoriCountDashboard = async () => { const { token } = await fetch("/api/get-cookie").then((res) => res.json()); if (!token) return await token.json().catch(() => null); @@ -33,4 +34,35 @@ const apiGetDonasiKategoriCountDashboard = async () => { } }); return await response.json().catch(() => null); -} \ No newline at end of file +} + +const apiGetAdminDonasiByStatus = async ({ + status, + page, + search }: { + status: "Publish" | "Review" | "Reject", + page: string; + search: string; + }) => { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + console.log("Ini token", token) + console.log("Ini Page", page) + console.log("Ini search", search) + const isPage = page ? `?page=${page}` : ""; + const isSearch = search ? `&search=${search}` : ""; + const response = await fetch( + `/api/admin/donasi/${status}${isPage}${isSearch}`, + { + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}` + } + } + ) + console.log("Ini response", response) + return await response.json().catch(() => null); +} diff --git a/src/app_modules/admin/donasi/main/index.tsx b/src/app_modules/admin/donasi/main/index.tsx index 27f17de1..ed1b7cef 100644 --- a/src/app_modules/admin/donasi/main/index.tsx +++ b/src/app_modules/admin/donasi/main/index.tsx @@ -25,7 +25,8 @@ import { clientLogger } from "@/util/clientLogger"; import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; import global_limit from "@/app/lib/limit"; import { useShallowEffect } from "@mantine/hooks"; -import { apiGetDonasiKategoriCountDashboard, apiGetDonasiStatusCountDashboard } from "../lib/api_fetch_admin_donasi"; +import { apiGetAdminDonasiKategoriCountDashboard, apiGetAdminDonasiStatusCountDashboard } from "../lib/api_fetch_admin_donasi"; + export default function AdminDonasi_Main({ // countPublish, @@ -62,7 +63,7 @@ export default function AdminDonasi_Main({ } async function onLoadCountPublish() { try { - const response = await apiGetDonasiStatusCountDashboard({ + const response = await apiGetAdminDonasiStatusCountDashboard({ name: "Publish", }) @@ -75,7 +76,7 @@ export default function AdminDonasi_Main({ } async function onLoadCountReview() { try { - const response = await apiGetDonasiStatusCountDashboard({ + const response = await apiGetAdminDonasiStatusCountDashboard({ name: "Review", }) if (response) { @@ -87,7 +88,7 @@ export default function AdminDonasi_Main({ } async function onLoadCountReject() { try { - const response = await apiGetDonasiStatusCountDashboard({ + const response = await apiGetAdminDonasiStatusCountDashboard({ name: "Reject", }) if (response) { @@ -99,7 +100,7 @@ export default function AdminDonasi_Main({ } async function onLoadCountKategori() { try { - const response = await apiGetDonasiKategoriCountDashboard() + const response = await apiGetAdminDonasiKategoriCountDashboard() if (response) { setCountKategori(response.data); } diff --git a/src/app_modules/admin/donasi/sub_menu/table_publish.tsx b/src/app_modules/admin/donasi/sub_menu/table_publish.tsx index 21c053cb..a44e72a5 100644 --- a/src/app_modules/admin/donasi/sub_menu/table_publish.tsx +++ b/src/app_modules/admin/donasi/sub_menu/table_publish.tsx @@ -12,6 +12,7 @@ import { ScrollArea, Stack, Table, + Text, TextInput, Title } from "@mantine/core"; @@ -23,94 +24,120 @@ import adminDonasi_getListPublish from "../fun/get/get_list_publish"; import { ComponentAdminGlobal_TitlePage } from "../../_admin_global/_component"; import { AccentColor, MainColor } from "@/app_modules/_global/color"; import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { useShallowEffect } from "@mantine/hooks"; +import { clientLogger } from "@/util/clientLogger"; +import { apiGetAdminDonasiByStatus } from "../lib/api_fetch_admin_donasi"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export default function AdminDonasi_TablePublish({ - listPublish, -}: { - listPublish: any; -}) { +export default function AdminDonasi_TablePublish() { return ( <> - + ); } -function TableStatus({ listPublish }: { listPublish: any }) { +function TableStatus() { const router = useRouter(); const [isLoading, setLoading] = useState(false); const [idData, setIdData] = useState(""); - const [data, setData] = useState(listPublish.data); - const [isNPage, setNPage] = useState(listPublish.nPage); + const [data, setData] = useState(null); + const [isNPage, setNPage] = useState(1); const [isActivePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); - async function onSearch(s: string) { - setSearch(s); - const loadData = await adminDonasi_getListPublish({ - page: 1, - search: s, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + useShallowEffect(() => { + const loadInitialData = async () => { + try { + const response = await apiGetAdminDonasiByStatus({ + status: "Publish", + page: `${isActivePage}`, + search: isSearch + }) + + if (response?.success && response?.data.data) { + setData(response.data.data); + setNPage(response.data.nPage || 1); + } else { + console.error("Invalid data format recieved:", response); + setData([]); + } + } catch (error) { + clientLogger.error("Invalid data format recieved:", error); + setData([]); + } + } + loadInitialData(); + }, [isActivePage, isSearch]) + + const onSearch = (searchTerm: string) => { + setSearch(searchTerm); + setActivePage(1); } - async function onPageClick(p: any) { - setActivePage(p); - const loadData = await adminDonasi_getListPublish({ - search: isSearch, - page: p, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + const onPageClick = (page: number) => { + setActivePage(page); + } + const renderTableBody = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data +
+ + + ) + } + return data.map((e, i) => ( + + +
{e.title}
+ + +
+ +
+ + +
+ +
+ + +
{e.DonasiMaster_Ketegori.name}
+ + +
{e.DonasiMaster_Durasi.name} hari
+ + +
+ +
+ + + )); } - const TableRows = data.map((e, i) => ( - - -
{e.title}
- - -
- -
- - -
- -
- - -
{e.DonasiMaster_Ketegori.name}
- - -
{e.DonasiMaster_Durasi.name} hari
- - -
- -
- - - )); return ( <> @@ -121,13 +148,13 @@ function TableStatus({ listPublish }: { listPublish: any }) { color={AdminColor.softBlue} component={ } - radius={"xl"} - placeholder="Masukan judul" - onChange={(val) => { - onSearch(val.currentTarget.value); - }} - /> + icon={} + radius={"xl"} + placeholder="Masukan judul" + onChange={(val) => { + onSearch(val.currentTarget.value); + }} + /> } /> {/* */} - - - - - - - - - - - - - - {TableRows} -
-
Judul
-
-
Target
-
-
Terkumpul
-
-
Ketegori
-
-
Durasi
-
-
Aksi
-
-
- {/* + {!data ? ( + + ) : ( + + + + + + + + + + + + + + {renderTableBody()} +
+
Judul
+
+
Target
+
+
Terkumpul
+
+
Ketegori
+
+
Durasi
+
+
Aksi
+
+
+ {/* */} -
- { - onPageClick(val); - }} - /> -
-
+
+ { + onPageClick(val); + }} + /> +
+
+ )} + ); diff --git a/src/app_modules/admin/donasi/sub_menu/table_reject.tsx b/src/app_modules/admin/donasi/sub_menu/table_reject.tsx index a71bfd1e..0b5eaa08 100644 --- a/src/app_modules/admin/donasi/sub_menu/table_reject.tsx +++ b/src/app_modules/admin/donasi/sub_menu/table_reject.tsx @@ -18,7 +18,7 @@ import { TextInput, Title } from "@mantine/core"; -import { useDisclosure } from "@mantine/hooks"; +import { useDisclosure, useShallowEffect } from "@mantine/hooks"; import { IconEyeEdit, IconSearch } from "@tabler/icons-react"; import { useRouter } from "next/navigation"; import { useState } from "react"; @@ -26,90 +26,118 @@ import { ComponentAdminGlobal_TitlePage } from "../../_admin_global/_component"; import ComponentAdminGlobal_HeaderTamplate from "../../_admin_global/header_tamplate"; import adminDonasi_getListReject from "../fun/get/get_list_reject"; import { IconEyeCheck } from "@tabler/icons-react"; +import { clientLogger } from "@/util/clientLogger"; +import { apiGetAdminDonasiByStatus } from "../lib/api_fetch_admin_donasi"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export default function AdminDonasi_TableReject({ - dataReject, -}: { - dataReject: any; -}) { +export default function AdminDonasi_TableReject() { return ( <> - + ); } -function TableStatus({ dataReject }: { dataReject: any }) { +function TableStatus() { const router = useRouter(); const [opened, { open, close }] = useDisclosure(false); const [isLoading, setLoading] = useState(false); const [idData, setIdData] = useState(""); - const [data, setData] = useState(dataReject.data); - const [isNPage, setNPage] = useState(dataReject.nPage); + const [data, setData] = useState(null); + const [isNPage, setNPage] = useState(1); const [isActivePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); - async function onSearch(s: string) { - setSearch(s); - const loadData = await adminDonasi_getListReject({ - page: 1, - search: s, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + + useShallowEffect(() => { + const loadInitialData = async () => { + try { + const response = await apiGetAdminDonasiByStatus({ + status: "Reject", + page: `${isActivePage}`, + search: isSearch + }) + + if (response?.success && response?.data.data) { + setData(response.data.data); + setNPage(response.data.nPage || 1); + } else { + console.error("Invalid data format recieved:", response); + setData([]); + } + } catch (error) { + clientLogger.error("Invalid data format recieved:", error); + setData([]); + } + } + loadInitialData(); + }, [isActivePage, isSearch]) + + + const onSearch = (searchTerm: string) => { + setSearch(searchTerm); + setActivePage(1); } - async function onPageClick(p: any) { - setActivePage(p); - const loadData = await adminDonasi_getListReject({ - search: isSearch, - page: p, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + const onPageClick = (page: number) => { + setActivePage(page); } - const TableRows = data.map((e, i) => ( - - -
{e?.Author?.username}
- - -
{e?.title}
- - -
- -
- - -
{e?.DonasiMaster_Ketegori.name}
- - -
{e?.DonasiMaster_Durasi.name} hari
- - -
- -
+ const renderTableBody = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data +
+ + + ) + } + return data.map((e, i) => ( + + +
{e?.Author?.username}
+ + +
{e?.title}
+ + +
+ +
+ + +
{e?.DonasiMaster_Ketegori.name}
+ + +
{e?.DonasiMaster_Durasi.name} hari
+ + +
+ +
+ + {/* */} + + + )); + } - {/* */} - - - )); return ( <> @@ -120,13 +148,13 @@ function TableStatus({ dataReject }: { dataReject: any }) { color={AdminColor.softBlue} component={ } - radius={"xl"} - placeholder="Masukan judul" - onChange={(val) => { - onSearch(val.currentTarget.value); - }} - /> + icon={} + radius={"xl"} + placeholder="Masukan judul" + onChange={(val) => { + onSearch(val.currentTarget.value); + }} + /> } /> {/* */} - - - - - - - - - - - - - - {TableRows} -
-
Username
-
-
Judul
-
-
Target
-
-
Ketegori
-
-
Durasi
-
-
Alasan
-
-
- {/* - */} -
- { - onPageClick(val); - }} - /> -
-
- + {!data ? ( + + ) : ( - {data.map((e, i) => ( + + + + + + + + + + + + + + + {renderTableBody()} +
+
Username
+
+
Judul
+
+
Target
+
+
Ketegori
+
+
Durasi
+
+
Alasan
+
+
+ {/* + */} +
+ { + onPageClick(val); + }} + /> +
+
+ )} + + {/* {data.map((e, i) => ( {i} - ))} + ))} */} ); } diff --git a/src/app_modules/admin/donasi/sub_menu/table_review.tsx b/src/app_modules/admin/donasi/sub_menu/table_review.tsx index f4c0f5be..c2325dec 100644 --- a/src/app_modules/admin/donasi/sub_menu/table_review.tsx +++ b/src/app_modules/admin/donasi/sub_menu/table_review.tsx @@ -16,6 +16,7 @@ import { ScrollArea, Stack, Table, + Text, TextInput, Title, } from "@mantine/core"; @@ -28,28 +29,28 @@ import ComponentAdminGlobal_HeaderTamplate from "../../_admin_global/header_tamp import adminDonasi_getListReview from "../fun/get/get_list_review"; import { ComponentAdminGlobal_TitlePage } from "../../_admin_global/_component"; import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { apiGetAdminDonasiByStatus } from "../lib/api_fetch_admin_donasi"; +import { error } from "console"; +import { clientLogger } from "@/util/clientLogger"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export default function AdminDonasi_TableReview({ - listReview, -}: { - listReview: MODEL_DONASI[]; -}) { +export default function AdminDonasi_TableReview() { return ( <> - + ); } -function TableStatus({ listReview }: { listReview: any }) { +function TableStatus() { const router = useRouter(); const [isLoading, setLoading] = useState(false); const [idData, setIdData] = useState(""); - const [data, setData] = useState(listReview.data); - const [isNPage, setNPage] = useState(listReview.nPage); + const [data, setData] = useState(null); + const [isNPage, setNPage] = useState(1); const [isActivePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); @@ -61,80 +62,100 @@ function TableStatus({ listReview }: { listReview: any }) { const [isLoadingReload, setLoadingReload] = useState(false); useShallowEffect(() => { - if (isAdminDonasi_TriggerReview) { - setIsShowReload(true); + loadInitialData(); + }, [isActivePage, isSearch]); + + const loadInitialData = async () => { + try { + const response = await apiGetAdminDonasiByStatus({ + status: "Review", + page: `${isActivePage}`, + search: isSearch + }) + console.log("IniData", response) + + if (response?.success && response?.data?.data) { + setData(response.data.data); + setNPage(response.data.nPage || 1); + } else { + console.error("Invalid data format received:", response); + setData([]); + } + } catch (error) { + clientLogger.error("Error get data table publish", error); + setData([]); } - }, [isAdminDonasi_TriggerReview, setIsShowReload]); - + } async function onLoadData() { - const loadData = await adminDonasi_getListReview({ page: 1 }); - - setData(loadData.data as any); - setNPage(loadData.nPage); + loadInitialData(); setLoadingReload(false); setIsShowReload(false); setIsAdminDonasi_TriggerReview(false); } - async function onSearch(s: string) { - setSearch(s); - const loadData = await adminDonasi_getListReview({ - page: 1, - search: s, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + const onSearch = async (searchTerm: string) => { + setSearch(searchTerm); + setActivePage(1); } - async function onPageClick(p: any) { - setActivePage(p); - const loadData = await adminDonasi_getListReview({ - search: isSearch, - page: p, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + const onPageClick = (page: number) => { + setActivePage(page); + } + + const renderTableBody = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data +
+ + + ) + } + + return data.map((e, i) => ( + + +
{e?.Author?.username}
+ + +
{e?.title}
+ + +
+ +
+ + +
{e?.DonasiMaster_Ketegori.name}
+ + +
{e?.DonasiMaster_Durasi.name} hari
+ + +
+ +
+ + + )); } - const TableRows = data.map((e, i) => ( - - -
{e?.Author?.username}
- - -
{e?.title}
- - -
- -
- - -
{e?.DonasiMaster_Ketegori.name}
- - -
{e?.DonasiMaster_Durasi.name} hari
- - -
- -
- - - )); return ( <> @@ -142,7 +163,7 @@ function TableStatus({ listReview }: { listReview: any }) { {/*
{JSON.stringify(listUser, null, 2)}
*/} } @@ -170,74 +191,77 @@ function TableStatus({ listReview }: { listReview: any }) { }} /> */} + {!data ? ( + + ) : ( + + {isShowReload && ( + +
+ +
+
+ )} + + + + + + + + + + + + + {renderTableBody()} +
+
Username
+
+
Judul
+
+
Target
+
+
Ketegori
+
+
Durasi
+
+
Aksi
+
+
+
+ { + onPageClick(val); + }} + /> +
+
+ )} - - {isShowReload && ( - -
- -
-
- )} - - - - - - - - - - - - - {TableRows} -
-
Username
-
-
Judul
-
-
Target
-
-
Ketegori
-
-
Durasi
-
-
Aksi
-
-
-
- { - onPageClick(val); - }} - /> -
-
); diff --git a/src/app_modules/admin/event/_view/view_table_review.tsx b/src/app_modules/admin/event/_view/view_table_review.tsx index f8b4b54e..7f1dce9b 100644 --- a/src/app_modules/admin/event/_view/view_table_review.tsx +++ b/src/app_modules/admin/event/_view/view_table_review.tsx @@ -49,6 +49,7 @@ import adminNotifikasi_funCreateToUser from "../../notifikasi/fun/create/fun_cre import { adminEvent_funGetListReview } from "../fun"; import { AdminEvent_funEditStatusPublishById } from "../fun/edit/fun_edit_status_publish_by_id"; import { AdminEvent_funEditCatatanById } from "../fun/edit/fun_edit_status_reject_by_id"; +import { AdminColor } from "@/app_modules/_global/color/color_pallet"; export default function AdminEvent_ComponentTableReview() { const [data, setData] = useState(null); @@ -261,28 +262,28 @@ export default function AdminEvent_ComponentTableReview() { return data.map((e, i) => ( -
+
{e?.Author?.username}
-
+
{e.title}
-
+
{e.lokasi}
-
+
{e.EventMaster_TipeAcara.name}
-
+
{new Intl.DateTimeFormat("id-ID", { dateStyle: "full", @@ -297,7 +298,7 @@ export default function AdminEvent_ComponentTableReview() {
-
+
{new Intl.DateTimeFormat("id-ID", { dateStyle: "full", @@ -313,7 +314,7 @@ export default function AdminEvent_ComponentTableReview() { -
+
) : ( - + {isShowReload && (
@@ -416,35 +417,33 @@ export default function AdminEvent_ComponentTableReview() { horizontalSpacing={"md"} p={"md"} w={1500} - striped - highlightOnHover > -
Username
+
Username
-
Judul
+
Judul
-
Lokasi
+
Lokasi
-
Tipe Acara
+
Tipe Acara
-
Tanggal & Waktu Mulai
+
Tanggal & Waktu Mulai
-
Tanggal & Waktu Selesai
+
Tanggal & Waktu Selesai
-
Deskripsi
+
Deskripsi
-
Aksi
+
Aksi
diff --git a/src/app_modules/admin/event/table_status/table_reject.tsx b/src/app_modules/admin/event/table_status/table_reject.tsx index d3d52ae0..0678bfe9 100644 --- a/src/app_modules/admin/event/table_status/table_reject.tsx +++ b/src/app_modules/admin/event/table_status/table_reject.tsx @@ -137,20 +137,20 @@ function TableStatus() { return data.map((e, i) => ( -
{e?.Author?.username}
+
{e?.Author?.username}
-
{e.title}
+
{e.title}
-
{e.lokasi}
+
{e.lokasi}
-
{e.EventMaster_TipeAcara.name}
+
{e.EventMaster_TipeAcara.name}
-
+
{new Intl.DateTimeFormat("id-ID", { dateStyle: "full", @@ -165,7 +165,7 @@ function TableStatus() {
-
+
{new Intl.DateTimeFormat("id-ID", { dateStyle: "full", @@ -181,7 +181,7 @@ function TableStatus() { -
+
{" "} -
+
) : ( - + diff --git a/src/app_modules/admin/investasi/_lib/api_fetch_admin_investasi.ts b/src/app_modules/admin/investasi/_lib/api_fetch_admin_investasi.ts new file mode 100644 index 00000000..55a1ddab --- /dev/null +++ b/src/app_modules/admin/investasi/_lib/api_fetch_admin_investasi.ts @@ -0,0 +1,51 @@ +export { + apiGetAdminInvestasiCountDashboard, + apiGetAdminInvestasiByStatus, +} +const apiGetAdminInvestasiCountDashboard = async ({ name }: + { name: "Publish" | "Review" | "Reject" }) => { + + + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + + const response = await fetch(`/api/admin/investasi/dashboard/${name}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }) + + return await response.json().catch(() => null); +}; + +const apiGetAdminInvestasiByStatus = async ({ status, page, search }: { + status: "Publish" | "Review" | "Reject", + page: string, + search: string +}) => { + console.log("dgsdg") + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + console.log("Ini token", token) + console.log("Ini Page", page) + console.log("Ini Search", search) + + + const isPage = page ? `?page=${page}` : ""; + const isSearch = search ? `&search=${search}` : ""; + const response = await fetch(`/api/admin/investasi/${status}${isPage}${isSearch}`, { + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }) + console.log("Ini response", response) + return await response.json().catch(() => null); +} \ No newline at end of file diff --git a/src/app_modules/admin/investasi/_lib/api_fetch_count_status.ts b/src/app_modules/admin/investasi/_lib/api_fetch_count_status.ts deleted file mode 100644 index ed19bd40..00000000 --- a/src/app_modules/admin/investasi/_lib/api_fetch_count_status.ts +++ /dev/null @@ -1,22 +0,0 @@ -const apiGetInvestasiCountDashboard = async ({ name }: - { name: "Publish" | "Review" | "Reject" }) => { - - - const { token } = await fetch("/api/get-cookie").then((res) => res.json()); - if (!token) return await token.json().catch(() => null); - - - const response = await fetch(`/api/admin/investasi/dashboard/${name}`, { - method: "GET", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - "Access-Control-Allow-Origin": "*", - Authorization: `Bearer ${token}`, - }, - }) - - return await response.json().catch(() => null); -}; - -export default apiGetInvestasiCountDashboard; \ No newline at end of file diff --git a/src/app_modules/admin/investasi/main/table_publish.tsx b/src/app_modules/admin/investasi/main/table_publish.tsx index 0d7252f1..dd0c4dbd 100644 --- a/src/app_modules/admin/investasi/main/table_publish.tsx +++ b/src/app_modules/admin/investasi/main/table_publish.tsx @@ -25,108 +25,141 @@ import { adminInvestasi_funGetAllPublish } from "../fun/get/get_all_publish"; import { ComponentAdminGlobal_TitlePage } from "../../_admin_global/_component"; import { MainColor } from "@/app_modules/_global/color"; import { AccentColor, AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { apiGetAdminInvestasiByStatus } from "../_lib/api_fetch_admin_investasi"; +import { useShallowEffect } from "@mantine/hooks"; +import { clientLogger } from "@/util/clientLogger"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export default function Admin_TablePublishInvestasi({ - dataInvestsi, -}: { - dataInvestsi: MODEL_INVESTASI[]; -}) { +export default function Admin_TablePublishInvestasi() { return ( <> - + {/*
{JSON.stringify(listPublish, null, 2)}
*/}
); } -function TableView({ listData }: { listData: any }) { +function TableView() { const router = useRouter(); - const [data, setData] = useState(listData.data); - const [nPage, setNPage] = useState(listData.nPage); + const [data, setData] = useState(null); + const [nPage, setNPage] = useState(1); const [activePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); const [isLoading, setLoading] = useState(false); const [idData, setIdData] = useState(""); + const [origin, setOrigin] = useState(""); - async function onSearch(s: string) { - setSearch(s); + useShallowEffect(() => { + if (typeof window !== "undefined") { + setOrigin(window.location.origin); + } + }, []) + + useShallowEffect(() => { + const loadInitialData = async () => { + try { + const response = await apiGetAdminInvestasiByStatus({ + status: "Publish", + page: `${activePage}`, + search: isSearch, + }); + + if (response?.success && response?.data?.data) { + setData(response.data.data); + setNPage(response.data.nPage || 1); + } else { + console.error("Invalid data format received:", response); + setData([]); + } + } catch (error) { + clientLogger.error("Error get data table publish", error); + setData([]); + } + }; + + loadInitialData(); + }, [activePage, isSearch]); + const onSearch = async (searchTerm: string) => { + setSearch(searchTerm); setActivePage(1); - const loadData = await adminInvestasi_funGetAllPublish({ - page: 1, - search: s, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); } - async function onPageClick(p: any) { - setActivePage(p); - const loadData = await adminInvestasi_funGetAllPublish({ - search: isSearch, - page: p, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + const onPageClick = (page: number) => { + setActivePage(page) } - const tableBody = data.map((e) => ( - - - - - - - - - - )); + const renderTableBody = () => { + if(!Array.isArray(data) || data.length === 0) { + return ( + + + + ); + } + return data.map((e, i) => ( + + + + + + + + + + )); + } + return ( <> @@ -164,8 +197,8 @@ function TableView({ listData }: { listData: any }) { /> */} - {_.isEmpty(data) ? ( - + {!data ? ( + ) : ( @@ -203,7 +236,7 @@ function TableView({ listData }: { listData: any }) { - {tableBody} + {renderTableBody()}
-
Username
+
Username
-
Judul
+
Judul
-
Lokasi
+
Lokasi
-
Tipe Acara
+
Tipe Acara
-
Tanggal & Waktu Mulai
+
Tanggal & Waktu Mulai
-
Tanggal & Waktu Selesai
+
Tanggal & Waktu Selesai
-
Cacatan
+
Cacatan
-
Deskripsi
+
Deskripsi
-
Aksi
+
Aksi
-
- {e.author.username} -
-
-
- {e.title} -
-
-
{_.toNumber(e.progress).toFixed(2)} %
-
-
- {new Intl.NumberFormat("id-ID", { - maximumFractionDigits: 10, - }).format(+e.sisaLembar)} -
-
-
- {new Intl.NumberFormat("id-ID", { - maximumFractionDigits: 10, - }).format(+e.totalLembar)} -
-
-
- {e.Investasi_Invoice.length} -
-
-
- -
-
+
+ Tidak ada data +
+
+
+ {e.author.username} +
+
+
+ {e.title} +
+
+
{_.toNumber(e.progress).toFixed(2)} %
+
+
+ {new Intl.NumberFormat("id-ID", { + maximumFractionDigits: 10, + }).format(+e.sisaLembar)} +
+
+
+ {new Intl.NumberFormat("id-ID", { + maximumFractionDigits: 10, + }).format(+e.totalLembar)} +
+
+
+ {e.Investasi_Invoice.length} +
+
+
+ +
+
diff --git a/src/app_modules/admin/investasi/main/table_reject.tsx b/src/app_modules/admin/investasi/main/table_reject.tsx index 9d81340c..b5d60ce4 100644 --- a/src/app_modules/admin/investasi/main/table_reject.tsx +++ b/src/app_modules/admin/investasi/main/table_reject.tsx @@ -31,162 +31,186 @@ import { RouterAdminInvestasi } from "@/app/lib/router_admin/router_admin_invest import { ComponentAdminGlobal_TitlePage } from "../../_admin_global/_component"; import { MainColor } from "@/app_modules/_global/color"; import { AccentColor, AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { useShallowEffect } from "@mantine/hooks"; +import { clientLogger } from "@/util/clientLogger"; +import { apiGetAdminInvestasiByStatus } from "../_lib/api_fetch_admin_investasi"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export default function Admin_TableRejectInvestasi({ - dataInvestsi, -}: { - dataInvestsi: any[]; -}) { - const [investasi, setInvestasi] = useState(dataInvestsi); - const router = useRouter(); - +export default function Admin_TableRejectInvestasi() { return ( <> - + ); - const tableBody = investasi.map((e) => - e.MasterStatusInvestasi.id === "4" ? ( - - - - - {e.author.username} - - - {_.capitalize(e.title)} - {e.catatan} - -
- - - router.push(RouterAdminInvestasi_OLD.konfirmasi + `${e.id}`) - } - > - - - -
- - - ) : ( - "" - ) - ); + // const tableBody = investasi.map((e) => + // e.MasterStatusInvestasi.id === "4" ? ( + // + // + // + // + // {e.author.username} + // + // + // {_.capitalize(e.title)} + // {e.catatan} + // + //
+ // + // + // router.push(RouterAdminInvestasi_OLD.konfirmasi + `${e.id}`) + // } + // > + // + // + // + //
+ // + // + // ) : ( + // "" + // ) + // ); - return ( - <> - - router.push(RouterAdminInvestasi_OLD.main_investasi)} - > - - - - - - Reject - - - - - - - - - - - {tableBody} -
UsernameNama Proyek InvestasiCatatan -
Aksi
-
-
-
-
- - ); + // return ( + // <> + // + // router.push(RouterAdminInvestasi_OLD.main_investasi)} + // > + // + // + // + // + // + // Reject + // + // + // + // + // + // + // + // + // + // + // {tableBody} + //
UsernameNama Proyek InvestasiCatatan + //
Aksi
+ //
+ //
+ //
+ //
+ // + // ); } -function TableView({ listData }: { listData: any }) { +function TableView() { const router = useRouter(); - const [data, setData] = useState(listData.data); - const [nPage, setNPage] = useState(listData.nPage); + const [data, setData] = useState (null); + const [nPage, setNPage] = useState(1); const [activePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); const [isLoading, setLoading] = useState(false); const [idData, setIdData] = useState(""); - async function onSearch(s: string) { - setSearch(s); + + useShallowEffect(() => { + const loadInitialData = async () => { + try { + const response = await apiGetAdminInvestasiByStatus({ + status: "Reject", + page: `${activePage}`, + search: isSearch, + }); + + if (response?.success && response?.data.data) { + setData(response.data.data); + setNPage(response.data.nPage || 1); + } else { + console.error("Invalid data format recieved:", response); + setData([]); + } + } catch (error) { + clientLogger.error("Error get data reject", error); + setData([]); + } + } + loadInitialData(); + }, [activePage, isSearch]); + const onSearch = async (searchTerm: string) => { + setSearch(searchTerm); setActivePage(1); - const loadData = await adminInvestasi_funGetAllReject({ - page: 1, - search: s, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); } - async function onPageClick(p: any) { - setActivePage(p); - const loadData = await adminInvestasi_funGetAllReject({ - search: isSearch, - page: p, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + async function onPageClick(page: number) { + setActivePage(page); } - const tableBody = data.map((e) => ( - - -
- {e.author.username} -
- - -
- {e.title} -
- - -
- {e.catatan} -
- + const renderTableBody = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data +
+ + + ) + } + return data.map((e, i) => ( + + +
+ {e.author.username} +
+ + +
+ {e.title} +
+ + +
+ {e.catatan} +
+ + + +
+ +
+ + + )); + } - -
- -
- - - )); + return ( <> @@ -224,8 +248,8 @@ function TableView({ listData }: { listData: any }) { /> */} - {_.isEmpty(data) ? ( - + {!data ? ( + ) : ( @@ -253,7 +277,7 @@ function TableView({ listData }: { listData: any }) { - {tableBody} + {renderTableBody()}
diff --git a/src/app_modules/admin/investasi/main/table_review.tsx b/src/app_modules/admin/investasi/main/table_review.tsx index fc210299..6ee348ab 100644 --- a/src/app_modules/admin/investasi/main/table_review.tsx +++ b/src/app_modules/admin/investasi/main/table_review.tsx @@ -30,26 +30,25 @@ import ComponentAdminGlobal_TampilanRupiahDonasi from "../../_admin_global/tampi import { adminInvestasi_funGetAllReview } from "../fun/get/get_all_review"; import { ComponentAdminGlobal_TitlePage } from "../../_admin_global/_component"; import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { apiGetAdminInvestasiByStatus } from "../_lib/api_fetch_admin_investasi"; +import { clientLogger } from "@/util/clientLogger"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export default function Admin_TableReviewInvestasi({ - dataInvestsi, -}: { - dataInvestsi: any[]; -}) { +export default function Admin_TableReviewInvestasi() { return ( <> - + ); } -function TableView({ listData }: { listData: any }) { +function TableView() { const router = useRouter(); - const [data, setData] = useState(listData.data); - const [nPage, setNPage] = useState(listData.nPage); + const [data, setData] = useState(null); + const [nPage, setNPage] = useState(1); const [activePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); const [isLoading, setLoading] = useState(false); @@ -62,94 +61,108 @@ function TableView({ listData }: { listData: any }) { const [isLoadingReload, setLoadingReload] = useState(false); useShallowEffect(() => { - if (isAdminInvestasi_TriggerReview) { - setIsShowReload(false); - setIsAdminInvestasi_TriggerReview(false) - } - }, [isAdminInvestasi_TriggerReview]); + loadInitialData(); + }, [activePage, isSearch]); + const loadInitialData = async () => { + try { + const response = await apiGetAdminInvestasiByStatus({ + status: "Review", + page: `${activePage}`, + search: isSearch, + }); + if (response?.success && response?.data?.data) { + setData(response.data.data) + setNPage(response.data.nPage || 1) + } else { + console.error("Invalid data format received:", response); + setData([]); + } + } catch (error) { + clientLogger.error("Error get data table review", error); + setData([]); + } + } + const onSearch = async (searchTerm: string) => { + setSearch(searchTerm); + setActivePage(1); + } + + const onPageClick = (page: number) => { + setActivePage(page); + } async function onLoadData() { - const loadData = await adminInvestasi_funGetAllReview({ page: 1 }); - setData(loadData.data as any); - setNPage(loadData.nPage); - setLoadingReload(false); + loadInitialData(); + setLoading(false); setIsShowReload(false); setIsAdminInvestasi_TriggerReview(false); } - async function onSearch(s: string) { - setSearch(s); - setActivePage(1); - const loadData = await adminInvestasi_funGetAllReview({ - page: 1, - search: s, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + const renderTableBody = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data +
+ + + ) + } + return data.map((e, i) => ( + + +
+ {e.author.username} +
+ + +
+ {e.title} +
+ + +
+ {e.roi} % +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + )); } - async function onPageClick(p: any) { - setActivePage(p); - const loadData = await adminInvestasi_funGetAllReview({ - search: isSearch, - page: p, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); - } - - const tableBody = data.map((e) => ( - - -
- {e.author.username} -
- - -
- {e.title} -
- - -
- {e.roi} % -
- - -
- -
- - -
- -
- - -
- -
- - - )); - return ( <> @@ -158,13 +171,13 @@ function TableView({ listData }: { listData: any }) { color={AdminColor.softBlue} component={ } - radius={"xl"} - placeholder="Cari nama proyek" - onChange={(val) => { - onSearch(val.currentTarget.value); - }} - /> + icon={} + radius={"xl"} + placeholder="Cari nama proyek" + onChange={(val) => { + onSearch(val.currentTarget.value); + }} + /> } /> {/* */} - {_.isEmpty(data) ? ( - + {!data ? ( + ) : ( {isShowReload && ( @@ -245,7 +258,7 @@ function TableView({ listData }: { listData: any }) { - {tableBody} + {renderTableBody()}
diff --git a/src/app_modules/admin/investasi/main/view.tsx b/src/app_modules/admin/investasi/main/view.tsx index c27312dc..ddeda2f3 100644 --- a/src/app_modules/admin/investasi/main/view.tsx +++ b/src/app_modules/admin/investasi/main/view.tsx @@ -50,7 +50,8 @@ import { clientLogger } from "@/util/clientLogger"; import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; import global_limit from "@/app/lib/limit"; import { useShallowEffect } from "@mantine/hooks"; -import apiGetInvestasiCountDashboard from "../_lib/api_fetch_count_status"; +import { apiGetAdminInvestasiCountDashboard } from "../_lib/api_fetch_admin_investasi"; + export default function Admin_Investasi({ listInvestasi, @@ -88,7 +89,7 @@ export default function Admin_Investasi({ async function onLoadCountPublish() { try { - const response = await apiGetInvestasiCountDashboard({ + const response = await apiGetAdminInvestasiCountDashboard({ name: "Publish", }); @@ -103,7 +104,7 @@ export default function Admin_Investasi({ } async function onLoadCountReview() { try { - const response = await apiGetInvestasiCountDashboard({ + const response = await apiGetAdminInvestasiCountDashboard({ name: "Review", }); @@ -116,7 +117,7 @@ export default function Admin_Investasi({ } async function onLoadCountReject() { try { - const response = await apiGetInvestasiCountDashboard({ + const response = await apiGetAdminInvestasiCountDashboard({ name: "Reject", }); diff --git a/src/app_modules/auth/_lib/api_fetch_auth.ts b/src/app_modules/auth/_lib/api_fetch_auth.ts new file mode 100644 index 00000000..0bd42e65 --- /dev/null +++ b/src/app_modules/auth/_lib/api_fetch_auth.ts @@ -0,0 +1,73 @@ +export { + apiFetchLogin, + apiGetCheckCodeOtp, + apiPostVerifikasiCodeOtp, + apiDeleteAktivasiKodeOtpByNomor, + apiFetchRegister, +}; + +const apiFetchLogin = async ({ nomor }: { nomor: string }) => { + const respone = await fetch("/api/auth/login", { + method: "POST", + body: JSON.stringify({ nomor: nomor }), + headers: { + "Content-Type": "application/json", + }, + }); + + return await respone.json().catch(() => null); +}; + +const apiGetCheckCodeOtp = async ({ id }: { id: string }) => { + const respone = await fetch(`/api/auth/check/${id}`); + + return await respone.json().catch(() => null); +}; + +const apiPostVerifikasiCodeOtp = async ({ nomor }: { nomor: string }) => { + const respone = await fetch("/api/auth/validasi", { + method: "POST", + body: JSON.stringify({ nomor: nomor }), + headers: { + "Content-Type": "application/json", + }, + }); + + return await respone.json().catch(() => null); +}; + +const apiDeleteAktivasiKodeOtpByNomor = async ({ id }: { id: string }) => { + const respone = await fetch(`/api/auth/code/${id}`, { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + }); + + return await respone.json().catch(() => null); +}; + +const apiFetchRegister = async ({ + nomor, + username, +}: { + nomor: string; + username: string; +}) => { + const data = { + username: username, + nomor: nomor, + }; + const respone = await fetch("/api/auth/register", { + method: "POST", + body: JSON.stringify({ data }), + headers: { + "Content-Type": "application/json", + }, + }); + + const result = await respone.json(); + + return result; + // return await respone.json().catch(() => null); +}; diff --git a/src/app_modules/auth/login/view.tsx b/src/app_modules/auth/login/view.tsx index 538b1280..f3b28d7f 100644 --- a/src/app_modules/auth/login/view.tsx +++ b/src/app_modules/auth/login/view.tsx @@ -17,6 +17,7 @@ import { useRouter } from "next/navigation"; import { useState } from "react"; import { PhoneInput } from "react-international-phone"; import "react-international-phone/style.css"; +import { apiFetchLogin } from "../_lib/api_fetch_auth"; export default function Login({ version }: { version: string }) { const router = useRouter(); @@ -30,33 +31,20 @@ export default function Login({ version }: { version: string }) { try { setLoading(true); - const res = await fetch("/api/auth/login", { - method: "POST", - body: JSON.stringify({ nomor: nomor }), - headers: { - "Content-Type": "application/json", - }, - }); + const respone = await apiFetchLogin({ nomor: nomor }); - const result = await res.json(); - - if (res.status == 500) { - ComponentGlobal_NotifikasiGagal("Server Error"); - return; - } - - if (res.status === 200) { - localStorage.setItem("hipmi_auth_code_id", result.kodeId); - ComponentGlobal_NotifikasiBerhasil(result.message, 2000); + if (respone) { + localStorage.setItem("hipmi_auth_code_id", respone.kodeId); + ComponentGlobal_NotifikasiBerhasil(respone.message, 2000); router.push("/validasi", { scroll: false }); } else { - ComponentGlobal_NotifikasiPeringatan(result.message); + setLoading(false); + ComponentGlobal_NotifikasiPeringatan(respone.message); } } catch (error) { + setLoading(false); clientLogger.error("Error login:", error); ComponentGlobal_NotifikasiGagal("Terjadi Kesalahan"); - } finally { - setLoading(false); } } diff --git a/src/app_modules/auth/register/view.tsx b/src/app_modules/auth/register/view.tsx index 37276b59..4b56e8c0 100644 --- a/src/app_modules/auth/register/view.tsx +++ b/src/app_modules/auth/register/view.tsx @@ -5,7 +5,7 @@ import ComponentGlobal_ErrorInput from "@/app_modules/_global/component/error_in import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global/notifikasi_peringatan"; import { UIGlobal_LayoutDefault } from "@/app_modules/_global/ui"; -import { Button, Stack, Text, TextInput, Title } from "@mantine/core"; +import { Button, Center, Stack, Text, TextInput, Title } from "@mantine/core"; import { useFocusTrap, useShallowEffect } from "@mantine/hooks"; import { IconUserCircle } from "@tabler/icons-react"; import _ from "lodash"; @@ -14,6 +14,13 @@ import { useState } from "react"; import { auth_funDeleteAktivasiKodeOtpByNomor } from "../fun/fun_edit_aktivasi_kode_otp_by_id"; import Register_SkeletonView from "./skeleton"; import { clientLogger } from "@/util/clientLogger"; +import { + apiDeleteAktivasiKodeOtpByNomor, + apiFetchRegister, + apiGetCheckCodeOtp, +} from "../_lib/api_fetch_auth"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global"; export default function Register() { const router = useRouter(); @@ -22,76 +29,52 @@ export default function Register() { const [isValue, setIsValue] = useState(false); const focusTrapRef = useFocusTrap(); const [loading, setLoading] = useState(false); + const [idCode, setIdCode] = useState(""); useShallowEffect(() => { const kodeId = localStorage.getItem("hipmi_auth_code_id"); if (kodeId != null) { - onCheckAuthCode({ kodeId: kodeId as string, onSetData: setNomor }); + onCheckAuthCode({ kodeId: kodeId as string }); } else { console.log("code id not found"); } - }, [setNomor]); + }, []); - async function onCheckAuthCode({ - kodeId, - onSetData, - }: { - kodeId: string; - onSetData: any; - }) { - const res = await fetch(`/api/auth/check?id=${kodeId}`); - const result = await res.json(); - - onSetData(result.nomor); + async function onCheckAuthCode({ kodeId }: { kodeId: string }) { + try { + const respone = await apiGetCheckCodeOtp({ id: kodeId }); + if (respone) { + setIdCode(kodeId); + setNomor(respone.nomor); + } + } catch (error) { + clientLogger.error("Error onCheckAuthCode:", error); + } } async function onRegistarsi() { - const data = { - username: value, - nomor: nomor, - }; - try { setLoading(true); - const res = await fetch("/api/auth/register", { - method: "POST", - body: JSON.stringify({ - data, - }), - headers: { - "Content-Type": "application/json", - }, - }); - - const result = await res.json(); - - if (res.status === 200) { - ComponentGlobal_NotifikasiBerhasil(result.message); - localStorage.removeItem("hipmi_auth_code_id"); - await auth_funDeleteAktivasiKodeOtpByNomor({ - nomor: data.nomor, - }); + const respone = await apiFetchRegister({ nomor: nomor, username: value }); + if (respone.success) { router.push("/waiting-room", { scroll: false }); - return; - } + ComponentGlobal_NotifikasiBerhasil(respone.message); - if (res.status === 400) { - setLoading(false); - ComponentGlobal_NotifikasiPeringatan(result.message); - return; - } + try { + const responeDelete = await apiDeleteAktivasiKodeOtpByNomor({ + id: idCode, + }); - if (res.status === 405) { + if (responeDelete) { + localStorage.removeItem("hipmi_auth_code_id"); + } + } catch (error) { + clientLogger.error("Error apiDeleteAktivasiKodeOtpByNomor:", error); + } + } else { setLoading(false); - ComponentGlobal_NotifikasiPeringatan(result.message); - return; - } - - if (res.status === 500) { - setLoading(false); - ComponentGlobal_NotifikasiPeringatan(result.message); - return; + ComponentGlobal_NotifikasiPeringatan(respone.message); } } catch (error) { setLoading(false); @@ -102,71 +85,76 @@ export default function Register() { return ( <> - {nomor == "" ? ( - - ) : ( - - - REGISTRASI - + + + REGISTRASI + - + - + + - Anda akan terdaftar dengan nomor berikut{" "} - + Anda akan terdaftar dengan nomor + + {nomor == "" ? ( +
+ +
+ ) : ( + +{nomor} -
- 0 && value.length < 5 ? ( - - ) : _.values(value).includes(" ") ? ( - - - - - ) : isValue ? ( - - ) : ( - "" - ) + )} +
+ 0 && value.length < 5 ? ( + + ) : _.values(value).includes(" ") ? ( + + + + + ) : isValue ? ( + + ) : ( + "" + ) + } + onChange={(val) => { + val.currentTarget.value.length > 0 ? setIsValue(false) : ""; + setValue(val.currentTarget.value); + }} + /> + + - + > + DAFTAR +
- )} +
); diff --git a/src/app_modules/auth/validasi/view.tsx b/src/app_modules/auth/validasi/view.tsx index 65b603b9..5c966d58 100644 --- a/src/app_modules/auth/validasi/view.tsx +++ b/src/app_modules/auth/validasi/view.tsx @@ -1,7 +1,6 @@ "use client"; import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin"; -import { RouterHome } from "@/app/lib/router_hipmi/router_home"; import { AccentColor, MainColor, @@ -10,8 +9,11 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/_global/notif_ import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global/notifikasi_peringatan"; import { UIGlobal_LayoutDefault } from "@/app_modules/_global/ui"; import { + ActionIcon, + Box, Button, Center, + Group, Loader, PinInput, Stack, @@ -23,9 +25,14 @@ import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global"; -import { auth_funDeleteAktivasiKodeOtpByNomor } from "../fun/fun_edit_aktivasi_kode_otp_by_id"; -import Validasi_SkeletonView from "./skeleton"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; import { clientLogger } from "@/util/clientLogger"; +import { IconChevronLeft } from "@tabler/icons-react"; +import { + apiDeleteAktivasiKodeOtpByNomor, + apiGetCheckCodeOtp, + apiPostVerifikasiCodeOtp, +} from "../_lib/api_fetch_auth"; export default function Validasi() { const router = useRouter(); @@ -35,6 +42,7 @@ export default function Validasi() { const [counter, setCounter] = useState(60); const [loadingResend, setLoadingResend] = useState(false); const [triggerOtp, setTriggerOtp] = useState(false); + const [idCode, setIdCode] = useState(""); const [data, setData] = useState({ nomor: "", @@ -61,20 +69,26 @@ export default function Validasi() { }, [triggerOtp]); async function onCheckAuthCode({ kodeId }: { kodeId: string }) { - const res = await fetch(`/api/auth/check?id=${kodeId}`); - const result = await res.json(); + try { + const respone = await apiGetCheckCodeOtp({ id: kodeId }); - setData({ - nomor: result.nomor, - code: result.otp, - }); + if (respone) { + setIdCode(kodeId); + setData({ + nomor: respone.nomor, + code: respone.otp, + }); + } + } catch (error) { + clientLogger.error("Error onCheckAuthCode:", error); + } } useEffect(() => { counter > 0 && setTimeout(() => setCounter(counter - 1), 1000); }, [counter]); - async function onVerifikasi() { + async function onSubmitVerifikasi() { if (!inputCode) return ComponentGlobal_NotifikasiPeringatan("Lengkapi Kode"); if (data.code != inputCode) @@ -82,65 +96,51 @@ export default function Validasi() { try { setLoading(true); - const res = await fetch("/api/auth/validasi", { - method: "POST", - body: JSON.stringify({ - nomor: data.nomor, - }), - }); + const respone = await apiPostVerifikasiCodeOtp({ nomor: data.nomor }); - const result = await res.json(); + if (respone && respone.success == true) { + if (respone.roleId == "1") { + router.push("/login", { scroll: false }); + ComponentGlobal_NotifikasiBerhasil(respone.message); + } else if (respone.roleId != "1") { + router.push(RouterAdminDashboard.splash_admin, { scroll: false }); + ComponentGlobal_NotifikasiBerhasil("Admin berhasil login"); + } - if (res.status === 200 && result.roleId == "1") { - ComponentGlobal_NotifikasiBerhasil(result.message); - localStorage.removeItem("hipmi_auth_code_id"); - await auth_funDeleteAktivasiKodeOtpByNomor({ - nomor: data.nomor, - }); + try { + const responeDelete = await apiDeleteAktivasiKodeOtpByNomor({ + id: idCode, + }); - router.push(RouterHome.main_home, { scroll: false }); - return; - } - - if (res.status === 200 && result.roleId != "1") { - ComponentGlobal_NotifikasiBerhasil("Admin Logged in"); - localStorage.removeItem("hipmi_auth_code_id"); - await auth_funDeleteAktivasiKodeOtpByNomor({ - nomor: data.nomor, - }); - - router.push(RouterAdminDashboard.splash_admin, { scroll: false }); - return; - } - - if (res.status === 404) { - setLoading(false); + if (responeDelete) { + localStorage.removeItem("hipmi_auth_code_id"); + } + } catch (error) { + clientLogger.error("Error apiDeleteAktivasiKodeOtpByNomor:", error); + } + } else if (respone && respone.success == false) { router.push("/register", { scroll: false }); - ComponentGlobal_NotifikasiBerhasil(result.message); - return; - } - - if (res.status === 400) { - setLoading(false); - ComponentGlobal_NotifikasiPeringatan(result.message); - return; - } - - if (res.status == 500) { - setLoading(false); - ComponentGlobal_NotifikasiGagal(result.message); - return; + ComponentGlobal_NotifikasiBerhasil(respone.message); } } catch (error) { setLoading(false); clientLogger.error("Error validasi:", error); - } + } } async function onBack() { - localStorage.removeItem("hipmi_auth_code_id"); - await auth_funDeleteAktivasiKodeOtpByNomor({ nomor: data.nomor }); - router.back(); + try { + router.back(); + const responeDelete = await apiDeleteAktivasiKodeOtpByNomor({ + id: idCode, + }); + + if (responeDelete) { + localStorage.removeItem("hipmi_auth_code_id"); + } + } catch (error) { + clientLogger.error("Error apiDeleteAktivasiKodeOtpByNomor:", error); + } } async function onResendCode() { @@ -164,25 +164,22 @@ export default function Validasi() { setTriggerOtp(true); setCounter(60); setLoadingResend(false); - // router.push("/validasi", { scroll: false }); } else { setLoadingResend(false); ComponentGlobal_NotifikasiPeringatan(result.message); } } catch (error) { - console.error(error); + clientLogger.error(" Error onResend", error); setLoadingResend(false); ComponentGlobal_NotifikasiGagal("Terjadi Kesalahan"); } } - // console.log(data.code); - return ( <> - {/* onBack()}> - + {data && data.nomor !== "" ? ( + + ) : ( + "" + )} - */} - {data.nomor == "" && data.code == "" ? ( - - ) : ( - - - Verifikasi Kode OTP - + - - - Masukan 4 digit kode otp - - Yang dikirim ke{" "} - - {" "} + + + Verifikasi Kode OTP + + + + + Masukan 4 digit kode otp + + Yang dikirim ke + {data && data.nomor !== "" ? ( + +{data.nomor} - - -
- { - setInputOtp(val); - }} - /> -
+ ) : ( + + )} + +
+
+ { + setInputOtp(val); + }} + /> +
- + + Tidak menerima kode ?{" "} - {counter > 0 ? ( - + + {data && data.nomor !== "" ? ( + counter > 0 ? ( + {counter + "s"} ) : loadingResend ? ( ) : ( { onResendCode(); }} @@ -247,31 +251,36 @@ export default function Validasi() { > Kirim ulang - )} - - + ) + ) : ( + + )} + -
- )} + +
diff --git a/src/app_modules/event/component/detail/comp_box_sponsor.tsx b/src/app_modules/event/component/detail/comp_box_sponsor.tsx index 9505d1f6..5777ed70 100644 --- a/src/app_modules/event/component/detail/comp_box_sponsor.tsx +++ b/src/app_modules/event/component/detail/comp_box_sponsor.tsx @@ -1,9 +1,10 @@ -import { RouterEvent } from '@/app/lib/router_hipmi/router_event'; -import { AccentColor, MainColor } from '@/app_modules/_global/color'; -import { ActionIcon, Flex, Loader, Paper, Text } from '@mantine/core'; -import { IconStar } from '@tabler/icons-react'; -import { useParams, useRouter } from 'next/navigation'; -import { useState } from 'react'; +import { RouterEvent } from "@/app/lib/router_hipmi/router_event"; +import { AccentColor, MainColor } from "@/app_modules/_global/color"; +import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global"; +import { ActionIcon, Flex, Loader, Paper, Text } from "@mantine/core"; +import { IconStar } from "@tabler/icons-react"; +import { useParams, useRouter } from "next/navigation"; +import { useState } from "react"; function Event_ComponentBoxDaftarSponsor() { const router = useRouter(); @@ -20,11 +21,11 @@ function Event_ComponentBoxDaftarSponsor() { color: "white", }} onClick={() => { - setLoading(true); - router.push(RouterEvent.daftar_sponsor({ id: params.id }), { - scroll: false, - }); - // router.push(RouterInvestasi_OLD.detail_dokumen + investasiId, { scroll: false }); + // setLoading(true); + // router.push(RouterEvent.daftar_sponsor({ id: params.id }), { + // scroll: false, + // }); + ComponentGlobal_NotifikasiPeringatan("Fitur belum tersedia"); }} > diff --git a/src/app_modules/home/component/body_home.tsx b/src/app_modules/home/component/body_home.tsx index 9ecff402..8ffa4604 100644 --- a/src/app_modules/home/component/body_home.tsx +++ b/src/app_modules/home/component/body_home.tsx @@ -3,10 +3,10 @@ import { AccentColor, MainColor } from "@/app_modules/_global/color"; import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global"; import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; +import { clientLogger } from "@/util/clientLogger"; import { ActionIcon, Box, - Flex, Grid, Group, Image, @@ -22,40 +22,20 @@ import { useRouter } from "next/navigation"; import { useState } from "react"; import { apiGetDataHome } from "../fun/get/api_home"; import { listMenuHomeBody, menuHomeJob } from "./list_menu_home"; -import { clientLogger } from "@/util/clientLogger"; -export default function BodyHome() { +export default function BodyHome({ dataUser }: { dataUser: any | null }) { const router = useRouter(); - const [dataUser, setDataUser] = useState(null); const [dataJob, setDataJob] = useState(null); const [loadingJob, setLoadingJob] = useState(true); const [loading, setLoading] = useState(true); useShallowEffect(() => { - cekUserLogin(); getHomeJob(); }, []); - async function cekUserLogin() { - try { - const response = await apiGetDataHome({ - path: "?cat=cek_profile", - }); - - if (response) { - setDataUser(response.data); - } - } catch (error) { - clientLogger.error("Error get data profile", error); - } - } - - - async function getHomeJob() { try { setLoadingJob(true); - const response = await apiGetDataHome({ path: "?cat=job", }); @@ -101,21 +81,14 @@ export default function BodyHome() { border: `2px solid ${AccentColor.blue}`, }} onClick={() => { - if (dataUser == null) { + if (!dataUser) { return null; - } else if ( - Object.keys(dataUser).length == 0 || - dataJob?.length == null - ) { + } else if (dataUser.profile === undefined) { router.push(RouterProfile.create, { scroll: false }); + } else if (e.link == "") { + ComponentGlobal_NotifikasiPeringatan("Cooming Soon"); } else { - if (e.link == "") { - return ComponentGlobal_NotifikasiPeringatan( - "Cooming Soon !!" - ); - } else { - router.push(e.link, { scroll: false }); - } + router.push(e.link, { scroll: false }); } }} > @@ -147,21 +120,14 @@ export default function BodyHome() { > { - if (dataUser == null) { + if (!dataUser) { return null; - } else if ( - Object.keys(dataUser).length == 0 || - dataJob?.length == null - ) { + } else if (dataUser.profile === undefined) { router.push(RouterProfile.create, { scroll: false }); + } else if (menuHomeJob.link == "") { + ComponentGlobal_NotifikasiPeringatan("Cooming Soon "); } else { - if (menuHomeJob.link == "") { - return ComponentGlobal_NotifikasiPeringatan( - "Cooming Soon !!" - ); - } else { - return router.push(menuHomeJob.link, { scroll: false }); - } + router.push(menuHomeJob.link, { scroll: false }); } }} > diff --git a/src/app_modules/home/component/footer_home.tsx b/src/app_modules/home/component/footer_home.tsx index 87a6a4f2..f4187e24 100644 --- a/src/app_modules/home/component/footer_home.tsx +++ b/src/app_modules/home/component/footer_home.tsx @@ -1,6 +1,8 @@ import { APIs } from "@/app/lib"; import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; +import { MainColor } from "@/app_modules/_global/color"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; import { ActionIcon, Box, @@ -9,37 +11,14 @@ import { Stack, Text, } from "@mantine/core"; -import { useShallowEffect } from "@mantine/hooks"; -import { IconUserCircle } from "@tabler/icons-react"; import { useRouter } from "next/navigation"; -import { useState } from "react"; -import { apiGetDataHome } from "../fun/get/api_home"; import { Home_ComponentAvatarProfile } from "./comp_avatar_profile"; import { listMenuHomeFooter } from "./list_menu_home"; -import { MainColor } from "@/app_modules/_global/color"; -import { clientLogger } from "@/util/clientLogger"; -import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; +import { IconUser } from "@tabler/icons-react"; +import { IconUserCircle } from "@tabler/icons-react"; -export default function FooterHome() { +export default function FooterHome({ dataUser }: { dataUser: any | null }) { const router = useRouter(); - const [dataUser, setDataUser] = useState(null); - - useShallowEffect(() => { - cekUserLogin(); - }, []); - - async function cekUserLogin() { - try { - const response = await apiGetDataHome({ - path: "?cat=cek_profile", - }); - if (response) { - setDataUser(response.data); - } - } catch (error) { - clientLogger.error("Error get data profile", error); - } - } return ( - {dataUser == null ? ( - - {Array.from(new Array(4)).map((_, i) => ( -
- - - -
- ))} -
- ) : ( - - {listMenuHomeFooter.map((e) => ( -
- { - if (dataUser == null) { - return null; - } else if (Object.keys(dataUser).length === 0) { - router.push(RouterProfile.create, { scroll: false }); - } else { - if (e.link == "") { - ComponentGlobal_NotifikasiPeringatan("Cooming Soon"); - } else { - router.push(e.link, { scroll: false }); - } - } - }} - > - - {e.icon} - - - {e.name} - - -
- ))} - -
+ + {listMenuHomeFooter.map((e) => ( +
{ - if ( - dataUser.profile === undefined || - dataUser?.profile === null - ) { + if (!dataUser) { + return null; + } else if (dataUser.profile === undefined) { router.push(RouterProfile.create, { scroll: false }); + } else if (e.link == "") { + ComponentGlobal_NotifikasiPeringatan("Cooming Soon"); } else { + router.push(e.link, { scroll: false }); + } + }} + > + + {e.icon} + + + {e.name} + + +
+ ))} + +
+ + {!dataUser ? ( + + ) : dataUser.profile === undefined ? ( + + router.push(RouterProfile.create, { scroll: false }) + } + > + + + ) : ( + { router.push( RouterProfile.katalogOLD + `${dataUser?.profile}`, { scroll: false, } ); - } - }} - > - - {dataUser.profile === undefined || - dataUser?.profile === null ? ( - - ) : ( - - )} + }} + > + - - Profile - - -
-
- )} + )} + + Profile + + +
+
); } diff --git a/src/app_modules/home/view_home_new.tsx b/src/app_modules/home/view_home_new.tsx index 7673e2f2..c8728cf0 100644 --- a/src/app_modules/home/view_home_new.tsx +++ b/src/app_modules/home/view_home_new.tsx @@ -1,9 +1,11 @@ "use client"; import { API_RouteNotifikasi } from "@/app/lib/api_user_router/route_api_notifikasi"; import { gs_count_ntf, gs_user_ntf } from "@/app/lib/global_state"; +import global_limit from "@/app/lib/limit"; import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; import { RouterNotifikasi } from "@/app/lib/router_hipmi/router_notifikasi"; import { RouterUserSearch } from "@/app/lib/router_hipmi/router_user_search"; +import { clientLogger } from "@/util/clientLogger"; import { ActionIcon, Indicator, Text } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import { IconBell, IconUserSearch } from "@tabler/icons-react"; @@ -17,8 +19,6 @@ import { gs_notifikasi_kategori_app } from "../notifikasi/lib"; import BodyHome from "./component/body_home"; import FooterHome from "./component/footer_home"; import { apiGetDataHome } from "./fun/get/api_home"; -import { clientLogger } from "@/util/clientLogger"; -import CustomSkeleton from "../components/CustomSkeleton"; export default function HomeViewNew() { const [countNtf, setCountNtf] = useAtom(gs_count_ntf); @@ -27,10 +27,6 @@ export default function HomeViewNew() { const [categoryPage, setCategoryPage] = useAtom(gs_notifikasi_kategori_app); const router = useRouter(); - useShallowEffect(() => { - onLoadNotifikasi(); - }, []); - useShallowEffect(() => { if (countNtf != null) { setCountNtf(countNtf + newUserNtf); @@ -38,15 +34,32 @@ export default function HomeViewNew() { } }, [newUserNtf, countNtf]); - async function onLoadNotifikasi() { - const loadNotif = await fetch(API_RouteNotifikasi.get_count_by_id()); - const data = await loadNotif.json().then((res) => res.data); - setCountNtf(data); + useShallowEffect(() => { + hanlderLoadData(); + }, []); + + async function hanlderLoadData() { + try { + const listLoadData = [ + global_limit(() => onLoadNotifikasi()), + global_limit(() => cekUserLogin()), + ]; + + await Promise.all(listLoadData); + } catch (error) { + clientLogger.error("Error handler load data", error); + } } - useShallowEffect(() => { - cekUserLogin(); - }, []); + async function onLoadNotifikasi() { + try { + const loadNotif = await fetch(API_RouteNotifikasi.get_count_by_id()); + const data = await loadNotif.json().then((res) => res.data); + setCountNtf(data); + } catch (error) { + clientLogger.error("Error load notifikasi", error); + } + } async function cekUserLogin() { try { @@ -68,22 +81,26 @@ export default function HomeViewNew() { + !dataUser && !countNtf ? ( + + + + ) : dataUser.profile === undefined ? ( + { + router.push(RouterProfile.create, { scroll: false }); + }} + > + + ) : ( { - if ( - dataUser.profile != undefined || - dataUser?.profile != null - ) { - router.push(RouterUserSearch.main, { scroll: false }); - } else { - router.push(RouterProfile.create, { scroll: false }); - } + router.push(RouterUserSearch.main, { scroll: false }); }} > @@ -91,27 +108,32 @@ export default function HomeViewNew() { ) } customButtonRight={ - dataUser == null ? ( - + !dataUser && !countNtf ? ( + + + + ) : dataUser.profile === undefined ? ( + { + router.push(RouterProfile.create, { scroll: false }); + }} + > + + ) : ( { - if ( - dataUser.profile != undefined || - dataUser?.profile != null - ) { - setCategoryPage("Semua"); - router.push( - RouterNotifikasi.categoryApp({ name: "semua" }), - { - scroll: false, - } - ); - } else { - router.push(RouterProfile.create, { scroll: false }); - } + setCategoryPage("Semua"); + router.push( + RouterNotifikasi.categoryApp({ name: "semua" }), + { + scroll: false, + } + ); }} > {countNtf != null && countNtf > 0 ? ( @@ -134,9 +156,9 @@ export default function HomeViewNew() { } /> } - footer={} + footer={} > - + ); diff --git a/src/middleware.ts b/src/middleware.ts index 31ad130c..9a108c8f 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -32,19 +32,18 @@ const middlewareConfig: MiddlewareConfig = { "/api/auth/*", "/api/origin-url", "/api/event/*", - "/api/master/*", + // "/api/master/*", // "/api/image/*", // "/api/user/*", // "/api/new/*", // ADMIN API // "/api/admin/event/*", // "/api/admin/investasi/*", - // "/api/admin/donasi/dashboard/*", + "/api/admin/donasi/*", // "/api/admin/voting/dashboard/*", // "/api/admin/job/dashboard/*", // "/api/admin/forum/dashboard/*", - // Akses awal "/api/get-cookie", "/api/user/activation", @@ -77,134 +76,142 @@ export const middleware = async (req: NextRequest) => { apiPath, encodedKey, loginPath, - // validasiPath, - // registarasiPath, publicRoutes, sessionKey, validationApiRoute, userPath, } = middlewareConfig; + const { pathname } = req.nextUrl; - // CORS handling + // Handle CORS const corsResponse = handleCors(req); if (corsResponse) { - return setCorsHeaders(corsResponse); + return corsResponse; } - // Skip authentication for public routes - const isPublicRoute = [ - ...publicRoutes, - loginPath, - // validasiPath, - // registarasiPath, - ].some((route) => { - const pattern = route.replace(/\*/g, ".*"); - return new RegExp(`^${pattern}$`).test(pathname); - }); - - // Always protect validation endpoint - if (pathname === validationApiRoute) { - const reqToken = req.headers.get("Authorization")?.split(" ")[1]; - if (!reqToken) { - return setCorsHeaders(unauthorizedResponse()); - } - } - - if ( - isPublicRoute && - pathname !== loginPath - // && - // pathname !== validasiPath && - // pathname !== registarasiPath - ) { + // Check if route is public + const isPublicRoute = isRoutePublic(pathname, publicRoutes, loginPath); + if (isPublicRoute && pathname !== loginPath) { return setCorsHeaders(NextResponse.next()); } - const token = - req.cookies.get(sessionKey)?.value || - req.headers.get("Authorization")?.split(" ")[1]; + // Get token from cookies or Authorization header + const token = getToken(req, sessionKey); - // ==================== Authentication: Login, Validasi, Registrasi ==================== // - // Token verification + // Verify token and get user data const user = await verifyToken({ token, encodedKey }); // Handle login page access if (pathname === loginPath) { if (user) { - return setCorsHeaders(NextResponse.redirect(new URL(userPath, req.url))); + const response = NextResponse.redirect(new URL(userPath, req.url)); + // Preserve token in cookie when redirecting + if (token) { + response.cookies.set(sessionKey, token, { + httpOnly: true, + secure: process.env.NODE_ENV === "production", + sameSite: "lax", + path: "/", + }); + } + return setCorsHeaders(response); } return setCorsHeaders(NextResponse.next()); } - // // Handle validation page access - // if (pathname === validasiPath) { - // if (user) { - // return setCorsHeaders(NextResponse.redirect(new URL(userPath, req.url))); - // } - // return setCorsHeaders(NextResponse.next()); - // } - - // // Handle register page access - // if (pathname === registarasiPath) { - // if (user) { - // return setCorsHeaders(NextResponse.redirect(new URL(userPath, req.url))); - // } - // return setCorsHeaders(NextResponse.next()); - // } - - // Handle protected routes + // Redirect to login if no user found if (!user) { - return setCorsHeaders(NextResponse.redirect(new URL(loginPath, req.url))); + const response = NextResponse.redirect(new URL(loginPath, req.url)); + // Clear invalid token + response.cookies.delete(sessionKey); + return setCorsHeaders(response); } - // ==================== Authentication: Login, Validasi, Registrasi ==================== // + // Handle /dev routes that require active status if (pathname.startsWith("/dev")) { - const userValidate = await fetch(new URL("/api/user-validate", req.url), { - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${token}`, - }, - }); - - const userValidateJson = await userValidate.json(); - - if (!userValidateJson.data.active) { - return setCorsHeaders( - NextResponse.redirect(new URL("/waiting-room", req.url)) - ); - } - } - - // Handle authenticated API requests - if (pathname.startsWith(apiPath)) { - const reqToken = req.headers.get("Authorization")?.split(" ")[1]; - if (!reqToken) { - return setCorsHeaders(unauthorizedResponse()); - } - - // Validate user access with external API - const validationResponse = await fetch( - new URL(validationApiRoute, req.url), - { + try { + const userValidate = await fetch(new URL("/api/user-validate", req.url), { headers: { "Content-Type": "application/json", - Authorization: `Bearer ${reqToken}`, + Authorization: `Bearer ${token}`, }, - } - ); + }); - if (!validationResponse.ok) { + if (!userValidate.ok) { + throw new Error("Failed to validate user"); + } + + const userValidateJson = await userValidate.json(); + + if (!userValidateJson.data.active) { + return setCorsHeaders( + NextResponse.redirect(new URL("/waiting-room", req.url)) + ); + } + } catch (error) { + console.error("Error validating user:", error); + return setCorsHeaders(unauthorizedResponse()); + } + } + + // Handle API requests + if (pathname.startsWith(apiPath)) { + if (!token) { return setCorsHeaders(unauthorizedResponse()); } - const dataJson = await validationResponse.json(); + try { + const validationResponse = await fetch( + new URL(validationApiRoute, req.url), + { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + } + ); + + if (!validationResponse.ok) { + throw new Error("Failed to validate API request"); + } + } catch (error) { + console.error("Error validating API request:", error); + return setCorsHeaders(unauthorizedResponse()); + } } - // Proceed with the request - return setCorsHeaders(NextResponse.next()); + const response = NextResponse.next(); + // Ensure token is preserved in cookie + if (token) { + response.cookies.set(sessionKey, token, { + httpOnly: true, + secure: process.env.NODE_ENV === "production", + sameSite: "lax", + path: "/", + }); + } + return setCorsHeaders(response); }; +function isRoutePublic( + pathname: string, + publicRoutes: string[], + loginPath: string +): boolean { + return [...publicRoutes, loginPath].some((route) => { + const pattern = route.replace(/\*/g, ".*"); + return new RegExp(`^${pattern}$`).test(pathname); + }); +} + +function getToken(req: NextRequest, sessionKey: string): string | undefined { + return ( + req.cookies.get(sessionKey)?.value || + req.headers.get("Authorization")?.split(" ")[1] + ); +} + function unauthorizedResponse(): NextResponse { return new NextResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, @@ -249,16 +256,6 @@ async function verifyToken({ }): Promise | null> { if (!token) return null; - return await decrypt({ token, encodedKey }); -} - -async function decrypt({ - token, - encodedKey, -}: { - token: string; - encodedKey: string; -}): Promise | null> { try { const enc = new TextEncoder().encode(encodedKey); const { payload } = await jwtVerify(token, enc, { @@ -266,7 +263,7 @@ async function decrypt({ }); return (payload.user as Record) || null; } catch (error) { - console.error("Gagal verifikasi session", error); + console.error("Token verification failed:", error); return null; } } @@ -274,5 +271,3 @@ async function decrypt({ export const config = { matcher: ["/((?!_next|static|favicon.ico|manifest).*)"], }; - -// wibu:0.2.82 diff --git a/src/middleware.v2.back.txt b/src/middleware.v2.back.txt new file mode 100644 index 00000000..7b7aea01 --- /dev/null +++ b/src/middleware.v2.back.txt @@ -0,0 +1,284 @@ +import { NextRequest, NextResponse } from "next/server"; +import { jwtVerify } from "jose"; +import { apies, pages } from "./lib/routes"; + +type MiddlewareConfig = { + apiPath: string; + loginPath: string; + // validasiPath: string; + // registarasiPath: string; + userPath: string; + publicRoutes: string[]; + encodedKey: string; + sessionKey: string; + validationApiRoute: string; + log: boolean; +}; + +const middlewareConfig: MiddlewareConfig = { + apiPath: "/api", + loginPath: "/login", + // validasiPath: "/validasi", + // registarasiPath: "/register", + userPath: "/dev/home", + publicRoutes: [ + // API + "/", + "/api/voting/*", + "/api/collaboration/*", + "/api/notifikasi/*", + "/api/logs/*", + "/api/job/*", + "/api/auth/*", + "/api/origin-url", + "/api/event/*", + // "/api/master/*", + // "/api/image/*", + // "/api/user/*", + // "/api/new/*", + // ADMIN API + // "/api/admin/event/*", + // "/api/admin/investasi/*", + // "/api/admin/donasi/dashboard/*", + // "/api/admin/voting/dashboard/*", + // "/api/admin/job/dashboard/*", + // "/api/admin/forum/dashboard/*", + + // Akses awal + "/api/get-cookie", + "/api/user/activation", + "/api/user-validate", + + // PAGE + "/login", + "/register", + "/validasi", + "/splash", + "/job-vacancy", + "/preview-image", + "/auth/login", + "/auth/api/login", + "/waiting-room", + "/zCoba/*", + + // ASSETS + "/aset/global/main_background.png", + "/aset/logo/logo-hipmi.png", + ], + encodedKey: process.env.NEXT_PUBLIC_BASE_TOKEN_KEY!, + sessionKey: process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, + validationApiRoute: "/api/validation", + log: false, +}; + +export const middleware = async (req: NextRequest) => { + const { + apiPath, + encodedKey, + loginPath, + // validasiPath, + // registarasiPath, + publicRoutes, + sessionKey, + validationApiRoute, + userPath, + } = middlewareConfig; + const { pathname } = req.nextUrl; + + // CORS handling + const corsResponse = handleCors(req); + if (corsResponse) { + return setCorsHeaders(corsResponse); + } + + // Skip authentication for public routes + const isPublicRoute = [ + ...publicRoutes, + loginPath, + // validasiPath, + // registarasiPath, + ].some((route) => { + const pattern = route.replace(/\*/g, ".*"); + return new RegExp(`^${pattern}$`).test(pathname); + }); + + // Always protect validation endpoint + if (pathname === validationApiRoute) { + const reqToken = req.headers.get("Authorization")?.split(" ")[1]; + if (!reqToken) { + return setCorsHeaders(unauthorizedResponse()); + } + } + + if ( + isPublicRoute && + pathname !== loginPath + // && + // pathname !== validasiPath && + // pathname !== registarasiPath + ) { + return setCorsHeaders(NextResponse.next()); + } + + const token = + req.cookies.get(sessionKey)?.value || + req.headers.get("Authorization")?.split(" ")[1]; + + // ==================== Authentication: Login, Validasi, Registrasi ==================== // + // Token verification + const user = await verifyToken({ token, encodedKey }); + console.log("middlaware console:", user); + + // Handle login page access + if (pathname === loginPath) { + console.log("cek pathname >>", pathname); + if (user) { + console.log("sudah login, cek user >>", user); + return setCorsHeaders(NextResponse.redirect(new URL(userPath, req.url))); + } + return setCorsHeaders(NextResponse.next()); + } + + if (!user) { + return setCorsHeaders(NextResponse.redirect(new URL(loginPath, req.url))); + } + + // // Handle validation page access + // if (pathname === validasiPath) { + // if (user) { + // return setCorsHeaders(NextResponse.redirect(new URL(userPath, req.url))); + // } + // return setCorsHeaders(NextResponse.next()); + // } + + // // Handle register page access + // if (pathname === registarasiPath) { + // if (user) { + // return setCorsHeaders(NextResponse.redirect(new URL(userPath, req.url))); + // } + // return setCorsHeaders(NextResponse.next()); + // } + + // Handle protected routes + // if (!user) { + // return setCorsHeaders(NextResponse.redirect(new URL(loginPath, req.url))); + // } + // ==================== Authentication: Login, Validasi, Registrasi ==================== // + + if (pathname.startsWith("/dev")) { + const userValidate = await fetch(new URL("/api/user-validate", req.url), { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + }); + + const userValidateJson = await userValidate.json(); + + if (!userValidateJson.data.active) { + return setCorsHeaders( + NextResponse.redirect(new URL("/waiting-room", req.url)) + ); + } + } + + // Handle authenticated API requests + if (pathname.startsWith(apiPath)) { + const reqToken = req.headers.get("Authorization")?.split(" ")[1]; + if (!reqToken) { + return setCorsHeaders(unauthorizedResponse()); + } + + // Validate user access with external API + const validationResponse = await fetch( + new URL(validationApiRoute, req.url), + { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${reqToken}`, + }, + } + ); + + if (!validationResponse.ok) { + return setCorsHeaders(unauthorizedResponse()); + } + + const dataJson = await validationResponse.json(); + } + + // Proceed with the request + return setCorsHeaders(NextResponse.next()); +}; + +function unauthorizedResponse(): NextResponse { + return new NextResponse(JSON.stringify({ error: "Unauthorized" }), { + status: 401, + headers: { "Content-Type": "application/json" }, + }); +} + +function setCorsHeaders(res: NextResponse): NextResponse { + res.headers.set("Access-Control-Allow-Origin", "*"); + res.headers.set( + "Access-Control-Allow-Methods", + "GET, POST, PUT, DELETE, OPTIONS" + ); + res.headers.set( + "Access-Control-Allow-Headers", + "Content-Type, Authorization" + ); + return res; +} + +function handleCors(req: NextRequest): NextResponse | null { + if (req.method === "OPTIONS") { + return new NextResponse(null, { + status: 204, + headers: { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type, Authorization", + "Access-Control-Max-Age": "86400", + }, + }); + } + return null; +} + +async function verifyToken({ + token, + encodedKey, +}: { + token: string | undefined; + encodedKey: string; +}): Promise | null> { + if (!token) return null; + + return await decrypt({ token, encodedKey }); +} + +async function decrypt({ + token, + encodedKey, +}: { + token: string; + encodedKey: string; +}): Promise | null> { + try { + const enc = new TextEncoder().encode(encodedKey); + const { payload } = await jwtVerify(token, enc, { + algorithms: ["HS256"], + }); + return (payload.user as Record) || null; + } catch (error) { + console.error("Gagal verifikasi session", error); + return null; + } +} + +export const config = { + matcher: ["/((?!_next|static|favicon.ico|manifest).*)"], +}; + +// wibu:0.2.82 diff --git a/src/middleware.v3.back.txt b/src/middleware.v3.back.txt new file mode 100644 index 00000000..5f86f614 --- /dev/null +++ b/src/middleware.v3.back.txt @@ -0,0 +1,244 @@ +import { NextRequest, NextResponse } from "next/server"; +import { jwtVerify } from "jose"; + +type MiddlewareConfig = { + apiPath: string; + loginPath: string; + userPath: string; + publicRoutes: string[]; + encodedKey: string; + sessionKey: string; + validationApiRoute: string; + log: boolean; +}; + +const middlewareConfig: MiddlewareConfig = { + apiPath: "/api", + loginPath: "/login", + userPath: "/dev/home", + publicRoutes: [ + "/", + "/api/voting/*", + "/api/collaboration/*", + "/api/notifikasi/*", + "/api/logs/*", + "/api/job/*", + "/api/auth/*", + "/api/origin-url", + "/api/event/*", + "/api/get-cookie", + "/api/user/activation", + "/api/user-validate", + "/login", + "/register", + "/validasi", + "/splash", + "/job-vacancy", + "/preview-image", + "/auth/login", + "/auth/api/login", + "/waiting-room", + "/zCoba/*", + "/aset/global/main_background.png", + "/aset/logo/logo-hipmi.png", + ], + encodedKey: process.env.NEXT_PUBLIC_BASE_TOKEN_KEY!, + sessionKey: process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, + validationApiRoute: "/api/validation", + log: false, +}; + +export const middleware = async (req: NextRequest) => { + const { + apiPath, + encodedKey, + loginPath, + publicRoutes, + sessionKey, + validationApiRoute, + userPath, + } = middlewareConfig; + + const { pathname } = req.nextUrl; + + // Handle CORS + const corsResponse = handleCors(req); + if (corsResponse) { + return corsResponse; + } + + // Check if route is public + const isPublicRoute = isRoutePublic(pathname, publicRoutes, loginPath); + if (isPublicRoute && pathname !== loginPath) { + return setCorsHeaders(NextResponse.next()); + } + + // Get token from cookies or Authorization header + const token = getToken(req, sessionKey); + + // Verify token and get user data + const user = await verifyToken({ token, encodedKey }); + + // Handle login page access + if (pathname === loginPath) { + if (user) { + const response = NextResponse.redirect(new URL(userPath, req.url)); + // Preserve token in cookie when redirecting + if (token) { + response.cookies.set(sessionKey, token, { + httpOnly: true, + secure: process.env.NODE_ENV === 'production', + sameSite: 'lax', + path: '/' + }); + } + return setCorsHeaders(response); + } + return setCorsHeaders(NextResponse.next()); + } + + // Redirect to login if no user found + if (!user) { + const response = NextResponse.redirect(new URL(loginPath, req.url)); + // Clear invalid token + response.cookies.delete(sessionKey); + return setCorsHeaders(response); + } + + // Handle /dev routes that require active status + if (pathname.startsWith("/dev")) { + try { + const userValidate = await fetch(new URL("/api/user-validate", req.url), { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + }); + + if (!userValidate.ok) { + throw new Error('Failed to validate user'); + } + + const userValidateJson = await userValidate.json(); + + if (!userValidateJson.data.active) { + return setCorsHeaders( + NextResponse.redirect(new URL("/waiting-room", req.url)) + ); + } + } catch (error) { + console.error('Error validating user:', error); + return setCorsHeaders(unauthorizedResponse()); + } + } + + // Handle API requests + if (pathname.startsWith(apiPath)) { + if (!token) { + return setCorsHeaders(unauthorizedResponse()); + } + + try { + const validationResponse = await fetch( + new URL(validationApiRoute, req.url), + { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + } + ); + + if (!validationResponse.ok) { + throw new Error('Failed to validate API request'); + } + } catch (error) { + console.error('Error validating API request:', error); + return setCorsHeaders(unauthorizedResponse()); + } + } + + const response = NextResponse.next(); + // Ensure token is preserved in cookie + if (token) { + response.cookies.set(sessionKey, token, { + httpOnly: true, + secure: process.env.NODE_ENV === 'production', + sameSite: 'lax', + path: '/' + }); + } + return setCorsHeaders(response); +}; + +function isRoutePublic(pathname: string, publicRoutes: string[], loginPath: string): boolean { + return [...publicRoutes, loginPath].some((route) => { + const pattern = route.replace(/\*/g, ".*"); + return new RegExp(`^${pattern}$`).test(pathname); + }); +} + +function getToken(req: NextRequest, sessionKey: string): string | undefined { + return req.cookies.get(sessionKey)?.value || + req.headers.get("Authorization")?.split(" ")[1]; +} + +function unauthorizedResponse(): NextResponse { + return new NextResponse(JSON.stringify({ error: "Unauthorized" }), { + status: 401, + headers: { "Content-Type": "application/json" }, + }); +} + +function setCorsHeaders(res: NextResponse): NextResponse { + res.headers.set("Access-Control-Allow-Origin", "*"); + res.headers.set( + "Access-Control-Allow-Methods", + "GET, POST, PUT, DELETE, OPTIONS" + ); + res.headers.set( + "Access-Control-Allow-Headers", + "Content-Type, Authorization" + ); + return res; +} + +function handleCors(req: NextRequest): NextResponse | null { + if (req.method === "OPTIONS") { + return new NextResponse(null, { + status: 204, + headers: { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type, Authorization", + "Access-Control-Max-Age": "86400", + }, + }); + } + return null; +} + +async function verifyToken({ + token, + encodedKey, +}: { + token: string | undefined; + encodedKey: string; +}): Promise | null> { + if (!token) return null; + + try { + const enc = new TextEncoder().encode(encodedKey); + const { payload } = await jwtVerify(token, enc, { + algorithms: ["HS256"], + }); + return (payload.user as Record) || null; + } catch (error) { + console.error("Token verification failed:", error); + return null; + } +} + +export const config = { + matcher: ["/((?!_next|static|favicon.ico|manifest).*)"], +}; \ No newline at end of file diff --git a/xhtml/index.html b/x-example-show-pdf/index.html similarity index 100% rename from xhtml/index.html rename to x-example-show-pdf/index.html diff --git a/x.sh b/x.sh deleted file mode 100644 index 7eb36730..00000000 --- a/x.sh +++ /dev/null @@ -1 +0,0 @@ -# Test sh \ No newline at end of file diff --git a/xcoba.sh b/xcoba.sh deleted file mode 100644 index 47e2a998..00000000 --- a/xcoba.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -ffmpeg -f avfoundation \ --i "1:0" \ --s 1280x720 \ --framerate 30 \ --c:v libx264 \ --preset ultrafast \ --tune zerolatency \ --b:v 3000k \ --c:a aac \ --b:a 192k \ --vf "format=uyvy422" \ --f flv "rtmp://192.168.1.243:1935/live/bagas" \ --probesize 10M \ No newline at end of file