Commit
This commit is contained in:
46
Schedule ICTIS/Utilities/Network/NetworkError.swift
Normal file
46
Schedule ICTIS/Utilities/Network/NetworkError.swift
Normal file
@ -0,0 +1,46 @@
|
||||
//
|
||||
// NetworkError.swift
|
||||
// Schedule ICTIS
|
||||
//
|
||||
// Created by Mironov Egor on 18.11.2024.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
enum NetworkError: String, Error, LocalizedError {
|
||||
case invalidUrl
|
||||
case invalidResponse
|
||||
case invalidData
|
||||
case noNetwork
|
||||
case noError
|
||||
|
||||
var errorDescription: String? {
|
||||
switch self {
|
||||
case .invalidUrl:
|
||||
"InvalidUrl"
|
||||
case .invalidResponse:
|
||||
"InvalidResponse"
|
||||
case .invalidData:
|
||||
"Проверьте номер группы"
|
||||
case .noNetwork:
|
||||
"No network connection"
|
||||
case .noError:
|
||||
"Нет ошибки"
|
||||
}
|
||||
}
|
||||
|
||||
var failureReason: String {
|
||||
switch self {
|
||||
case .invalidUrl:
|
||||
"Похоже не удалось составить ссылку для api"
|
||||
case .invalidResponse:
|
||||
"Для этой недели расписания еще нет"
|
||||
case .invalidData:
|
||||
"Похоже такой группы не существует"
|
||||
case .noNetwork:
|
||||
"Проверьте подключение к интернету и попробуйте заново"
|
||||
case .noError:
|
||||
"Ошибки нет"
|
||||
}
|
||||
}
|
||||
}
|
60
Schedule ICTIS/Utilities/Network/NetworkManager.swift
Normal file
60
Schedule ICTIS/Utilities/Network/NetworkManager.swift
Normal file
@ -0,0 +1,60 @@
|
||||
//
|
||||
// NetworkManager.swift
|
||||
// Schedule ICTIS
|
||||
//
|
||||
// Created by Mironov Egor on 18.11.2024.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
final class NetworkManager {
|
||||
//"https://webictis.sfedu.ru/schedule-api/?group=51.html&week=15"
|
||||
//MARK: Properties
|
||||
static let shared = NetworkManager()
|
||||
private let decoder = JSONDecoder()
|
||||
private let urlForGroup = "https://webictis.sfedu.ru/schedule-api/?query="
|
||||
private let urlForWeek = "https://webictis.sfedu.ru/schedule-api/?group="
|
||||
|
||||
//MARK: Initializer
|
||||
private init() {
|
||||
decoder.dateDecodingStrategy = .iso8601
|
||||
}
|
||||
|
||||
//MARK: Methods
|
||||
func makeUrlForGroup(_ group: String) -> String {
|
||||
return urlForGroup + group
|
||||
}
|
||||
|
||||
func makeUrlForWeek(_ numOfWeek: Int, _ htmlNameOfGroup: String) -> String {
|
||||
return urlForWeek + htmlNameOfGroup + "&week=" + String(numOfWeek)
|
||||
}
|
||||
|
||||
func getSchedule(_ group: String) async throws -> Schedule {
|
||||
let newUrlForGroup = makeUrlForGroup(group)
|
||||
guard let url = URL(string: newUrlForGroup) else {throw NetworkError.invalidUrl}
|
||||
let (data, response) = try await URLSession.shared.data(from: url)
|
||||
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {throw NetworkError.invalidResponse}
|
||||
|
||||
do {
|
||||
return try decoder.decode(Schedule.self, from: data)
|
||||
}
|
||||
catch {
|
||||
throw NetworkError.invalidData
|
||||
}
|
||||
}
|
||||
|
||||
func getScheduleForOtherWeek(_ numOfWeek: Int, _ htmlNameOfGroup: String) async throws -> Schedule {
|
||||
let newUrlForWeek = makeUrlForWeek(numOfWeek, htmlNameOfGroup)
|
||||
print(newUrlForWeek)
|
||||
guard let url = URL(string: newUrlForWeek) else {throw NetworkError.invalidUrl}
|
||||
let (data, response) = try await URLSession.shared.data(from: url)
|
||||
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {throw NetworkError.invalidResponse}
|
||||
|
||||
do {
|
||||
return try decoder.decode(Schedule.self, from: data)
|
||||
}
|
||||
catch {
|
||||
throw NetworkError.invalidData
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user