SiPegawai
Lapas Kelas III Saparua
?
Akun sedang direview oleh admin.
Halaman ini otomatis update saat disetujui.
| Pegawai | NIP | Jabatan | Update | Aksi |
|---|
Tidak ada data.
| File | Kategori | Keterangan | Diupload Oleh | Ukuran | Diupload | Aksi |
|---|
Pilih pegawai di kiri untuk melihat dokumennya.
| Nama Jabatan | Dibuat | Aksi |
|---|
Belum ada jabatan.
| Nama Kategori | Deskripsi | Aksi |
|---|
Belum ada kategori.
Klik atau drag & drop
PDF, JPG, PNG — maks 10MBhttps://developers.google.com/oauthplayground ke Authorized redirect URIs-- ── 1. Hitung total storage (WAJIB, untuk cek kapasitas) ───────────────────
CREATE OR REPLACE FUNCTION get_total_storage_used()
RETURNS json
LANGUAGE sql
SECURITY DEFINER
AS $$
SELECT json_build_object(
'r2_bytes', COALESCE(SUM(CASE WHEN storage_type IS NULL OR storage_type='r2' THEN ukuran_file ELSE 0 END),0),
'drive_bytes', COALESCE(SUM(CASE WHEN storage_type='drive' THEN ukuran_file ELSE 0 END),0)
)
FROM dokumen;
$$;
-- ── 2. Insert dokumen DENGAN cek kapasitas atomik ────────────────────────────
-- Cek dilakukan BERSAMAAN dengan insert dalam 1 transaksi — tidak ada celah race condition
CREATE OR REPLACE FUNCTION insert_dokumen_safe(
p_payload jsonb,
p_r2_limit bigint,
p_drive_limit bigint,
p_storage_type text -- 'r2' atau 'drive'
)
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
DECLARE
v_r2_used bigint;
v_drive_used bigint;
v_file_size bigint;
v_new_id uuid;
BEGIN
-- Hitung usage saat ini (dalam transaksi yang sama = consistent read)
SELECT
COALESCE(SUM(CASE WHEN storage_type IS NULL OR storage_type='r2' THEN ukuran_file ELSE 0 END), 0),
COALESCE(SUM(CASE WHEN storage_type='drive' THEN ukuran_file ELSE 0 END), 0)
INTO v_r2_used, v_drive_used
FROM dokumen;
v_file_size := (p_payload->>'ukuran_file')::bigint;
-- Validasi kapasitas
IF p_storage_type = 'r2' THEN
IF (v_r2_used + v_file_size) > p_r2_limit THEN
RETURN jsonb_build_object('ok', false, 'error', 'R2_FULL',
'r2_used', v_r2_used, 'r2_limit', p_r2_limit, 'file_size', v_file_size);
END IF;
ELSIF p_storage_type = 'drive' THEN
-- Blokir jika drive_limit tidak diset (= 0 artinya belum dikonfigurasi)
IF p_drive_limit <= 0 THEN
RETURN jsonb_build_object('ok', false, 'error', 'DRIVE_NOT_CONFIGURED',
'drive_used', v_drive_used, 'drive_limit', 0);
END IF;
IF (v_drive_used + v_file_size) > p_drive_limit THEN
RETURN jsonb_build_object('ok', false, 'error', 'DRIVE_FULL',
'drive_used', v_drive_used, 'drive_limit', p_drive_limit, 'file_size', v_file_size);
END IF;
END IF;
-- Insert dokumen (pastikan id selalu terisi)
INSERT INTO dokumen
SELECT * FROM jsonb_populate_record(
null::dokumen,
p_payload || jsonb_build_object('id', COALESCE(p_payload->>'id', gen_random_uuid()::text))
)
RETURNING id INTO v_new_id;
RETURN jsonb_build_object('ok', true, 'id', v_new_id);
EXCEPTION WHEN OTHERS THEN
RETURN jsonb_build_object('ok', false, 'error', SQLERRM);
END;
$$;
-- ── 3. Config R2 (untuk user biasa) ────────────────────────────────────────
CREATE OR REPLACE FUNCTION get_r2_config()
RETURNS json
LANGUAGE sql
SECURITY DEFINER
AS $$
SELECT json_object_agg(key, value)
FROM app_config
WHERE key IN ('accountId','bucket','accessKey','secretKey','r2LimitBytes');
$$;
-- ── 4. Config Drive (untuk user biasa) ─────────────────────────────────────
CREATE OR REPLACE FUNCTION get_drive_config()
RETURNS json
LANGUAGE sql
SECURITY DEFINER
AS $$
SELECT json_object_agg(key, value)
FROM app_config
WHERE key IN ('driveJson','driveFolderId','driveLimitGb','driveAutoOverflow');
$$;
-- ── 5. Update cache storage (WAJIB agar user biasa bisa simpan cache setelah upload)
-- User biasa tidak punya RLS WRITE ke app_config, jadi harus via SECURITY DEFINER
CREATE OR REPLACE FUNCTION update_storage_cache(p_r2_bytes bigint, p_drive_bytes bigint)
RETURNS void
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
INSERT INTO app_config(key, value) VALUES
('cachedR2Bytes', p_r2_bytes::text),
('cachedDriveBytes', p_drive_bytes::text),
('cachedStorageAt', now()::text)
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
END;
$$;
r2_key di CSV dengan file yang masih adastatus_recoverydokumen — r2_key masih validFile akan dikelompokkan berdasarkan kategori dokumen di dalam ZIP.
Hanya file yang pernah Anda upload yang akan diunduh.
File diunduh langsung dari penyimpanan cloud yang aman.
Klik atau drag & drop
PDF, JPG, PNG — maks 10MB