This commit is contained in:
Vladimir Dubovik
2024-12-12 13:37:07 +03:00
parent 1de531abc8
commit 92b125927d
13 changed files with 45 additions and 6 deletions

View 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:
"Ошибки нет"
}
}
}

View 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
}
}
}