'Success', self::INVALID_FIELD => 'Invalid Field', self::MISSING_FIELD => 'Missing Field', self::INVALID_FORMAT => 'Invalid Format', self::DATA_NOT_FOUND => 'Data Not Found', self::DUPLICATE_REQUEST => 'Duplicate Request', self::ACCOUNT_ALREADY_EXISTS => 'Account Already Exists', self::ACCOUNT_NOT_FOUND => 'Account Not Found', self::INVALID_TOKEN => 'Invalid Token', self::UNAUTHORIZED => 'Unauthorized', self::SYSTEM_MALFUNCTION => 'System Malfunction', self::TIMEOUT => 'Timeout', self::SERVICE_UNAVAILABLE => 'Service Unavailable', self::GENERAL_ERROR => 'General Error', }; } /** * Mendapatkan deskripsi response berdasarkan kode * * @return string */ public function getDescription(): string { return match($this) { self::SUCCESS => 'Permintaan berhasil', self::INVALID_FIELD => 'Field tertentu tidak sesuai aturan', self::MISSING_FIELD => 'Field wajib tidak dikirim', self::INVALID_FORMAT => 'Format salah', self::DATA_NOT_FOUND => 'Data yang diminta tidak ditemukan', self::DUPLICATE_REQUEST => 'Request ID sama, sudah pernah diproses', self::ACCOUNT_ALREADY_EXISTS => 'Nomor rekening / username / email sudah terdaftar', self::ACCOUNT_NOT_FOUND => 'Nomor rekening / akun tidak ditemukan', self::INVALID_TOKEN => 'Token tidak valid', self::UNAUTHORIZED => 'Tidak punya akses', self::SYSTEM_MALFUNCTION => 'Gangguan teknis di server', self::TIMEOUT => 'Request timeout', self::SERVICE_UNAVAILABLE => 'Layanan tidak tersedia', self::GENERAL_ERROR => 'Kesalahan umum', }; } /** * Mendapatkan HTTP status code berdasarkan response code * * @return int */ public function getHttpStatus(): int { return match($this) { self::SUCCESS => 200, self::INVALID_FIELD, self::MISSING_FIELD, self::INVALID_FORMAT => 400, self::DATA_NOT_FOUND, self::ACCOUNT_NOT_FOUND => 404, self::DUPLICATE_REQUEST, self::ACCOUNT_ALREADY_EXISTS => 409, self::INVALID_TOKEN, self::UNAUTHORIZED => 401, self::SYSTEM_MALFUNCTION, self::GENERAL_ERROR => 500, self::TIMEOUT => 408, self::SERVICE_UNAVAILABLE => 503, }; } /** * Membuat response array standar * * @param mixed $data * @param string|null $message * @return array */ public function toResponse($data = null, ?string $message = null): array { return [ 'response_code' => $this->value, 'response_message' => $message ?? $this->getMessage(), 'response_description' => $this->getDescription(), 'data' => $data, 'meta' => [ 'account_number' => $data['account_number'] ?? null, 'period' => [ 'start_date' => $data['period']['start_date'] ?? null, 'end_date' => $data['period']['end_date'] ?? null, ], 'generated_at' => now()->toDateTimeString(), 'request_id' => request()->header('X-Request-ID', uniqid('req_')) ], ]; } }