You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.4 KiB
126 lines
3.4 KiB
//
|
|
// ConfigurationService.swift
|
|
// PadelClub
|
|
//
|
|
// Created by razmig on 14/04/2025.
|
|
//
|
|
|
|
import Foundation
|
|
import LeStorage
|
|
|
|
class ConfigurationService {
|
|
static func fetchTournamentConfig() async throws -> TimeToConfirmConfig {
|
|
let service = try StoreCenter.main.service()
|
|
let urlRequest = try service._baseRequest(servicePath: "config/tournament/", method: .get, requiresToken: true)
|
|
let (data, _) = try await URLSession.shared.data(for: urlRequest)
|
|
return try JSONDecoder().decode(TimeToConfirmConfig.self, from: data)
|
|
}
|
|
|
|
static func fetchPaymentConfig() async throws -> PaymentConfig {
|
|
let service = try StoreCenter.main.service()
|
|
let urlRequest = try service._baseRequest(servicePath: "config/payment/", method: .get, requiresToken: true)
|
|
let (data, _) = try await URLSession.shared.data(for: urlRequest)
|
|
return try JSONDecoder().decode(PaymentConfig.self, from: data)
|
|
}
|
|
}
|
|
|
|
struct TimeToConfirmConfig: Codable {
|
|
let timeProximityRules: [String: Int]
|
|
let waitingListRules: [String: Int]
|
|
let businessRules: BusinessRules
|
|
let urgencyOverride: UrgencyOverride
|
|
|
|
private enum CodingKeys: String, CodingKey {
|
|
case timeProximityRules = "time_proximity_rules"
|
|
case waitingListRules = "waiting_list_rules"
|
|
case businessRules = "business_rules"
|
|
case urgencyOverride = "urgency_override"
|
|
}
|
|
|
|
// Default configuration
|
|
static let defaultConfig = TimeToConfirmConfig(
|
|
timeProximityRules: [
|
|
"24": 30, // within 24h → 30 min
|
|
"48": 60, // within 48h → 60 min
|
|
"72": 120, // within 72h → 120 min
|
|
"default": 240
|
|
],
|
|
waitingListRules: [
|
|
"30": 30, // 30+ teams → 30 min
|
|
"20": 60, // 20+ teams → 60 min
|
|
"10": 120, // 10+ teams → 120 min
|
|
"default": 240
|
|
],
|
|
businessRules: BusinessRules(
|
|
hours: Hours(
|
|
start: 8,
|
|
end: 21,
|
|
defaultConfirmationHour: 8
|
|
),
|
|
days: Days(
|
|
workingDays: [0, 1, 2, 3, 4, 5, 6],
|
|
weekend: []
|
|
)
|
|
),
|
|
urgencyOverride: UrgencyOverride(
|
|
thresholds: [
|
|
"24": true,
|
|
"12": true
|
|
],
|
|
minimumResponseTime: 30
|
|
)
|
|
)
|
|
|
|
}
|
|
|
|
struct BusinessRules: Codable {
|
|
let hours: Hours
|
|
let days: Days
|
|
}
|
|
|
|
struct Hours: Codable {
|
|
let start: Int
|
|
let end: Int
|
|
let defaultConfirmationHour: Int
|
|
|
|
private enum CodingKeys: String, CodingKey {
|
|
case start
|
|
case end
|
|
case defaultConfirmationHour = "default_confirmation_hour"
|
|
}
|
|
|
|
}
|
|
|
|
struct Days: Codable {
|
|
let workingDays: [Int]
|
|
let weekend: [Int]
|
|
|
|
private enum CodingKeys: String, CodingKey {
|
|
case workingDays = "working_days"
|
|
case weekend
|
|
}
|
|
|
|
}
|
|
|
|
struct UrgencyOverride: Codable {
|
|
let thresholds: [String: Bool]
|
|
let minimumResponseTime: Int
|
|
|
|
private enum CodingKeys: String, CodingKey {
|
|
case thresholds
|
|
case minimumResponseTime = "minimum_response_time"
|
|
}
|
|
|
|
}
|
|
|
|
struct PaymentConfig: Codable {
|
|
let stripeFee: Double
|
|
|
|
// Default configuration
|
|
static let defaultConfig = PaymentConfig(stripeFee: 0.0075)
|
|
|
|
private enum CodingKeys: String, CodingKey {
|
|
case stripeFee = "stripe_fee"
|
|
}
|
|
|
|
}
|
|
|