|
6 | 6 | EventType, |
7 | 7 | PaymentMethod, |
8 | 8 | } from '@prisma/client'; |
| 9 | +import { EATERY_IMAGES_BASE_URL, Weekday, WEEKDAY_TO_DAY_OF_WEEK } from '../src/constants.js'; |
9 | 10 |
|
10 | 11 | export function mapCampusArea(area: RawCampusArea): CampusArea { |
11 | 12 | // Only consider descrshort for mapping |
@@ -99,85 +100,76 @@ export function mapEventType(eventDescription: string): EventType { |
99 | 100 | } |
100 | 101 | } |
101 | 102 |
|
102 | | -// Mapping from cornellId to Digital Ocean Spaces image URL |
103 | | -const CORNELL_ID_TO_IMAGE_URL: Record<number, string> = { |
104 | | - 31: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/104-West.jpg', |
105 | | - 7: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Amit-Bhatia-Libe-Cafe.jpg', |
106 | | - 8: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Atrium-Cafe.jpg', |
107 | | - 1: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Bear-Necessities.jpg', |
108 | | - 25: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Becker-House-Dining.jpg', |
109 | | - 10: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Big-Red-Barn.jpg', |
110 | | - 11: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Bug-Stop-Bagels.jpg', |
111 | | - 12: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Cafe-Jennie.jpg', |
112 | | - 26: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Cook-House-Dining.jpg', |
113 | | - 14: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Cornell-Dairy-Bar.jpg', |
114 | | - 41: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Crossings-Cafe.jpg', |
115 | | - 32: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/frannys.jpg', |
116 | | - 16: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Goldies-Cafe.jpg', |
117 | | - 15: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Green-Dragon.jpg', |
118 | | - 24: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Hot-Dog-Cart.jpg', |
119 | | - 34: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/icecreamcart.jpg', |
120 | | - 27: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Jansens-Dining.jpg', |
121 | | - 28: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Jansens-Market.jpg', |
122 | | - 29: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Keeton-House-Dining.jpg', |
123 | | - 42: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Mann-Cafe.jpg', |
124 | | - 18: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Marthas-Cafe.jpg', |
125 | | - 19: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Mattins-Cafe.jpg', |
126 | | - 33: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/mccormicks.jpg', |
127 | | - 3: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/North-Star.jpg', |
128 | | - 20: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Okenshields.jpg', |
129 | | - 4: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Risley-Dining.jpg', |
130 | | - 5: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Risley-Dining.jpg', // RPCC uses same image |
131 | | - 30: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Rose-House-Dining.jpg', |
132 | | - 21: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Rustys.jpg', |
133 | | - 13: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/StraightMarket.jpg', |
134 | | - 23: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Trillium.jpg', |
135 | | - 43: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Morrison-Dining.jpg', |
136 | | - 44: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/novicks-cafe.jpg', |
137 | | - 45: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/vets-cafe.jpg', |
138 | | - // Static eateries (negative IDs) |
139 | | - [-33]: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Terrace.jpg', |
140 | | - [-34]: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Macs-Cafe.jpg', |
141 | | - [-35]: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Zeus.jpg', |
142 | | - [-36]: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Gimme-Coffee.jpg', |
143 | | - [-37]: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Louies-Lunch.jpg', |
144 | | - [-38]: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Anabels-Grocery.jpg', |
145 | | - [-46]: 'https://appdev-upload.nyc3.digitaloceanspaces.com/eatery-images/Freege.jpg', |
| 103 | +// Mapping from cornellId to image filename (relative to base URL) |
| 104 | +const CORNELL_ID_TO_IMAGE_FILENAME: Record<number, string> = { |
| 105 | + 31: '104-West.jpg', |
| 106 | + 7: 'Amit-Bhatia-Libe-Cafe.jpg', |
| 107 | + 8: 'Atrium-Cafe.jpg', |
| 108 | + 1: 'Bear-Necessities.jpg', |
| 109 | + 25: 'Becker-House-Dining.jpg', |
| 110 | + 10: 'Big-Red-Barn.jpg', |
| 111 | + 11: 'Bug-Stop-Bagels.jpg', |
| 112 | + 12: 'Cafe-Jennie.jpg', |
| 113 | + 26: 'Cook-House-Dining.jpg', |
| 114 | + 14: 'Cornell-Dairy-Bar.jpg', |
| 115 | + 41: 'Crossings-Cafe.jpg', |
| 116 | + 32: 'frannys.jpg', |
| 117 | + 16: 'Goldies-Cafe.jpg', |
| 118 | + 15: 'Green-Dragon.jpg', |
| 119 | + 24: 'Hot-Dog-Cart.jpg', |
| 120 | + 34: 'icecreamcart.jpg', |
| 121 | + 27: 'Jansens-Dining.jpg', |
| 122 | + 28: 'Jansens-Market.jpg', |
| 123 | + 29: 'Keeton-House-Dining.jpg', |
| 124 | + 42: 'Mann-Cafe.jpg', |
| 125 | + 18: 'Marthas-Cafe.jpg', |
| 126 | + 19: 'Mattins-Cafe.jpg', |
| 127 | + 33: 'mccormicks.jpg', |
| 128 | + 3: 'North-Star.jpg', |
| 129 | + 20: 'Okenshields.jpg', |
| 130 | + 4: 'Risley-Dining.jpg', |
| 131 | + 5: 'Risley-Dining.jpg', |
| 132 | + 30: 'Rose-House-Dining.jpg', |
| 133 | + 21: 'Rustys.jpg', |
| 134 | + 13: 'StraightMarket.jpg', |
| 135 | + 23: 'Trillium.jpg', |
| 136 | + 43: 'Morrison-Dining.jpg', |
| 137 | + 44: 'novicks-cafe.jpg', |
| 138 | + 45: 'vets-cafe.jpg', |
| 139 | + // Static eateries |
| 140 | + [-33]: 'Terrace.jpg', |
| 141 | + [-34]: 'Macs-Cafe.jpg', |
| 142 | + [-35]: 'Zeus.jpg', |
| 143 | + [-36]: 'Gimme-Coffee.jpg', |
| 144 | + [-37]: 'Louies-Lunch.jpg', |
| 145 | + [-38]: 'Anabels-Grocery.jpg', |
| 146 | + [-46]: 'Freege.jpg', |
146 | 147 | }; |
147 | 148 |
|
148 | 149 | export function mapImageUrl(cornellId: number): string { |
149 | | - const imageUrl = CORNELL_ID_TO_IMAGE_URL[cornellId]; |
150 | | - if (!imageUrl) { |
| 150 | + const imageFilename = CORNELL_ID_TO_IMAGE_FILENAME[cornellId]; |
| 151 | + if (!imageFilename) { |
151 | 152 | throw new Error(`No image URL mapping found for cornellId: ${cornellId}`); |
152 | 153 | } |
153 | | - return imageUrl; |
| 154 | + return `${EATERY_IMAGES_BASE_URL}${imageFilename}`; |
154 | 155 | } |
155 | 156 |
|
156 | 157 | export function weekdayToDayOfWeek(weekday: string): number { |
157 | | - const weekdays: Record<string, number> = { |
158 | | - Sunday: 0, |
159 | | - Monday: 1, |
160 | | - Tuesday: 2, |
161 | | - Wednesday: 3, |
162 | | - Thursday: 4, |
163 | | - Friday: 5, |
164 | | - Saturday: 6, |
165 | | - }; |
166 | | - return weekdays[weekday] ?? 1; // Default to Monday if not found |
| 158 | + if (Object.values(Weekday).includes(weekday as Weekday)) { |
| 159 | + return WEEKDAY_TO_DAY_OF_WEEK[weekday as Weekday]; |
| 160 | + } |
| 161 | + // default to Monday if not found |
| 162 | + return WEEKDAY_TO_DAY_OF_WEEK[Weekday.MONDAY]; |
167 | 163 | } |
168 | 164 |
|
169 | 165 | export function parseTime(timeStr: string): { hours: number; minutes: number } { |
170 | 166 | const [hours, minutes] = timeStr.split(':').map(Number); |
171 | 167 | return { hours: hours ?? 0, minutes: minutes ?? 0 }; |
172 | 168 | } |
173 | 169 |
|
174 | | -/** |
175 | | - * Create a date for a specific weekday and time (for recurring weekly events) |
176 | | - */ |
177 | 170 | export function createWeeklyDate(weekday: string, timeStr: string, baseDate: Date = new Date()): Date { |
178 | 171 | const dayOfWeek = weekdayToDayOfWeek(weekday); |
179 | 172 | const { hours, minutes } = parseTime(timeStr); |
180 | | - |
181 | 173 | const date = new Date(baseDate); |
182 | 174 | const currentDay = date.getDay(); |
183 | 175 | const daysUntilTarget = (dayOfWeek - currentDay + 7) % 7; |
|
0 commit comments