Skip to content

Commit d771eea

Browse files
Merge pull request #8 from UnleashMystCode/be/lint-typescript-actions
fix(actions): remove explicit any type annotations, fix type safety i…
2 parents 5d43668 + 48b78b4 commit d771eea

9 files changed

Lines changed: 53 additions & 35 deletions

.docs/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44
**Rule:** Semua perubahan struktur, penambahan file, atau pergantian status fitur WAJIB dicatat di sini terlebih dahulu sebelum memperbarui dokumen spesifik di `.docs/`.
55
---
66
---
7+
## [v3.9.2] - 2026-05-28
8+
### Fixed (TypeScript & Linting)
9+
- **Strict Actions Type-Safety:** Refactoring type-safe catch blocks in all server actions to remove any explicit `any` types. Checked for `instanceof Error` dynamically when returning or logging errors.
10+
- **Prisma Actions Typing:** Strongly typed `updateData` variables using `Prisma.BannerHomepageUpdateInput` and `Prisma.KegiatanUpdateInput` instead of `any`.
11+
- **ZodError Bugfix:** Fixed a TypeScript check error in `potensi.action.ts` where `error.errors` was used instead of the correct `error.issues` for `ZodError` properties.
12+
- **Linter Warnings Cleanup:** Removed unused variable `searchParam` in `search.action.ts` to clear linter warnings.
13+
714
## [v3.9.1] - 2026-05-28
815
### Changed (DevOps & Workflow)
916
- **Branch Rename (pr -> dev):** Mengubah nama cabang integrasi/staging dari `pr` menjadi `dev` di seluruh berkas konfigurasi workflow GitHub Actions (`ci.yml`, `docs-sync.yml`), template PR (`PULL_REQUEST_TEMPLATE.md`), berkas kontribusi (`CONTRIBUTING.md`), blueprint arsitektur (`architecture.md`), serta berkas panduan AI (`.cursorrules`, `.agentrules`, dll.) demi memperjelas alur branching dan menghindari kebingungan.

actions/auth.action.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ export async function loginAction(formData: FormData) {
5959
});
6060

6161
return { success: true, message: "Login berhasil" };
62-
} catch (error: any) {
63-
return { success: false, message: error.message };
62+
} catch (error) {
63+
const errorMessage = error instanceof Error ? error.message : "Terjadi kesalahan";
64+
return { success: false, message: errorMessage };
6465
}
6566
}
6667

actions/banner.action.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { writeFile, unlink, mkdir } from "fs/promises";
66
import path from "path";
77
import { z } from "zod";
88
import { verifySession } from "@/lib/safe-action";
9+
import { Prisma } from "@prisma/client";
910

