git.iko.soy/dashared/hookah-tau
on develop help sign in
23 files changed+509−127
since splitsnapshots
unifiedsplit
Hookah Tau.xcodeproj/project.pbxproj+44−8 Hookah Tau/API/APIClient.swift+2 Hookah Tau/API/ClientsService/ClientsService.swift+23 Hookah Tau/API/ClientsService/Resolvers/GetClientByPhoneNumberResolver.swift+35 Hookah Tau/API/Reservations api/ReservationsService.swift+23 Hookah Tau/API/Reservations api/Resolvers/Admin/ACreateReservationResolver.swift+37 Hookah Tau/API/ServerError.swift+1 Hookah Tau/Controllers/Admin/Clients/ClientsCoordinator.swift+1−4 Hookah Tau/Controllers/Admin/Clients/Profile/ClientProfileCoordinator.swift+12−2 Hookah Tau/Controllers/Admin/Clients/Profile/ProfileTableViewController.swift+21−5 Hookah Tau/Controllers/Admin/Reservations/AdminReservationEditingCoordinator.swift+3−1 Hookah Tau/Controllers/Admin/Reservations/AdminReservationEditingViewController.swift+49−9 Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsController.swift+1−1 Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsCoordinator.swift+4−1 Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/1/AdminFirstStepReservationViewCoordinator.swift+108 AdminSecondStepReservationViewController.swift → Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/2/AdminSecondStepReservationViewController.swift+28−1 Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/2/AdminSecondStepReservationViewCoordinator.swift+54 Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/3/AdminFinalStepReservationCoordinator.swift+47 Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/AdminFirstStepReservationViewCoordinator.swift−61 Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/AdminSecondStepReservationViewCoordinator.swift−27 Hookah Tau/Controllers/Admin/Reservations/Views/AdminReservationView.swift+4−4 Hookah Tau/Models/Reservation.swift+11−2 Hookah Tau/Models/User.swift+1−1
Hookah Tau.xcodeproj/project.pbxproj+44−8
@@ -17,6 +17,9 @@
1717 12118B9E23682049006BAEE3 /* PhoneCodeResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12118B9D23682049006BAEE3 /* PhoneCodeResolver.swift */; };
1818 1212048C23914CFD00CAF162 /* DeleteReservationResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1212048B23914CFD00CAF162 /* DeleteReservationResolver.swift */; };
1919 1212048E23915A0A00CAF162 /* ChangeReservationResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1212048D23915A0A00CAF162 /* ChangeReservationResolver.swift */; };
20+ 1220A6F423CDB1AD00365E36 /* GetClientByPhoneNumberResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1220A6F323CDB1AD00365E36 /* GetClientByPhoneNumberResolver.swift */; };
21+ 1220A6F723CDB64A00365E36 /* AdminSecondStepReservationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1220A6F623CDB64A00365E36 /* AdminSecondStepReservationViewController.swift */; };
22+ 1220A6FA23CDBE7E00365E36 /* AdminFinalStepReservationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1220A6F923CDBE7E00365E36 /* AdminFinalStepReservationCoordinator.swift */; };
2023 12219CEF2353A63F0057DDEE /* ReservationsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12219CEE2353A63E0057DDEE /* ReservationsCoordinator.swift */; };
2124 12230AEA238FD8B3004A01E5 /* MapView2.xib in Resources */ = {isa = PBXBuildFile; fileRef = 12230AE9238FD8B3004A01E5 /* MapView2.xib */; };
2225 12230AEC238FD8C5004A01E5 /* MapView2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12230AEB238FD8C5004A01E5 /* MapView2.swift */; };
@@ -40,6 +43,7 @@
4043 124D007C23721FD400AE76B9 /* Reservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124D007B23721FD400AE76B9 /* Reservation.swift */; };
4144 124D007F237222B200AE76B9 /* ReservationsResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124D007E237222B200AE76B9 /* ReservationsResolver.swift */; };
4245 124D0081237222C900AE76B9 /* ReservationsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124D0080237222C900AE76B9 /* ReservationsService.swift */; };
46+ 1252D9E523CDCDB300446B6F /* ACreateReservationResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1252D9E423CDCDB300446B6F /* ACreateReservationResolver.swift */; };
4347 125AE51D2395583E00F847BD /* ChangeReservationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 125AE51C2395583E00F847BD /* ChangeReservationCoordinator.swift */; };
4448 125AE51F2395585300F847BD /* ChangeReservationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 125AE51E2395585300F847BD /* ChangeReservationViewController.swift */; };
4549 125AE5212395753400F847BD /* HFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 125AE5202395753400F847BD /* HFunc.swift */; };
@@ -53,7 +57,6 @@
5357 12838EB82367834900CEF108 /* MyCodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12838EB72367834900CEF108 /* MyCodable.swift */; };
5458 129F162723CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162623CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift */; };
5559 129F162C23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162B23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift */; };
56− 129F162E23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162D23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift */; };
5760 129F163023CC8EF600EE13FC /* PhoneTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162F23CC8EF600EE13FC /* PhoneTextField.swift */; };
5861 12A075F72373535C00D749BB /* FirstStepReservationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12A075F62373535C00D749BB /* FirstStepReservationViewController.swift */; };
5962 12A075F9237353F500D749BB /* MapView1.xib in Resources */ = {isa = PBXBuildFile; fileRef = 12A075F8237353F500D749BB /* MapView1.xib */; };
@@ -179,6 +182,9 @@
179182 12118B9D23682049006BAEE3 /* PhoneCodeResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneCodeResolver.swift; sourceTree = "<group>"; };
180183 1212048B23914CFD00CAF162 /* DeleteReservationResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteReservationResolver.swift; sourceTree = "<group>"; };
181184 1212048D23915A0A00CAF162 /* ChangeReservationResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeReservationResolver.swift; sourceTree = "<group>"; };
185+ 1220A6F323CDB1AD00365E36 /* GetClientByPhoneNumberResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetClientByPhoneNumberResolver.swift; sourceTree = "<group>"; };
186+ 1220A6F623CDB64A00365E36 /* AdminSecondStepReservationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdminSecondStepReservationViewController.swift; sourceTree = "<group>"; };
187+ 1220A6F923CDBE7E00365E36 /* AdminFinalStepReservationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdminFinalStepReservationCoordinator.swift; sourceTree = "<group>"; };
182188 12219CEE2353A63E0057DDEE /* ReservationsCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReservationsCoordinator.swift; sourceTree = "<group>"; };
183189 12230AE9238FD8B3004A01E5 /* MapView2.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MapView2.xib; sourceTree = "<group>"; };
184190 12230AEB238FD8C5004A01E5 /* MapView2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView2.swift; sourceTree = "<group>"; };
@@ -202,6 +208,7 @@
202208 124D007B23721FD400AE76B9 /* Reservation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reservation.swift; sourceTree = "<group>"; };
203209 124D007E237222B200AE76B9 /* ReservationsResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReservationsResolver.swift; sourceTree = "<group>"; };
204210 124D0080237222C900AE76B9 /* ReservationsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReservationsService.swift; sourceTree = "<group>"; };
211+ 1252D9E423CDCDB300446B6F /* ACreateReservationResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ACreateReservationResolver.swift; sourceTree = "<group>"; };
205212 125AE51C2395583E00F847BD /* ChangeReservationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeReservationCoordinator.swift; sourceTree = "<group>"; };
206213 125AE51E2395585300F847BD /* ChangeReservationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeReservationViewController.swift; sourceTree = "<group>"; };
207214 125AE5202395753400F847BD /* HFunc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HFunc.swift; sourceTree = "<group>"; };
@@ -214,7 +221,6 @@
214221 12838EB72367834900CEF108 /* MyCodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyCodable.swift; sourceTree = "<group>"; };
215222 129F162623CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdminFirstStepReservationViewCoordinator.swift; sourceTree = "<group>"; };
216223 129F162B23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdminSecondStepReservationViewCoordinator.swift; sourceTree = "<group>"; };
217− 129F162D23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdminSecondStepReservationViewController.swift; sourceTree = SOURCE_ROOT; };
218224 129F162F23CC8EF600EE13FC /* PhoneTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneTextField.swift; sourceTree = "<group>"; };
219225 12A075F62373535C00D749BB /* FirstStepReservationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstStepReservationViewController.swift; sourceTree = "<group>"; };
220226 12A075F8237353F500D749BB /* MapView1.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MapView1.xib; sourceTree = "<group>"; };
@@ -400,6 +406,31 @@
400406 path = Reservations;
401407 sourceTree = "<group>";
402408 };
409+ 1220A6F523CDB63000365E36 /* 2 */ = {
410+ isa = PBXGroup;
411+ children = (
412+ 1220A6F623CDB64A00365E36 /* AdminSecondStepReservationViewController.swift */,
413+ 129F162B23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift */,
414+ );
415+ path = 2;
416+ sourceTree = "<group>";
417+ };
418+ 1220A6F823CDB65C00365E36 /* 1 */ = {
419+ isa = PBXGroup;
420+ children = (
421+ 129F162623CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift */,
422+ );
423+ path = 1;
424+ sourceTree = "<group>";
425+ };
426+ 1220A6FB23CDBED900365E36 /* 3 */ = {
427+ isa = PBXGroup;
428+ children = (
429+ 1220A6F923CDBE7E00365E36 /* AdminFinalStepReservationCoordinator.swift */,
430+ );
431+ path = 3;
432+ sourceTree = "<group>";
433+ };
403434 12230AED238FD8D5004A01E5 /* 1 */ = {
404435 isa = PBXGroup;
405436 children = (
@@ -574,9 +605,9 @@
574605 129F162523CC836600EE13FC /* Making a reeservation */ = {
575606 isa = PBXGroup;
576607 children = (
577− 129F162D23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift */,
578− 129F162623CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift */,
579− 129F162B23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift */,
608+ 1220A6F823CDB65C00365E36 /* 1 */,
609+ 1220A6F523CDB63000365E36 /* 2 */,
610+ 1220A6FB23CDBED900365E36 /* 3 */,
580611 );
581612 path = "Making a reeservation";
582613 sourceTree = "<group>";
@@ -623,6 +654,7 @@
623654 12B3A7AC23ABEABF009E2FA6 /* AReservationsResolver.swift */,
624655 12B3A7C323AD2FCD009E2FA6 /* AChangeReservationResolver.swift */,
625656 12D928AE23C47DCF0051724D /* ADeleteReservationResolver.swift */,
657+ 1252D9E423CDCDB300446B6F /* ACreateReservationResolver.swift */,
626658 );
627659 path = Admin;
628660 sourceTree = "<group>";
@@ -725,6 +757,7 @@
725757 12E35077239FAFA4004BB188 /* ClientsListResolver.swift */,
726758 12E3507C239FD1F3004BB188 /* ClientReservationsResolver.swift */,
727759 12D928B223C7464B0051724D /* BlocklistPutResolver.swift */,
760+ 1220A6F323CDB1AD00365E36 /* GetClientByPhoneNumberResolver.swift */,
728761 );
729762 path = Resolvers;
730763 sourceTree = "<group>";
@@ -1196,7 +1229,6 @@
11961229 12BE4B352399A60A00FC974B /* AdminTabbarController.swift in Sources */,
11971230 12FC403A2382CB6F00AB593B /* TableButton.swift in Sources */,
11981231 12D928AF23C47DCF0051724D /* ADeleteReservationResolver.swift in Sources */,
1199− 129F162E23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift in Sources */,
12001232 12EB698123661CB300E4D1CE /* AddressCell.swift in Sources */,
12011233 F3895F48233D2EEA00FA6A37 /* CodeSmsViewController.swift in Sources */,
12021234 12219CEF2353A63F0057DDEE /* ReservationsCoordinator.swift in Sources */,
@@ -1227,9 +1259,11 @@
12271259 12B3A7A323ABD594009E2FA6 /* AdminReservationsController.swift in Sources */,
12281260 F3FC7DCD2315BE610080D851 /* AppDelegate.swift in Sources */,
12291261 12838EB623677FB900CEF108 /* ApiRequest.swift in Sources */,
1262+ 1220A6FA23CDBE7E00365E36 /* AdminFinalStepReservationCoordinator.swift in Sources */,
12301263 12118B9E23682049006BAEE3 /* PhoneCodeResolver.swift in Sources */,
12311264 F30369BE2336924D00A8EA84 /* ClientTabbarCoordinator.swift in Sources */,
12321265 F3FC7DFD2315C4710080D851 /* BaseCoordinator.swift in Sources */,
1266+ 1220A6F723CDB64A00365E36 /* AdminSecondStepReservationViewController.swift in Sources */,
12331267 12E35071239FA8CA004BB188 /* Extensions+String.swift in Sources */,
12341268 12FC07B923C8D17600EDC55B /* DeleteOtherAdminResolver.swift in Sources */,
12351269 F3DC59FF233E893400B5E751 /* Extensions+UIFont.swift in Sources */,
@@ -1248,9 +1282,11 @@
12481282 12C72EDF23537D1B00AD7004 /* ProfileCoordinator.swift in Sources */,
12491283 12E3507D239FD1F3004BB188 /* ClientReservationsResolver.swift in Sources */,
12501284 12EA994E2362FCE8005D9FE9 /* AddressView.swift in Sources */,
1285+ 1220A6F423CDB1AD00365E36 /* GetClientByPhoneNumberResolver.swift in Sources */,
12511286 F3895F4C233D347E00FA6A37 /* PhoneNumberViewController.swift in Sources */,
12521287 12EE4A76234BB8FE005B4D1A /* CodeView.swift in Sources */,
12531288 12230AF123900974004A01E5 /* TotalStorage.swift in Sources */,
1289+ 1252D9E523CDCDB300446B6F /* ACreateReservationResolver.swift in Sources */,
12541290 12BD95B2237EC22B009614D8 /* FirstStepView.swift in Sources */,
12551291 F3EBE2472340FE87000FEE1A /* NameTextView.swift in Sources */,
12561292 120BFC7723891925001EBE89 /* ThirdStepReservationViewController.swift in Sources */,
@@ -1430,7 +1466,7 @@
14301466 buildSettings = {
14311467 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
14321468 CODE_SIGN_STYLE = Automatic;
1433− CURRENT_PROJECT_VERSION = 4;
1469+ CURRENT_PROJECT_VERSION = 5;
14341470 DEVELOPMENT_TEAM = 23S94LRHD8;
14351471 INFOPLIST_FILE = "Hookah Tau/Info.plist";
14361472 IPHONEOS_DEPLOYMENT_TARGET = 11.0;
@@ -1450,7 +1486,7 @@
14501486 buildSettings = {
14511487 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
14521488 CODE_SIGN_STYLE = Automatic;
1453− CURRENT_PROJECT_VERSION = 4;
1489+ CURRENT_PROJECT_VERSION = 5;
14541490 DEVELOPMENT_TEAM = 23S94LRHD8;
14551491 INFOPLIST_FILE = "Hookah Tau/Info.plist";
14561492 IPHONEOS_DEPLOYMENT_TARGET = 11.0;
Hookah Tau/API/APIClient.swift+2
@@ -48,6 +48,8 @@ class APIClient {
4848 let json = String(data: data, encoding: String.Encoding.utf8)
4949 print("Failure Response: \(String(describing: json))")
5050 }
51+ case 404:
52+ return GeneralError.notFound
5153 case 422:
5254 if let data = response.data, let error = SE.fromJSONToSelf(data: data) {
5355 print(error)
Hookah Tau/API/ClientsService/ClientsService.swift+23
@@ -103,4 +103,27 @@ class ClientsService {
103103 }
104104 }
105105 }
106+
107+ func getClientByPhoneNumber(userPhone: String, completion: @escaping ((Result<FullUser, GeneralError>) -> Void)) {
108+ let resolver = GetClientByPhoneNumberResolver<ClientInResponce>(userPhone: userPhone)
109+ let request = ApiRequest(resolver: resolver, httpMethod: .get)
110+
111+ apiClient.load(request: request.request) { (result) in
112+ switch result {
113+ case .failure(let err):
114+ completion(.failure(err))
115+ return
116+ case .success(let responce):
117+ guard
118+ let d = responce.data,
119+ let decData = resolver.targetClass().fromJSONToSelf(data: d)
120+ else {
121+ completion(.failure(GeneralError.decodeError))
122+ return
123+ }
124+
125+ completion(.success(decData.client))
126+ }
127+ }
128+ }
106129}
Hookah Tau/API/ClientsService/Resolvers/GetClientByPhoneNumberResolver.swiftnew file+35
@@ -0,0 +1,35 @@
1+//
2+// GetClientByPhoneNumberResolver.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 14/01/2020.
6+// Copyright © 2020 Daria Rednikina. All rights reserved.
7+//
8+
9+import Foundation
10+
11+struct ClientInResponce: MyCodable {
12+ var client: FullUser
13+}
14+
15+/// `GET /admin/clients/by-phone/{user id}`
16+class GetClientByPhoneNumberResolver<Responce: MyCodable>: ApiResolver {
17+
18+ var name: String {
19+ return "/clients/by-phone/\(userPhone)"
20+ }
21+
22+ var groupName: String? {
23+ return "/admin"
24+ }
25+
26+ var userPhone: String
27+
28+ init(userPhone: String) {
29+ self.userPhone = userPhone
30+ }
31+
32+ func targetClass() -> Responce.Type {
33+ return Responce.self
34+ }
35+}
Hookah Tau/API/Reservations api/ReservationsService.swift+23
@@ -205,4 +205,27 @@ class ReservationsService {
205205 }
206206 }
207207 }
208+
209+ func createReservation(reservation: AdminCreateReservation, completion: @escaping ((Result<String, GeneralError>) -> Void)) {
210+ let resolver = ACreateReservationResolver<ACreateAdminResonce>(data: reservation)
211+ let request = ApiRequest(resolver: resolver, httpMethod: .post)
212+
213+ apiClient.load(request: request.request) { (res) in
214+ switch res {
215+ case .failure(let err):
216+ completion(.failure(err))
217+ return
218+ case .success(let responce):
219+ guard
220+ let d = responce.data,
221+ let decData = resolver.targetClass().fromJSONToSelf(data: d)
222+ else {
223+ completion(.failure(GeneralError.decodeError))
224+ return
225+ }
226+
227+ completion(.success(decData.reservationUUID))
228+ }
229+ }
230+ }
208231}
Hookah Tau/API/Reservations api/Resolvers/Admin/ACreateReservationResolver.swiftnew file+37
@@ -0,0 +1,37 @@
1+//
2+// ACreateReservationResolver.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 14/01/2020.
6+// Copyright © 2020 Daria Rednikina. All rights reserved.
7+//
8+
9+import Foundation
10+
11+struct ACreateAdminResonce: MyCodable {
12+ var reservationUUID: String
13+}
14+
15+class ACreateReservationResolver<Responce: MyCodable>: ApiResolver {
16+ var name: String {
17+ return "/reservations"
18+ }
19+
20+ var groupName: String? {
21+ return "/admin"
22+ }
23+
24+ var data: AdminCreateReservation
25+
26+ init(data: AdminCreateReservation) {
27+ self.data = data
28+ }
29+
30+ func parameters() -> MyCodable? {
31+ return data
32+ }
33+
34+ func targetClass() -> Responce.Type {
35+ return Responce.self
36+ }
37+}
Hookah Tau/API/ServerError.swift+1
@@ -16,6 +16,7 @@ enum GeneralError: Error {
1616 case serverError(SE)
1717 case decodeError
1818 case noData
19+ case notFound
1920 case Error400
2021 case somethingWentCompletelyWrong
2122 case alamofireError
Hookah Tau/Controllers/Admin/Clients/ClientsCoordinator.swift+1−4
@@ -23,10 +23,7 @@ class ClientsCoordinator: BaseCoordinator {
2323 /// TODO
2424 func openUserProfile(_ profile: Client) {
2525 let profileCoordinator = ClientProfileCoordinator(navigationController: navigationController)
26− profileCoordinator.user = FullUser(uuid: profile.uuid,
27− name: profile.name,
28− phoneNumber: profile.phoneNumber,
29− isAdmin: profile.isAdmin)
26+ profileCoordinator.user = profile
3027
3128 self.addDependency(profileCoordinator)
3229 profileCoordinator.didEndFlow = {
Hookah Tau/Controllers/Admin/Clients/Profile/ClientProfileCoordinator.swift+12−2
@@ -11,7 +11,7 @@ import UIKit
1111
1212class ClientProfileCoordinator: BaseCoordinator {
1313
14− var user: FullUser?
14+ var user: Client?
1515
1616 override func start() {
1717 let storyboard = UIStoryboard(name: "ClientList", bundle: nil)
@@ -24,8 +24,18 @@ class ClientProfileCoordinator: BaseCoordinator {
2424
2525
2626 // Создание бронирования из профиля клиента
27− func createReservation(forUserWithPhone phoneNumber: String) {
27+ func createReservation(forUserWithPhone phoneNumber: String, user fullUser: FullUser) {
28+ let coordinator = AdminFirstStepReservationViewCoordinator(navigationController: navigationController)
29+ coordinator.phone = phoneNumber
30+ coordinator.fullUser = fullUser
2831
32+ addDependency(coordinator)
33+ coordinator.didFinish = { [weak self] in
34+ self?.removeDependency(coordinator)
35+ self?.navigationController?.popViewController(animated: true)
36+ }
37+
38+ coordinator.start()
2939 }
3040
3141 // Просмотр (и редактирование) брони
Hookah Tau/Controllers/Admin/Clients/Profile/ProfileTableViewController.swift+21−5
@@ -41,7 +41,7 @@ class ProfileTableViewController: BaseViewController {
4141
4242 var reservationsService: ReservationsService?
4343
44− var user: FullUser?
44+ var user: Client?
4545
4646 weak var coodinator: ClientProfileCoordinator?
4747
@@ -79,19 +79,25 @@ class ProfileTableViewController: BaseViewController {
7979 setupNavBar()
8080 setupTable()
8181 setupActivityIndicator()
82− loadReservations()
82+ //loadReservations()
8383 }
8484
8585 override func viewWillAppear(_ animated: Bool) {
86− super.viewDidAppear(animated)
86+ super.viewWillAppear(animated)
8787 tabBarController?.tabBar.isHidden = true
8888 }
8989
90+ override func viewDidAppear(_ animated: Bool) {
91+ super.viewDidAppear(animated)
92+ loadReservations()
93+ }
94+
9095 // MARK: - Setup
9196
9297 func setupNavBar() {
9398 guard let u = user else { return }
94− navigationItem.title = u.name
99+
100+ navigationItem.title = "\(u.name ?? "❔")\(u.isAdmin ? "👑" : "")\(u.isBlocked ? "❌" : "")"
95101 navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(book))
96102 }
97103
@@ -182,7 +188,16 @@ class ProfileTableViewController: BaseViewController {
182188 }
183189
184190 @objc func book() {
191+ guard
192+ let phone = user?.phoneNumber,
193+ let user = user
194+ else { return }
185195
196+ let fullUser = FullUser(uuid: user.uuid,
197+ name: user.name,
198+ phoneNumber: user.phoneNumber,
199+ isAdmin: user.isAdmin)
200+ coodinator?.createReservation(forUserWithPhone: phone, user: fullUser)
186201 }
187202}
188203
@@ -207,7 +222,8 @@ extension ProfileTableViewController: UITableViewDelegate, UITableViewDataSource
207222 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
208223 guard let u = user else { return }
209224 let r = dataSource[indexPath.row]
210− let reservation = ReservationWithUser(reservation: r, user: u)
225+ let user = FullUser(uuid: u.uuid, name: u.name, phoneNumber: u.phoneNumber, isAdmin: u.isAdmin)
226+ let reservation = ReservationWithUser(reservation: r, user: user)
211227 coodinator?.seeExistingReservation(data: reservation)
212228 }
213229
Hookah Tau/Controllers/Admin/Reservations/AdminReservationEditingCoordinator.swift+3−1
@@ -9,10 +9,12 @@
99import UIKit
1010
1111
12−class AdminReservationEditingCoordinator: BaseCoordinator {
12+class AdminReservationEditingCoordinator: BaseCoordinator, ShowReservationCoordinator {
1313
1414 // MARK: - Peoperties
1515
16+ var didFinish: (() -> Void)?
17+
1618 var reservationData: ReservationWithUser?
1719
1820 // MARK: - Lifecycle
Hookah Tau/Controllers/Admin/Reservations/AdminReservationEditingViewController.swift+49−9
@@ -24,13 +24,15 @@ class AdminReservationEditingViewController: BaseViewController {
2424
2525 var reservationData: ReservationWithUser?
2626
27− weak var coordinator: AdminReservationEditingCoordinator?
27+ weak var coordinator: ShowReservationCoordinator?
2828
2929 var reservationService: ReservationsService?
3030
3131 var reservedPeriods: [ReservationPeriod] = [] {
3232 didSet {
33− setupReservationViewWithIntervals()
33+ if let _ = reservationView {
34+ setupReservationViewWithIntervals()
35+ }
3436 }
3537 }
3638
@@ -91,9 +93,14 @@ class AdminReservationEditingViewController: BaseViewController {
9193 }
9294
9395 func loadReservedPeriods() {
94− guard let model = reservationData else { return }
96+ guard
97+ let model = reservationData,
98+ let uuid = model.uuid
99+ else {
100+ setupReservationViewWithIntervals()
101+ return }
95102
96− reservationService?.getReservationsAround(uuid: model.uuid, completion: { [weak self] (res) in
103+ reservationService?.getReservationsAround(uuid: uuid, completion: { [weak self] (res) in
97104 switch res {
98105 case .failure(let err):
99106 self?.displayAlert(forError: err)
@@ -111,7 +118,10 @@ class AdminReservationEditingViewController: BaseViewController {
111118 guard
112119 let r = reservationView?.data,
113120 let uuid = reservationData?.uuid
114− else { return }
121+ else {
122+ createReservation()
123+ return
124+ }
115125
116126 reservationView?.saveButton?.loading = true
117127
@@ -122,7 +132,7 @@ class AdminReservationEditingViewController: BaseViewController {
122132 isAdmin: true,
123133 completion: { [weak self] (res) in
124134 if res {
125− self?.coordinator?.didEndFlow?()
135+ self?.coordinator?.didFinish?()
126136 } else {
127137 self?.displayAlert(with: "Что-то пошло не так! Попробуешь еще раз?")
128138 }
@@ -131,17 +141,47 @@ class AdminReservationEditingViewController: BaseViewController {
131141 })
132142 }
133143
144+ func createReservation() {
145+ guard
146+ let r = reservationData,
147+ let d = reservationData?.owner.phoneNumber else { return }
148+
149+ let data = ReservationData(establishment: r.establishment,
150+ startTime: r.startTime,
151+ endTime: r.endTime,
152+ numberOfGuests: r.numberOfGuests,
153+ reservedTable: r.reservedTable)
154+ print(data)
155+ reservationService?.createReservation(reservation: AdminCreateReservation(reservation: data, user: d), completion: { (res) in
156+ switch res {
157+ case .failure(_):
158+ self.displayAlert(with: "Что-то пошло не так!\nПопробуешь еще раз?")
159+ return
160+ case .success(let uuid):
161+ self.reservationData?.uuid = uuid
162+ self.coordinator?.didFinish?()
163+ return
164+ }
165+ })
166+ }
167+
134168 @objc func cancelReservation() {
135169 guard
136− let uuid = reservationData?.uuid
137− else { return }
170+ let uuid = reservationData?.uuid
171+ else {
172+ cancelPrereservation()
173+ return }
138174
139175 reservationService?.deleteReservation(isAdmin: true, uuid: uuid, completion: { [weak self] (res) in
140176 if res {
141− self?.coordinator?.didEndFlow?()
177+ self?.coordinator?.didFinish?()
142178 } else {
143179 self?.displayAlert(with: "Что-то пошло не так!\nПопробуешь еще раз?")
144180 }
145181 })
146182 }
183+
184+ func cancelPrereservation() {
185+ coordinator?.didFinish?()
186+ }
147187}
Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsController.swift+1−1
@@ -196,7 +196,7 @@ extension AdminReservationsController: UITableViewDelegate, UITableViewDataSourc
196196
197197 func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
198198
199− let uuid = activeReservations[indexPath.row].uuid
199+ guard let uuid = activeReservations[indexPath.row].uuid else { return [] }
200200 let cancelButton = UITableViewRowAction(style: .normal, title: "отменить бронь") { _,_ in
201201
202202 self.deleteReservation(uuid: uuid) { optionalNewVal in
Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsCoordinator.swift+4−1
@@ -12,6 +12,8 @@ class AdminReservationsCoordinator: BaseCoordinator {
1212
1313 // MARK: - Properties
1414
15+ var didFinish: (() -> Void)?
16+
1517 var establishmentId: Int?
1618
1719 // MARK: - Lifecycle
@@ -42,8 +44,9 @@ class AdminReservationsCoordinator: BaseCoordinator {
4244 reservationCoordinator.establishment = establishmentId
4345 addDependency(reservationCoordinator)
4446 reservationCoordinator.didFinish = { [weak self] in
47+ self?.navigationController?.popViewController(animated: false)
4548 self?.removeDependency(reservationCoordinator)
46− self?.navigationController?.popViewController(animated: true)
49+ self?.didFinish?()
4750 }
4851
4952 reservationCoordinator.start()
Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/1/AdminFirstStepReservationViewCoordinator.swiftnew file+108
@@ -0,0 +1,108 @@
1+//
2+// AdminFirstStepReservationViewCoordinator.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 13/01/2020.
6+// Copyright © 2020 Daria Rednikina. All rights reserved.
7+//
8+
9+import UIKit
10+
11+enum UserType {
12+ case admin
13+ case client
14+}
15+
16+protocol FirstStepReservationProtocol: BaseCoordinator {
17+
18+ var user: UserType { get }
19+
20+ func makeReservation(model: SecondStepModel, mapView: MapImageScroll?)
21+}
22+
23+class AdminFirstStepReservationViewCoordinator: BaseCoordinator{
24+
25+ // MARK: - Properties
26+
27+ var didFinish: (() -> Void)?
28+
29+ var establishment: Int = 1
30+
31+ var phone: String?
32+
33+ var fullUser: FullUser?
34+
35+ var model: SecondStepModel?
36+
37+ // MARK: - Lifecycle
38+
39+ override func start() {
40+ let storyboard = UIStoryboard(name: "Reservation", bundle: nil)
41+ let reservationVC = storyboard.instantiateViewController(withIdentifier: "ReservationViewController") as! FirstStepReservationViewController
42+
43+ reservationVC.coordinator = self
44+ reservationVC.establishmentId = establishment
45+
46+ navigationController?.pushViewController(reservationVC, animated: true)
47+ }
48+
49+
50+}
51+
52+extension AdminFirstStepReservationViewCoordinator: FirstStepReservationProtocol {
53+
54+ var user: UserType {
55+ get {
56+ return .admin
57+ }
58+ }
59+
60+ func makeReservation(model: SecondStepModel, mapView: MapImageScroll?) {
61+ self.model = model
62+
63+ if let p = phone {
64+ goToFinalStep(with: fullUser, phone: p)
65+ } else {
66+ goToSecondStep(model: model, mapView: mapView)
67+ }
68+ }
69+
70+ func goToFinalStep(with user: FullUser?, phone phoneNumber: String) {
71+ let finalStepCoordinator = AdminFinalStepReservationCoordinator(navigationController: navigationController)
72+ finalStepCoordinator.model = self.model
73+
74+ addDependency(finalStepCoordinator)
75+ finalStepCoordinator.didFinish = { [weak self] in
76+ self?.navigationController?.popViewController(animated: false)
77+ self?.removeDependency(finalStepCoordinator)
78+ self?.didFinish?()
79+ }
80+
81+ if let u = user {
82+ finalStepCoordinator.user = u
83+ } else {
84+ finalStepCoordinator.user = FullUser(uuid: nil,
85+ name: nil,
86+ phoneNumber: phoneNumber,
87+ isAdmin: true)
88+ }
89+
90+ finalStepCoordinator.start()
91+ }
92+
93+ func goToSecondStep(model: SecondStepModel, mapView: MapImageScroll?) {
94+ let reservationCoordinaotor = AdminSecondStepReservationViewCoordinator(navigationController: navigationController)
95+ reservationCoordinaotor.model = model
96+ reservationCoordinaotor.map = mapView
97+
98+ addDependency(reservationCoordinaotor)
99+ reservationCoordinaotor.didFinish = { [weak self] in
100+ self?.navigationController?.popViewController(animated: false)
101+ self?.removeDependency(reservationCoordinaotor)
102+ self?.didFinish?()
103+ }
104+
105+ reservationCoordinaotor.start()
106+ }
107+}
108+
AdminSecondStepReservationViewController.swift → Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/2/AdminSecondStepReservationViewController.swiftrenamed+28−1
@@ -22,8 +22,12 @@ class AdminSecondStepReservationViewController: BaseViewController {
2222
2323 // MARK: - Properties
2424
25+ var table: Int?
26+
2527 var mapScrollView: MapImageScroll?
2628
29+ var clientsService: ClientsService?
30+
2731 weak var coordinator: AdminSecondStepReservationViewCoordinator?
2832
2933 let continueButton: Button = {
@@ -49,13 +53,15 @@ class AdminSecondStepReservationViewController: BaseViewController {
4953 setupButtons()
5054 setUpKeyboard()
5155
56+ clientsService = ClientsService(apiClient: APIClient.shared)
5257 phoneTextField.becomeFirstResponder()
5358 }
5459
5560 // MARK: - Set up
5661
5762 func setupMap() {
58− mapScrollView?.scrollToTable(table: 8)
63+ guard let t = table else { return }
64+ mapScrollView?.scrollToTable(table: t)
5965 mapContainerView.addSubviewThatFills(mapScrollView)
6066 }
6167
@@ -90,7 +96,28 @@ class AdminSecondStepReservationViewController: BaseViewController {
9096 }
9197
9298 @objc func continueBooking() {
99+ continueButton.loading = true
93100
101+ guard let phone = phoneTextField.text?.toApiPhoneNumberFormat(), phone.count == 9 else {
102+ displayAlert(with: "Сначала укажи номер!")
103+ return
104+ }
105+
106+ clientsService?.getClientByPhoneNumber(userPhone: phone, completion: { [unowned self] (res) in
107+ switch res {
108+ case .failure(let err):
109+ switch err {
110+ case .notFound:
111+ self.coordinator?.continueReservation(with: nil, phone: phone)
112+ default:
113+ self.displayAlert(with: "Что-то пошло не так! Попробуй еще раз :)")
114+ }
115+ case .success(let user):
116+ self.coordinator?.continueReservation(with: user, phone: phone)
117+ }
118+
119+ self.continueButton.loading = false
120+ })
94121 }
95122
96123
Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/2/AdminSecondStepReservationViewCoordinator.swiftnew file+54
@@ -0,0 +1,54 @@
1+//
2+// AdminSecondStepReservationViewCoordinator.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 13/01/2020.
6+// Copyright © 2020 Daria Rednikina. All rights reserved.
7+//
8+
9+import UIKit
10+
11+class AdminSecondStepReservationViewCoordinator: BaseCoordinator {
12+
13+ // MARK: - Properties
14+
15+ var didFinish: (() -> Void)?
16+
17+ var map: MapImageScroll?
18+
19+ var model: SecondStepModel?
20+
21+ // MARK: - Lifecycle
22+
23+ override func start() {
24+ let storyboard = UIStoryboard(name: "AdminReservations", bundle: nil)
25+ let reservationVC = storyboard.instantiateViewController(withIdentifier: "AdminSecondStepReservationViewController") as! AdminSecondStepReservationViewController
26+ reservationVC.mapScrollView = map
27+ reservationVC.table = model?.table
28+ reservationVC.coordinator = self
29+ navigationController?.pushViewController(reservationVC, animated: true)
30+ }
31+
32+ func continueReservation(with user: FullUser?, phone phoneNumber: String) {
33+ let finalStepCoordinator = AdminFinalStepReservationCoordinator(navigationController: navigationController)
34+ finalStepCoordinator.model = self.model
35+
36+ addDependency(finalStepCoordinator)
37+ finalStepCoordinator.didFinish = { [weak self] in
38+ self?.navigationController?.popViewController(animated: false)
39+ self?.removeDependency(finalStepCoordinator)
40+ self?.didFinish?()
41+ }
42+
43+ if let u = user {
44+ finalStepCoordinator.user = u
45+ } else {
46+ finalStepCoordinator.user = FullUser(uuid: nil,
47+ name: nil,
48+ phoneNumber: phoneNumber,
49+ isAdmin: true)
50+ }
51+
52+ finalStepCoordinator.start()
53+ }
54+}
Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/3/AdminFinalStepReservationCoordinator.swiftnew file+47
@@ -0,0 +1,47 @@
1+//
2+// AdminFinalStepReservationCoordinator.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 14/01/2020.
6+// Copyright © 2020 Daria Rednikina. All rights reserved.
7+//
8+
9+import UIKit
10+
11+protocol ShowReservationCoordinator: BaseCoordinator {
12+ var didFinish: (() -> Void)? { get }
13+}
14+
15+class AdminFinalStepReservationCoordinator: BaseCoordinator, ShowReservationCoordinator {
16+
17+ // MARK: - Properties
18+
19+ var didFinish: (() -> Void)?
20+
21+ var user: FullUser?
22+
23+ var model: SecondStepModel?
24+
25+ // MARK: - Lifecycle
26+
27+ override func start() {
28+ let storyboard = UIStoryboard(name: "AdminReservations", bundle: nil)
29+ let vc = storyboard.instantiateViewController(withIdentifier: "AdminReservationEditingViewController") as! AdminReservationEditingViewController
30+
31+ guard
32+ let model = model,
33+ let u = user else { return }
34+ vc.reservationData = ReservationWithUser(uuid: nil,
35+ establishment: model.establishment,
36+ startTime: model.startTime,
37+ endTime: model.startTime.addHours(2),
38+ numberOfGuests: 2,
39+ reservedTable: model.table,
40+ owner: u)
41+
42+ vc.reservedPeriods = model.reservedintervals
43+ vc.coordinator = self
44+
45+ navigationController?.pushViewController(vc, animated: true)
46+ }
47+}
Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/AdminFirstStepReservationViewCoordinator.swiftdeleted−61
@@ -1,61 +0,0 @@
1−//
2−// AdminFirstStepReservationViewCoordinator.swift
3−// Hookah Tau
4−//
5−// Created by cstore on 13/01/2020.
6−// Copyright © 2020 Daria Rednikina. All rights reserved.
7−//
8−
9−import UIKit
10−
11−enum UserType {
12− case admin
13− case client
14−}
15−
16−protocol FirstStepReservationProtocol: BaseCoordinator {
17−
18− var user: UserType { get }
19−
20− func makeReservation(model: SecondStepModel, mapView: MapImageScroll?)
21−}
22−
23−class AdminFirstStepReservationViewCoordinator: BaseCoordinator{
24−
25− // MARK: - Properties
26−
27− var didFinish: (() -> Void)?
28−
29− var establishment: Int = 1
30−
31− // MARK: - Lifecycle
32−
33− override func start() {
34− let storyboard = UIStoryboard(name: "Reservation", bundle: nil)
35− let reservationVC = storyboard.instantiateViewController(withIdentifier: "ReservationViewController") as! FirstStepReservationViewController
36−
37− reservationVC.coordinator = self
38− reservationVC.establishmentId = establishment
39−
40− navigationController?.pushViewController(reservationVC, animated: true)
41− }
42−
43−
44−}
45−
46−extension AdminFirstStepReservationViewCoordinator: FirstStepReservationProtocol {
47−
48− var user: UserType {
49− get {
50− return .admin
51− }
52− }
53−
54− func makeReservation(model: SecondStepModel, mapView: MapImageScroll?) {
55− let reservationCoordinaotor = AdminSecondStepReservationViewCoordinator(navigationController: navigationController)
56− reservationCoordinaotor.map = mapView
57− addDependency(reservationCoordinaotor)
58− reservationCoordinaotor.start()
59− }
60−}
61−
Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/AdminSecondStepReservationViewCoordinator.swiftdeleted−27
@@ -1,27 +0,0 @@
1−//
2−// AdminSecondStepReservationViewCoordinator.swift
3−// Hookah Tau
4−//
5−// Created by cstore on 13/01/2020.
6−// Copyright © 2020 Daria Rednikina. All rights reserved.
7−//
8−
9−import UIKit
10−
11−class AdminSecondStepReservationViewCoordinator: BaseCoordinator {
12−
13− var map: MapImageScroll?
14−
15− override func start() {
16− let storyboard = UIStoryboard(name: "AdminReservations", bundle: nil)
17− let reservationVC = storyboard.instantiateViewController(withIdentifier: "AdminSecondStepReservationViewController") as! AdminSecondStepReservationViewController
18− reservationVC.mapScrollView = map
19− reservationVC.coordinator = self
20− navigationController?.pushViewController(reservationVC, animated: true)
21− }
22−
23− func continueReservation() {
24− let editingCoordinator = AdminReservationEditingCoordinator(navigationController: navigationController)
25− editingCoordinator.start()
26− }
27−}
Hookah Tau/Controllers/Admin/Reservations/Views/AdminReservationView.swift+4−4
@@ -116,7 +116,7 @@ class AdminReservationView: UIView {
116116
117117 startDate = start
118118
119− setUpIntervals(model.owner.isAdmin)
119+ setUpIntervals()
120120
121121 guestSlider?.maximumValue = Float((TotalStorage.standard.getTable(establishment: model.establishment, table: model.reservedTable)?.maxGuestNumber ?? 2) + 1)
122122 }
@@ -165,11 +165,11 @@ class AdminReservationView: UIView {
165165 // MARK: - Setup
166166
167167 /// Тут происходит установка интервалов. Разное для клиента и админа
168− func setUpIntervals(_ isAdmin: Bool) {
168+ func setUpIntervals() {
169169 guard let startPoint = startDate else { return }
170170
171− let startingPoint = isAdmin ? startPoint.getAdminsStartingPoint() : Constants.clientStartingPoint
172− let endingPoint = startingPoint + (isAdmin ? Constants.adminDuration : Constants.clientDuration)
171+ let startingPoint = startPoint.getAdminsStartingPoint()
172+ let endingPoint = Constants.adminDuration
173173
174174 for period in startingPoint...endingPoint {
175175 let timePointView = TimePointView.loadFromNib()
Hookah Tau/Models/Reservation.swift+11−2
@@ -51,7 +51,7 @@ struct ReservationData: MyCodable {
5151/// Структура для получения респонса на `GET /admin/reservations/{establishment id}`
5252struct ReservationWithUser: MyCodable {
5353
54− var uuid: String
54+ var uuid: String?
5555 var establishment: Int
5656 var startTime: Date
5757 var endTime: Date
@@ -68,6 +68,16 @@ struct ReservationWithUser: MyCodable {
6868 self.reservedTable = reservation.reservedTable
6969 self.owner = user
7070 }
71+
72+ init(uuid: String?, establishment: Int, startTime: Date, endTime: Date, numberOfGuests: Int, reservedTable: Int, owner: FullUser) {
73+ self.uuid = uuid
74+ self.establishment = establishment
75+ self.startTime = startTime
76+ self.endTime = endTime
77+ self.numberOfGuests = numberOfGuests
78+ self.reservedTable = reservedTable
79+ self.owner = owner
80+ }
7181}
7282
7383struct AdminCreateReservation: MyCodable {
@@ -75,4 +85,3 @@ struct AdminCreateReservation: MyCodable {
7585 var user: String
7686}
7787
78−
Hookah Tau/Models/User.swift+1−1
@@ -17,7 +17,7 @@ struct User: MyCodable {
1717
1818/// При запросах на список пользователей в аккаунте администратора.
1919struct FullUser: MyCodable {
20− var uuid: String
20+ var uuid: String?
2121 var name: String?
2222 var phoneNumber: String
2323 var isAdmin: Bool