128 lines
3.0 KiB
Swift
128 lines
3.0 KiB
Swift
//
|
|
// APIResponse.swift
|
|
// AppClientBaseSwift
|
|
//
|
|
// API response wrapper models
|
|
// Các model wrapper cho API response
|
|
//
|
|
|
|
import Foundation
|
|
|
|
// MARK: - API Response Wrapper
|
|
// Wrapper Response API
|
|
|
|
/// Generic API response wrapper
|
|
/// Wrapper response API chung
|
|
struct APIResponse<T: Decodable>: Decodable {
|
|
/// Success status
|
|
/// Trạng thái thành công
|
|
let success: Bool
|
|
|
|
/// Response data
|
|
/// Dữ liệu response
|
|
let data: T?
|
|
|
|
/// Error message if any
|
|
/// Thông báo lỗi nếu có
|
|
let error: String?
|
|
|
|
/// Pagination info if any
|
|
/// Thông tin phân trang nếu có
|
|
let pagination: Pagination?
|
|
}
|
|
|
|
// MARK: - Pagination
|
|
// Phân trang
|
|
|
|
/// Pagination information
|
|
/// Thông tin phân trang
|
|
struct Pagination: Decodable {
|
|
let currentPage: Int?
|
|
let pageSize: Int?
|
|
let totalPages: Int?
|
|
let totalItems: Int?
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case currentPage
|
|
case pageSize
|
|
case totalPages
|
|
case totalItems
|
|
}
|
|
}
|
|
|
|
// MARK: - Simple Response
|
|
// Response đơn giản
|
|
|
|
/// Simple success/error response
|
|
/// Response thành công/lỗi đơn giản
|
|
struct SimpleResponse: Decodable {
|
|
let success: Bool
|
|
let message: String?
|
|
let error: String?
|
|
}
|
|
|
|
// MARK: - List Response
|
|
// Response danh sách
|
|
|
|
/// Generic list response wrapper
|
|
/// Wrapper response danh sách
|
|
struct ListResponse<T: Decodable>: Decodable {
|
|
let success: Bool
|
|
let data: [T]?
|
|
let error: String?
|
|
let pagination: Pagination?
|
|
}
|
|
// MARK: - APIResponse Extensions
|
|
// Extensions cho APIResponse
|
|
|
|
extension APIResponse {
|
|
/// Unwrap data or throw error
|
|
/// Unwrap data hoặc throw error
|
|
/// - Returns: Unwrapped data / Dữ liệu đã unwrap
|
|
/// - Throws: APIError if not successful / APIError nếu không thành công
|
|
func unwrap() throws -> T {
|
|
guard success else {
|
|
throw APIError.serverError(
|
|
statusCode: 400,
|
|
message: error ?? "API request failed"
|
|
)
|
|
}
|
|
|
|
guard let data = data else {
|
|
throw APIError.noData
|
|
}
|
|
|
|
return data
|
|
}
|
|
|
|
/// Check if response is successful with data
|
|
/// Kiểm tra response có thành công và có data không
|
|
var isSuccessful: Bool {
|
|
success && data != nil
|
|
}
|
|
}
|
|
|
|
extension ListResponse {
|
|
/// Unwrap data or throw error
|
|
/// Unwrap data hoặc throw error
|
|
/// - Returns: Unwrapped data array / Mảng dữ liệu đã unwrap
|
|
/// - Throws: APIError if not successful / APIError nếu không thành công
|
|
func unwrap() throws -> [T] {
|
|
guard success else {
|
|
throw APIError.serverError(
|
|
statusCode: 400,
|
|
message: error ?? "API request failed"
|
|
)
|
|
}
|
|
|
|
return data ?? []
|
|
}
|
|
|
|
/// Check if response is successful
|
|
/// Kiểm tra response có thành công không
|
|
var isSuccessful: Bool {
|
|
success
|
|
}
|
|
}
|
|
|