1011
// --- SKEMA VALIDASI ---
1112
const BannerSchema = z.object({
@@ -53,7 +54,7 @@ export async function saveBanner(formData: FormData) {
5354
const id = validData.data.id ? parseInt(validData.data.id) : null;
5455

5556
if (id) {
56-
const updateData: any = {
57+
const updateData: Prisma.BannerHomepageUpdateInput = {
5758
halaman: validData.data.halaman,
5859
tagline: validData.data.tagline,
5960
judul: validData.data.judul,
@@ -84,8 +85,9 @@ export async function saveBanner(formData: FormData) {
8485
revalidatePath("/");
8586

8687
return { success: true, message: "Banner berhasil disimpan!" };
87-
} catch (error: any) {
88-
return { success: false, message: error.message };
88+
} catch (error) {
89+
const errorMessage = error instanceof Error ? error.message : "Terjadi kesalahan";
90+
return { success: false, message: errorMessage };
8991
}
9092
}
9193

@@ -115,7 +117,8 @@ export async function hapusBanner(id: number) {
115117
revalidatePath("/");
116118

117119
return { success: true, message: "Banner berhasil dihapus!" };
118-
} catch (error: any) {
119-
return { success: false, message: error.message };
120+
} catch (error) {
121+
const errorMessage = error instanceof Error ? error.message : "Terjadi kesalahan";
122+
return { success: false, message: errorMessage };
120123
}
121124
}

actions/berita.action.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { revalidatePath } from "next/cache";
44
import prisma from "@/lib/db";
55
import { z } from "zod";
66
import { verifySession } from "@/lib/safe-action";
7+
import { Prisma } from "@prisma/client";
78

89
// --- SKEMA VALIDASI ---
910
const KegiatanSchema = z.object({
@@ -44,8 +45,9 @@ export async function simpanBerita(rawFormData: FormData) {
4445
revalidatePath("/admin/halaman/berita");
4546
revalidatePath("/home");
4647
return { success: true, message: "Berita berhasil ditambahkan!" };
47-
} catch (error: any) {
48-
return { success: false, message: error.message };
48+
} catch (error) {
49+
const errorMessage = error instanceof Error ? error.message : "Terjadi kesalahan";
50+
return { success: false, message: errorMessage };
4951
}
5052
}
5153

@@ -61,8 +63,9 @@ export async function hapusBerita(id: number) {
6163
revalidatePath("/admin/halaman/berita");
6264
revalidatePath("/home");
6365
return { success: true, message: "Berita berhasil dihapus!" };
64-
} catch (error: any) {
65-
return { success: false, message: error.message };
66+
} catch (error) {
67+
const errorMessage = error instanceof Error ? error.message : "Terjadi kesalahan";
68+
return { success: false, message: errorMessage };
6669
}
6770
}
6871

@@ -78,7 +81,7 @@ export async function editBerita(id: number, rawFormData: FormData) {
7881
const penulis = rawFormData.get("penulis") as string;
7982
const status = rawFormData.get("status") as string;
8083

81-
const dataToUpdate: any = { judul, isi };
84+
const dataToUpdate: Prisma.KegiatanUpdateInput = { judul, isi };
8285
if (gambar) dataToUpdate.gambar = gambar;
8386
if (kategori) dataToUpdate.kategori = kategori;
8487
if (penulis) dataToUpdate.penulis = penulis;
@@ -91,7 +94,8 @@ export async function editBerita(id: number, rawFormData: FormData) {
9194

9295
revalidatePath("/admin/halaman/berita");
9396
revalidatePath("/berita");
94-
} catch (error: any) {
95-
console.error("Gagal ubah berita:", error.message);
97+
} catch (error) {
98+
const errorMessage = error instanceof Error ? error.message : "Terjadi kesalahan";
99+
console.error("Gagal ubah berita:", errorMessage);
96100
}
97101
}

actions/kontak.action.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export async function simpanSiteConfig(formData: FormData) {
2626
);
2727
revalidatePath("/admin/halaman/kontak");
2828
revalidatePath("/kontak");
29-
} catch (error: any) {
29+
} catch (error) {
3030
console.error("Failed to save site config:", error);
3131
}
3232
}
@@ -49,9 +49,10 @@ export async function ubahStatusPesan(id: number, status: string) {
4949
await prisma.pesanMasuk.update({ where: { id }, data: { status } });
5050
revalidatePath("/admin/halaman/kontak");
5151
return { success: true };
52-
} catch (error: any) {
52+
} catch (error) {
53+
const errorMessage = error instanceof Error ? error.message : "Terjadi kesalahan";
5354
console.error("Failed to change message status:", error);
54-
return { success: false, error: error.message };
55+
return { success: false, error: errorMessage };
5556
}
5657
}
5758

@@ -61,8 +62,9 @@ export async function hapusPesan(id: number) {
6162
await prisma.pesanMasuk.delete({ where: { id } });
6263
revalidatePath("/admin/halaman/kontak");
6364
return { success: true };
64-
} catch (error: any) {
65+
} catch (error) {
66+
const errorMessage = error instanceof Error ? error.message : "Terjadi kesalahan";
6567
console.error("Failed to delete message:", error);
66-
return { success: false, error: error.message };
68+
return { success: false, error: errorMessage };
6769
}
6870
}

