From 67d338ac849eda8ced8121d3266d462a7dc9ffba Mon Sep 17 00:00:00 2001 From: amal Date: Mon, 29 Sep 2025 10:54:44 +0800 Subject: [PATCH] upd: api ai Deskripsi: - perbaiki get data - api ai data desa - api ai version app No Issues --- darmasaba-api-ai.yml | 107 ++++++++++++++++++++++++------- src/app/api/ai/village/route.ts | 50 +++++++++++++++ src/app/api/version-app/route.ts | 2 +- 3 files changed, 134 insertions(+), 25 deletions(-) create mode 100644 src/app/api/ai/village/route.ts diff --git a/darmasaba-api-ai.yml b/darmasaba-api-ai.yml index cba55c6..c27b6be 100644 --- a/darmasaba-api-ai.yml +++ b/darmasaba-api-ai.yml @@ -33,19 +33,34 @@ components: message: type: string description: Response message or error description - meta: - type: object + + # Village + VillageListResponse: + allOf: + - $ref: "#/components/schemas/BaseResponse" + - type: object properties: - total: - type: integer - description: Total number of items - page: - type: integer - description: Current page number - get: - type: integer - description: Number of items per page - description: Pagination metadata + data: + type: array + items: + properties: + id: + type: string + description: Unique identifier for the village + name: + type: string + description: Name of the village + isActive: + type: boolean + description: Indicates whether the village is active + createdAt: + type: string + format: date-time + description: Timestamp when the village was created + updatedAt: + type: string + format: date-time + description: Timestamp when the village was last updatedØ # Banner BannerBase: @@ -1393,6 +1408,48 @@ components: description: Details of a specific user paths: + # Village + /village: + get: + tags: + - Village + summary: Get list of villages + description: Retrieves a paginated list of villages filtered by search term and active status + parameters: + - name: search + in: query + description: Search term for village name + schema: + type: string + nullable: true + - name: active + in: query + description: Filter by active status + schema: + type: boolean + nullable: true + - name: page + in: query + description: Page number for pagination + schema: + type: integer + minimum: 1 + default: 1 + - name: get + in: query + description: Number of items per page + schema: + type: integer + minimum: 1 + default: 10 + responses: + "200": + description: List of villages + content: + application/json: + schema: + $ref: "#/components/schemas/VillageListResponse" + # Announcement /announcement: get: @@ -1420,7 +1477,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -1501,7 +1558,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -1601,7 +1658,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -1695,7 +1752,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -1789,7 +1846,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -1894,7 +1951,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -2058,7 +2115,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -2112,7 +2169,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -2172,7 +2229,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -2233,7 +2290,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -2335,7 +2392,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -2436,7 +2493,7 @@ paths: type: integer minimum: 1 default: 1 - - name: perPage + - name: get in: query description: Number of items per page schema: @@ -2488,6 +2545,8 @@ security: - bearerAuth: [] tags: + - name: Village + description: Operations related to village management - name: Announcement description: Operations related to announcements - name: Banner diff --git a/src/app/api/ai/village/route.ts b/src/app/api/ai/village/route.ts new file mode 100644 index 0000000..9377c22 --- /dev/null +++ b/src/app/api/ai/village/route.ts @@ -0,0 +1,50 @@ +import { prisma } from "@/module/_global"; +import _ from "lodash"; +import { NextResponse } from "next/server"; + +export async function GET(request: Request) { + try { + const { searchParams } = new URL(request.url); + const isActive = searchParams.get("active"); + const search = searchParams.get('search'); + const page = searchParams.get('page') + const get = searchParams.get('get') + + let getFix = 10; + if (get == null || get == undefined || get == "" || _.isNaN(Number(get))) { + getFix = 10; + } else { + getFix = Number(get); + } + + const dataSkip = page == null || page == undefined ? 0 : Number(page) * getFix - getFix; + + const data = await prisma.village.findMany({ + skip: dataSkip, + take: getFix, + where: { + isActive: isActive == 'false' ? false : true, + name: { + contains: (search == undefined || search == null) ? "" : search, + mode: "insensitive" + } + }, + select: { + id: true, + name: true, + isActive: true, + createdAt: true, + updatedAt: true + }, + orderBy: { + name: 'asc' + } + }); + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan desa", data, }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal mendapatkan desa, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/version-app/route.ts b/src/app/api/version-app/route.ts index 3f2c3b5..33baf80 100644 --- a/src/app/api/version-app/route.ts +++ b/src/app/api/version-app/route.ts @@ -2,7 +2,7 @@ import { NextResponse } from "next/server"; export async function GET(request: Request) { try { - return NextResponse.json({ success: true, version: "2.0.2", tahap: "beta", update: "-api mobile; -login tanpa otp (mobile app); -tambah laporan pada project dan tugas divisi; -tambah upload link pada project dan tugas divisi; -tambah detail tanggal dan jam pada project dan tugas divisi; -api jenna ai; -privacy policy" }, { status: 200 }); + return NextResponse.json({ success: true, version: "2.0.3", tahap: "beta", update: "-api mobile; -login tanpa otp (mobile app); -tambah laporan pada project dan tugas divisi; -tambah upload link pada project dan tugas divisi; -tambah detail tanggal dan jam pada project dan tugas divisi; -api jenna ai; -privacy policy" }, { status: 200 }); } catch (error) { console.error(error); return NextResponse.json({ success: false, version: "Gagal mendapatkan version, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 });