mirror of
https://github.com/NinjaCheetah/RIT-Dining.git
synced 2025-10-19 06:36:18 -04:00
A model is now used to store all of the dining location information. This means that the data is now shared between all views, making it much easier to refresh and removing lots of excess API calls. dining-all is now called for the current day and the following 6 days on app launch and on refresh, but beyond that no additional API calls need to be made (excluding occupancy info). This means no more loading screens between views! The window for hours in DetailView has been shifted to now show the current day and the next 6 days rather than the hours for each day in the current calendar week. This makes a lot more sense, because who cares what last Tuesday's hours were on Saturday, you'd rather know what's coming up in the next week. The visiting chef screen now supports scrolling through 7 days of visiting chefs instead of just today and tomorrow. Some basic frameworks laid for the visiting chef notification feature, however it does not work yet and is not exposed in the app. Also fixed sorting and searching bugs introduced by changes in the previous commit.
132 lines
3.6 KiB
Swift
132 lines
3.6 KiB
Swift
//
|
|
// Types.swift
|
|
// RIT Dining
|
|
//
|
|
// Created by Campbell on 9/2/25.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
// I'll be honest, I am NOT good at representing other people's JSON in my code. This kinda sucks but it gets the job done and can
|
|
// be improved later when I feel like it.
|
|
struct DiningLocationParser: Decodable {
|
|
// An individual "event", which is just an open period for the location.
|
|
struct Event: Decodable {
|
|
// Hour exceptions for the given event.
|
|
struct HoursException: Decodable {
|
|
let id: Int
|
|
let name: String
|
|
let startTime: String
|
|
let endTime: String
|
|
let startDate: String
|
|
let endDate: String
|
|
let open: Bool
|
|
}
|
|
let startTime: String
|
|
let endTime: String
|
|
let daysOfWeek: [String]
|
|
let exceptions: [HoursException]?
|
|
}
|
|
// An individual "menu", which can be either a daily special item or a visitng chef. Description needs to be optional because
|
|
// visiting chefs have descriptions but specials do not.
|
|
struct Menu: Decodable {
|
|
let name: String
|
|
let description: String?
|
|
let category: String
|
|
}
|
|
// Other basic information to read from a location's JSON that we'll need later.
|
|
let id: Int
|
|
let mdoId: Int
|
|
let name: String
|
|
let summary: String
|
|
let description: String
|
|
let mapsUrl: String
|
|
let events: [Event]
|
|
let menus: [Menu]
|
|
}
|
|
|
|
// Struct that probably doesn't need to exist but this made parsing the list of location responses easy.
|
|
struct DiningLocationsParser: Decodable {
|
|
let locations: [DiningLocationParser]
|
|
}
|
|
|
|
// Enum to represent the four possible states a given location can be in.
|
|
enum OpenStatus {
|
|
case open
|
|
case closed
|
|
case openingSoon
|
|
case closingSoon
|
|
}
|
|
|
|
// An individual open period for a location.
|
|
struct DiningTimes: Equatable, Hashable {
|
|
var openTime: Date
|
|
var closeTime: Date
|
|
}
|
|
|
|
// Enum to represent the five possible states a visiting chef can be in.
|
|
enum VisitingChefStatus {
|
|
case hereNow
|
|
case gone
|
|
case arrivingLater
|
|
case arrivingSoon
|
|
case leavingSoon
|
|
}
|
|
|
|
// A visiting chef present at a location.
|
|
struct VisitingChef: Equatable, Hashable {
|
|
let name: String
|
|
let description: String
|
|
var openTime: Date
|
|
var closeTime: Date
|
|
let status: VisitingChefStatus
|
|
}
|
|
|
|
// A daily special at a location.
|
|
struct DailySpecial: Equatable, Hashable {
|
|
let name: String
|
|
let type: String
|
|
}
|
|
|
|
// The basic information about a dining location needed to display it in the app after parsing is finished.
|
|
struct DiningLocation: Identifiable, Hashable {
|
|
let id: Int
|
|
let mdoId: Int
|
|
let name: String
|
|
let summary: String
|
|
let desc: String
|
|
let mapsUrl: String
|
|
let date: Date
|
|
let diningTimes: [DiningTimes]?
|
|
var open: OpenStatus
|
|
let visitingChefs: [VisitingChef]?
|
|
let dailySpecials: [DailySpecial]?
|
|
}
|
|
|
|
// Parser to read the occupancy data for a location.
|
|
struct DiningOccupancyParser: Decodable {
|
|
// Represents a per-hour occupancy rating.
|
|
struct HourlyOccupancy: Decodable {
|
|
let hour: Int
|
|
let today: Int
|
|
let today_max: Int
|
|
let one_week_ago: Int
|
|
let one_week_ago_max: Int
|
|
let average: Int
|
|
}
|
|
let count: Int
|
|
let location: String
|
|
let building: String
|
|
let mdo_id: Int
|
|
let max_occ: Int
|
|
let open_status: String
|
|
let intra_loc_hours: [HourlyOccupancy]
|
|
}
|
|
|
|
// Struct used to represent a day and its hours as strings. Type used for the hours of today and the next 6 days used in DetailView.
|
|
struct WeeklyHours: Hashable {
|
|
let day: String
|
|
let date: Date
|
|
let timeStrings: [String]
|
|
}
|