actions/potensi.action.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ export async function simpanPotensi(formData: FormData) {
9696
revalidatePath("/admin/halaman/potensi-desa");
9797
revalidatePath("/potensi-desa");
9898
return { success: true };
99-
} catch (error: any) {
99+
} catch (error) {
100100
console.error("Error simpan potensi:", error);
101-
if (error.name === "ZodError") {
102-
return { success: false, error: error.errors[0].message };
101+
if (error instanceof z.ZodError) {
102+
return { success: false, error: error.issues[0].message };
103103
}
104104
return { success: false, error: "Gagal menyimpan data potensi." };
105105
}

actions/search.action.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ export type SearchResult = {
1414
export async function globalSearch(query: string): Promise<SearchResult[]> {
1515
if (!query || query.trim() === "") return [];
1616

17-
const searchParam = `%${query.trim()}%`;
18-
1917
try {
2018
// Cari di tabel Kegiatan (Berita)
2119
const berita = await prisma.kegiatan.findMany({
@@ -46,7 +44,7 @@ export async function globalSearch(query: string): Promise<SearchResult[]> {
4644
});
4745

4846
// Format dan gabungkan hasil
49-
const formattedBerita: SearchResult[] = berita.map((b: any) => ({
47+
const formattedBerita: SearchResult[] = berita.map((b) => ({
5048
id: `berita-${b.id}`,
5149
judul: b.judul,
5250
slug: b.slug,
@@ -55,7 +53,7 @@ export async function globalSearch(query: string): Promise<SearchResult[]> {
5553
tanggal: b.tanggal,
5654
}));
5755

58-
const formattedPotensi: SearchResult[] = potensi.map((p: any) => ({
56+
const formattedPotensi: SearchResult[] = potensi.map((p) => ({
5957
id: `potensi-${p.id}`,
6058
judul: p.judul,
6159
slug: p.slug,

actions/tentang-kami.action.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ export async function tambahPerangkat(formData: FormData) {
2121
revalidatePath("/admin/halaman/tentang-kami/struktur");
2222
revalidatePath("/tentang-kami");
2323
return { success: true };
24-
} catch (error: any) {
24+
} catch (error) {
25+
const errorMessage = error instanceof Error ? error.message : "Terjadi kesalahan";
2526
console.error("Failed to add perangkat:", error);
26-
return { success: false, error: error.message };
27+
return { success: false, error: errorMessage };
2728
}
2829
}
2930

@@ -43,9 +44,10 @@ export async function ubahPerangkat(id: number, formData: FormData) {
4344
revalidatePath("/admin/halaman/tentang-kami/struktur");
4445
revalidatePath("/tentang-kami");
4546
return { success: true };
46-
} catch (error: any) {
47+
} catch (error) {
48+
const errorMessage = error instanceof Error ? error.message : "Terjadi kesalahan";
4749
console.error("Failed to update perangkat:", error);
48-
return { success: false, error: error.message };
50+
return { success: false, error: errorMessage };
4951
}
5052
}
5153

@@ -56,9 +58,10 @@ export async function hapusPerangkat(id: number) {
5658
revalidatePath("/admin/halaman/tentang-kami/struktur");
5759
revalidatePath("/tentang-kami");
5860
return { success: true };
59-
} catch (error: any) {
61+
} catch (error) {
62+
const errorMessage = error instanceof Error ? error.message : "Terjadi kesalahan";
6063
console.error("Failed to delete perangkat:", error);
61-
return { success: false, error: error.message };
64+
return { success: false, error: errorMessage };
6265
}
6366
}
6467

@@ -78,7 +81,7 @@ export async function simpanProfilKonten(formData: FormData) {
7881
});
7982
revalidatePath("/admin/halaman/tentang-kami/teks");
8083
revalidatePath("/tentang-kami");
81-
} catch (error: any) {
84+
} catch (error) {
8285
console.error("Failed to save profile content:", error);
8386
}
8487
}

actions/ulasan.action.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export async function tambahUlasan(formData: FormData) {
4545
message: "Terima kasih! Ulasan Anda berhasil dikirim.",
4646
data: ulasan
4747
};
48-
} catch (error: any) {
48+
} catch (error) {
4949
console.error("Gagal tambah ulasan:", error);
5050
return { success: false, message: "Terjadi kesalahan sistem saat mengirim ulasan." };
5151
}
@@ -59,7 +59,7 @@ export async function getSemuaUlasan() {
5959
orderBy: { createdAt: "desc" },
6060
});
6161
return { success: true, data: ulasan };
62-
} catch (error: any) {
62+
} catch (error) {
6363
return { success: false, message: "Gagal mengambil data ulasan." };
6464
}
6565
}

0 commit comments

Comments
 (0)