git.iko.soy/dashared/hookah-tau
on e15738d help sign in
23 files changed+127−509
since splitsnapshots
unifiedsplit
Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/2/AdminSecondStepReservationViewController.swift → AdminSecondStepReservationViewController.swift+1−28 Hookah Tau.xcodeproj/project.pbxproj+8−44 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+4−1 Hookah Tau/Controllers/Admin/Clients/Profile/ClientProfileCoordinator.swift+2−12 Hookah Tau/Controllers/Admin/Clients/Profile/ProfileTableViewController.swift+5−21 Hookah Tau/Controllers/Admin/Reservations/AdminReservationEditingCoordinator.swift+1−3 Hookah Tau/Controllers/Admin/Reservations/AdminReservationEditingViewController.swift+9−49 Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsController.swift+1−1 Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsCoordinator.swift+1−4 Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/1/AdminFirstStepReservationViewCoordinator.swift−108 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+2−11 Hookah Tau/Models/User.swift+1−1
Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/2/AdminSecondStepReservationViewController.swift → AdminSecondStepReservationViewController.swiftrenamed+1−28
@@ -22,12 +22,8 @@ class AdminSecondStepReservationViewController: BaseViewController {
2222
2323 // MARK: - Properties
2424
25− var table: Int?
26−
2725 var mapScrollView: MapImageScroll?
2826
29− var clientsService: ClientsService?
30−
3127 weak var coordinator: AdminSecondStepReservationViewCoordinator?
3228
3329 let continueButton: Button = {
@@ -53,15 +49,13 @@ class AdminSecondStepReservationViewController: BaseViewController {
5349 setupButtons()
5450 setUpKeyboard()
5551
56− clientsService = ClientsService(apiClient: APIClient.shared)
5752 phoneTextField.becomeFirstResponder()
5853 }
5954
6055 // MARK: - Set up
6156
6257 func setupMap() {
63− guard let t = table else { return }
64− mapScrollView?.scrollToTable(table: t)
58+ mapScrollView?.scrollToTable(table: 8)
6559 mapContainerView.addSubviewThatFills(mapScrollView)
6660 }
6761
@@ -96,28 +90,7 @@ class AdminSecondStepReservationViewController: BaseViewController {
9690 }
9791
9892 @objc func continueBooking() {
99− continueButton.loading = true
10093
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− })
12194 }
12295
12396
Hookah Tau.xcodeproj/project.pbxproj+8−44
@@ -17,9 +17,6 @@
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 */; };
2320 12219CEF2353A63F0057DDEE /* ReservationsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12219CEE2353A63E0057DDEE /* ReservationsCoordinator.swift */; };
2421 12230AEA238FD8B3004A01E5 /* MapView2.xib in Resources */ = {isa = PBXBuildFile; fileRef = 12230AE9238FD8B3004A01E5 /* MapView2.xib */; };
2522 12230AEC238FD8C5004A01E5 /* MapView2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12230AEB238FD8C5004A01E5 /* MapView2.swift */; };
@@ -43,7 +40,6 @@
4340 124D007C23721FD400AE76B9 /* Reservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124D007B23721FD400AE76B9 /* Reservation.swift */; };
4441 124D007F237222B200AE76B9 /* ReservationsResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124D007E237222B200AE76B9 /* ReservationsResolver.swift */; };
4542 124D0081237222C900AE76B9 /* ReservationsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124D0080237222C900AE76B9 /* ReservationsService.swift */; };
46− 1252D9E523CDCDB300446B6F /* ACreateReservationResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1252D9E423CDCDB300446B6F /* ACreateReservationResolver.swift */; };
4743 125AE51D2395583E00F847BD /* ChangeReservationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 125AE51C2395583E00F847BD /* ChangeReservationCoordinator.swift */; };
4844 125AE51F2395585300F847BD /* ChangeReservationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 125AE51E2395585300F847BD /* ChangeReservationViewController.swift */; };
4945 125AE5212395753400F847BD /* HFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 125AE5202395753400F847BD /* HFunc.swift */; };
@@ -57,6 +53,7 @@
5753 12838EB82367834900CEF108 /* MyCodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12838EB72367834900CEF108 /* MyCodable.swift */; };
5854 129F162723CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162623CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift */; };
5955 129F162C23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162B23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift */; };
56+ 129F162E23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162D23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift */; };
6057 129F163023CC8EF600EE13FC /* PhoneTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162F23CC8EF600EE13FC /* PhoneTextField.swift */; };
6158 12A075F72373535C00D749BB /* FirstStepReservationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12A075F62373535C00D749BB /* FirstStepReservationViewController.swift */; };
6259 12A075F9237353F500D749BB /* MapView1.xib in Resources */ = {isa = PBXBuildFile; fileRef = 12A075F8237353F500D749BB /* MapView1.xib */; };
@@ -182,9 +179,6 @@
182179 12118B9D23682049006BAEE3 /* PhoneCodeResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneCodeResolver.swift; sourceTree = "<group>"; };
183180 1212048B23914CFD00CAF162 /* DeleteReservationResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteReservationResolver.swift; sourceTree = "<group>"; };
184181 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>"; };
188182 12219CEE2353A63E0057DDEE /* ReservationsCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReservationsCoordinator.swift; sourceTree = "<group>"; };
189183 12230AE9238FD8B3004A01E5 /* MapView2.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MapView2.xib; sourceTree = "<group>"; };
190184 12230AEB238FD8C5004A01E5 /* MapView2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView2.swift; sourceTree = "<group>"; };
@@ -208,7 +202,6 @@
208202 124D007B23721FD400AE76B9 /* Reservation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reservation.swift; sourceTree = "<group>"; };
209203 124D007E237222B200AE76B9 /* ReservationsResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReservationsResolver.swift; sourceTree = "<group>"; };
210204 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>"; };
212205 125AE51C2395583E00F847BD /* ChangeReservationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeReservationCoordinator.swift; sourceTree = "<group>"; };
213206 125AE51E2395585300F847BD /* ChangeReservationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeReservationViewController.swift; sourceTree = "<group>"; };
214207 125AE5202395753400F847BD /* HFunc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HFunc.swift; sourceTree = "<group>"; };
@@ -221,6 +214,7 @@
221214 12838EB72367834900CEF108 /* MyCodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyCodable.swift; sourceTree = "<group>"; };
222215 129F162623CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdminFirstStepReservationViewCoordinator.swift; sourceTree = "<group>"; };
223216 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; };
224218 129F162F23CC8EF600EE13FC /* PhoneTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneTextField.swift; sourceTree = "<group>"; };
225219 12A075F62373535C00D749BB /* FirstStepReservationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstStepReservationViewController.swift; sourceTree = "<group>"; };
226220 12A075F8237353F500D749BB /* MapView1.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MapView1.xib; sourceTree = "<group>"; };
@@ -406,31 +400,6 @@
406400 path = Reservations;
407401 sourceTree = "<group>";
408402 };
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− };
434403 12230AED238FD8D5004A01E5 /* 1 */ = {
435404 isa = PBXGroup;
436405 children = (
@@ -605,9 +574,9 @@
605574 129F162523CC836600EE13FC /* Making a reeservation */ = {
606575 isa = PBXGroup;
607576 children = (
608− 1220A6F823CDB65C00365E36 /* 1 */,
609− 1220A6F523CDB63000365E36 /* 2 */,
610− 1220A6FB23CDBED900365E36 /* 3 */,
577+ 129F162D23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift */,
578+ 129F162623CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift */,
579+ 129F162B23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift */,
611580 );
612581 path = "Making a reeservation";
613582 sourceTree = "<group>";
@@ -654,7 +623,6 @@
654623 12B3A7AC23ABEABF009E2FA6 /* AReservationsResolver.swift */,
655624 12B3A7C323AD2FCD009E2FA6 /* AChangeReservationResolver.swift */,
656625 12D928AE23C47DCF0051724D /* ADeleteReservationResolver.swift */,
657− 1252D9E423CDCDB300446B6F /* ACreateReservationResolver.swift */,
658626 );
659627 path = Admin;
660628 sourceTree = "<group>";
@@ -757,7 +725,6 @@
757725 12E35077239FAFA4004BB188 /* ClientsListResolver.swift */,
758726 12E3507C239FD1F3004BB188 /* ClientReservationsResolver.swift */,
759727 12D928B223C7464B0051724D /* BlocklistPutResolver.swift */,
760− 1220A6F323CDB1AD00365E36 /* GetClientByPhoneNumberResolver.swift */,
761728 );
762729 path = Resolvers;
763730 sourceTree = "<group>";
@@ -1229,6 +1196,7 @@
12291196 12BE4B352399A60A00FC974B /* AdminTabbarController.swift in Sources */,
12301197 12FC403A2382CB6F00AB593B /* TableButton.swift in Sources */,
12311198 12D928AF23C47DCF0051724D /* ADeleteReservationResolver.swift in Sources */,
1199+ 129F162E23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift in Sources */,
12321200 12EB698123661CB300E4D1CE /* AddressCell.swift in Sources */,
12331201 F3895F48233D2EEA00FA6A37 /* CodeSmsViewController.swift in Sources */,
12341202 12219CEF2353A63F0057DDEE /* ReservationsCoordinator.swift in Sources */,
@@ -1259,11 +1227,9 @@
12591227 12B3A7A323ABD594009E2FA6 /* AdminReservationsController.swift in Sources */,
12601228 F3FC7DCD2315BE610080D851 /* AppDelegate.swift in Sources */,
12611229 12838EB623677FB900CEF108 /* ApiRequest.swift in Sources */,
1262− 1220A6FA23CDBE7E00365E36 /* AdminFinalStepReservationCoordinator.swift in Sources */,
12631230 12118B9E23682049006BAEE3 /* PhoneCodeResolver.swift in Sources */,
12641231 F30369BE2336924D00A8EA84 /* ClientTabbarCoordinator.swift in Sources */,
12651232 F3FC7DFD2315C4710080D851 /* BaseCoordinator.swift in Sources */,
1266− 1220A6F723CDB64A00365E36 /* AdminSecondStepReservationViewController.swift in Sources */,
12671233 12E35071239FA8CA004BB188 /* Extensions+String.swift in Sources */,
12681234 12FC07B923C8D17600EDC55B /* DeleteOtherAdminResolver.swift in Sources */,
12691235 F3DC59FF233E893400B5E751 /* Extensions+UIFont.swift in Sources */,
@@ -1282,11 +1248,9 @@
12821248 12C72EDF23537D1B00AD7004 /* ProfileCoordinator.swift in Sources */,
12831249 12E3507D239FD1F3004BB188 /* ClientReservationsResolver.swift in Sources */,
12841250 12EA994E2362FCE8005D9FE9 /* AddressView.swift in Sources */,
1285− 1220A6F423CDB1AD00365E36 /* GetClientByPhoneNumberResolver.swift in Sources */,
12861251 F3895F4C233D347E00FA6A37 /* PhoneNumberViewController.swift in Sources */,
12871252 12EE4A76234BB8FE005B4D1A /* CodeView.swift in Sources */,
12881253 12230AF123900974004A01E5 /* TotalStorage.swift in Sources */,
1289− 1252D9E523CDCDB300446B6F /* ACreateReservationResolver.swift in Sources */,
12901254 12BD95B2237EC22B009614D8 /* FirstStepView.swift in Sources */,
12911255 F3EBE2472340FE87000FEE1A /* NameTextView.swift in Sources */,
12921256 120BFC7723891925001EBE89 /* ThirdStepReservationViewController.swift in Sources */,
@@ -1466,7 +1430,7 @@
14661430 buildSettings = {
14671431 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
14681432 CODE_SIGN_STYLE = Automatic;
1469− CURRENT_PROJECT_VERSION = 5;
1433+ CURRENT_PROJECT_VERSION = 4;
14701434 DEVELOPMENT_TEAM = 23S94LRHD8;
14711435 INFOPLIST_FILE = "Hookah Tau/Info.plist";
14721436 IPHONEOS_DEPLOYMENT_TARGET = 11.0;
@@ -1486,7 +1450,7 @@
14861450 buildSettings = {
14871451 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
14881452 CODE_SIGN_STYLE = Automatic;
1489− CURRENT_PROJECT_VERSION = 5;
1453+ CURRENT_PROJECT_VERSION = 4;
14901454 DEVELOPMENT_TEAM = 23S94LRHD8;
14911455 INFOPLIST_FILE = "Hookah Tau/Info.plist";
14921456 IPHONEOS_DEPLOYMENT_TARGET = 11.0;
Hookah Tau/API/APIClient.swift−2
@@ -48,8 +48,6 @@ 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
5351 case 422:
5452 if let data = response.data, let error = SE.fromJSONToSelf(data: data) {
5553 print(error)
Hookah Tau/API/ClientsService/ClientsService.swift−23
@@ -103,27 +103,4 @@ 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− }
129106}
Hookah Tau/API/ClientsService/Resolvers/GetClientByPhoneNumberResolver.swiftdeleted−35
@@ -1,35 +0,0 @@
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,27 +205,4 @@ 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− }
231208}
Hookah Tau/API/Reservations api/Resolvers/Admin/ACreateReservationResolver.swiftdeleted−37
@@ -1,37 +0,0 @@
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,7 +16,6 @@ enum GeneralError: Error {
1616 case serverError(SE)
1717 case decodeError
1818 case noData
19− case notFound
2019 case Error400
2120 case somethingWentCompletelyWrong
2221 case alamofireError
Hookah Tau/Controllers/Admin/Clients/ClientsCoordinator.swift+4−1
@@ -23,7 +23,10 @@ class ClientsCoordinator: BaseCoordinator {
2323 /// TODO
2424 func openUserProfile(_ profile: Client) {
2525 let profileCoordinator = ClientProfileCoordinator(navigationController: navigationController)
26− profileCoordinator.user = profile
26+ profileCoordinator.user = FullUser(uuid: profile.uuid,
27+ name: profile.name,
28+ phoneNumber: profile.phoneNumber,
29+ isAdmin: profile.isAdmin)
2730
2831 self.addDependency(profileCoordinator)
2932 profileCoordinator.didEndFlow = {
Hookah Tau/Controllers/Admin/Clients/Profile/ClientProfileCoordinator.swift+2−12
@@ -11,7 +11,7 @@ import UIKit
1111
1212class ClientProfileCoordinator: BaseCoordinator {
1313
14− var user: Client?
14+ var user: FullUser?
1515
1616 override func start() {
1717 let storyboard = UIStoryboard(name: "ClientList", bundle: nil)
@@ -24,18 +24,8 @@ class ClientProfileCoordinator: BaseCoordinator {
2424
2525
2626 // Создание бронирования из профиля клиента
27− func createReservation(forUserWithPhone phoneNumber: String, user fullUser: FullUser) {
28− let coordinator = AdminFirstStepReservationViewCoordinator(navigationController: navigationController)
29− coordinator.phone = phoneNumber
30− coordinator.fullUser = fullUser
27+ func createReservation(forUserWithPhone phoneNumber: String) {
3128
32− addDependency(coordinator)
33− coordinator.didFinish = { [weak self] in
34− self?.removeDependency(coordinator)
35− self?.navigationController?.popViewController(animated: true)
36− }
37−
38− coordinator.start()
3929 }
4030
4131 // Просмотр (и редактирование) брони
Hookah Tau/Controllers/Admin/Clients/Profile/ProfileTableViewController.swift+5−21
@@ -41,7 +41,7 @@ class ProfileTableViewController: BaseViewController {
4141
4242 var reservationsService: ReservationsService?
4343
44− var user: Client?
44+ var user: FullUser?
4545
4646 weak var coodinator: ClientProfileCoordinator?
4747
@@ -79,25 +79,19 @@ class ProfileTableViewController: BaseViewController {
7979 setupNavBar()
8080 setupTable()
8181 setupActivityIndicator()
82− //loadReservations()
82+ loadReservations()
8383 }
8484
8585 override func viewWillAppear(_ animated: Bool) {
86− super.viewWillAppear(animated)
87− tabBarController?.tabBar.isHidden = true
88− }
89−
90− override func viewDidAppear(_ animated: Bool) {
9186 super.viewDidAppear(animated)
92− loadReservations()
87+ tabBarController?.tabBar.isHidden = true
9388 }
9489
9590 // MARK: - Setup
9691
9792 func setupNavBar() {
9893 guard let u = user else { return }
99−
100− navigationItem.title = "\(u.name ?? "❔")\(u.isAdmin ? "👑" : "")\(u.isBlocked ? "❌" : "")"
94+ navigationItem.title = u.name
10195 navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(book))
10296 }
10397
@@ -188,16 +182,7 @@ class ProfileTableViewController: BaseViewController {
188182 }
189183
190184 @objc func book() {
191− guard
192− let phone = user?.phoneNumber,
193− let user = user
194− else { return }
195185
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)
201186 }
202187}
203188
@@ -222,8 +207,7 @@ extension ProfileTableViewController: UITableViewDelegate, UITableViewDataSource
222207 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
223208 guard let u = user else { return }
224209 let r = dataSource[indexPath.row]
225− let user = FullUser(uuid: u.uuid, name: u.name, phoneNumber: u.phoneNumber, isAdmin: u.isAdmin)
226− let reservation = ReservationWithUser(reservation: r, user: user)
210+ let reservation = ReservationWithUser(reservation: r, user: u)
227211 coodinator?.seeExistingReservation(data: reservation)
228212 }
229213
Hookah Tau/Controllers/Admin/Reservations/AdminReservationEditingCoordinator.swift+1−3
@@ -9,12 +9,10 @@
99import UIKit
1010
1111
12−class AdminReservationEditingCoordinator: BaseCoordinator, ShowReservationCoordinator {
12+class AdminReservationEditingCoordinator: BaseCoordinator {
1313
1414 // MARK: - Peoperties
1515
16− var didFinish: (() -> Void)?
17−
1816 var reservationData: ReservationWithUser?
1917
2018 // MARK: - Lifecycle
Hookah Tau/Controllers/Admin/Reservations/AdminReservationEditingViewController.swift+9−49
@@ -24,15 +24,13 @@ class AdminReservationEditingViewController: BaseViewController {
2424
2525 var reservationData: ReservationWithUser?
2626
27− weak var coordinator: ShowReservationCoordinator?
27+ weak var coordinator: AdminReservationEditingCoordinator?
2828
2929 var reservationService: ReservationsService?
3030
3131 var reservedPeriods: [ReservationPeriod] = [] {
3232 didSet {
33− if let _ = reservationView {
34− setupReservationViewWithIntervals()
35− }
33+ setupReservationViewWithIntervals()
3634 }
3735 }
3836
@@ -93,14 +91,9 @@ class AdminReservationEditingViewController: BaseViewController {
9391 }
9492
9593 func loadReservedPeriods() {
96− guard
97− let model = reservationData,
98− let uuid = model.uuid
99− else {
100− setupReservationViewWithIntervals()
101− return }
94+ guard let model = reservationData else { return }
10295
103− reservationService?.getReservationsAround(uuid: uuid, completion: { [weak self] (res) in
96+ reservationService?.getReservationsAround(uuid: model.uuid, completion: { [weak self] (res) in
10497 switch res {
10598 case .failure(let err):
10699 self?.displayAlert(forError: err)
@@ -118,10 +111,7 @@ class AdminReservationEditingViewController: BaseViewController {
118111 guard
119112 let r = reservationView?.data,
120113 let uuid = reservationData?.uuid
121− else {
122− createReservation()
123− return
124− }
114+ else { return }
125115
126116 reservationView?.saveButton?.loading = true
127117
@@ -132,7 +122,7 @@ class AdminReservationEditingViewController: BaseViewController {
132122 isAdmin: true,
133123 completion: { [weak self] (res) in
134124 if res {
135− self?.coordinator?.didFinish?()
125+ self?.coordinator?.didEndFlow?()
136126 } else {
137127 self?.displayAlert(with: "Что-то пошло не так! Попробуешь еще раз?")
138128 }
@@ -141,47 +131,17 @@ class AdminReservationEditingViewController: BaseViewController {
141131 })
142132 }
143133
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−
168134 @objc func cancelReservation() {
169135 guard
170− let uuid = reservationData?.uuid
171− else {
172− cancelPrereservation()
173− return }
136+ let uuid = reservationData?.uuid
137+ else { return }
174138
175139 reservationService?.deleteReservation(isAdmin: true, uuid: uuid, completion: { [weak self] (res) in
176140 if res {
177− self?.coordinator?.didFinish?()
141+ self?.coordinator?.didEndFlow?()
178142 } else {
179143 self?.displayAlert(with: "Что-то пошло не так!\nПопробуешь еще раз?")
180144 }
181145 })
182146 }
183−
184− func cancelPrereservation() {
185− coordinator?.didFinish?()
186− }
187147}
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− guard let uuid = activeReservations[indexPath.row].uuid else { return [] }
199+ let uuid = activeReservations[indexPath.row].uuid
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+1−4
@@ -12,8 +12,6 @@ class AdminReservationsCoordinator: BaseCoordinator {
1212
1313 // MARK: - Properties
1414
15− var didFinish: (() -> Void)?
16−
1715 var establishmentId: Int?
1816
1917 // MARK: - Lifecycle
@@ -44,9 +42,8 @@ class AdminReservationsCoordinator: BaseCoordinator {
4442 reservationCoordinator.establishment = establishmentId
4543 addDependency(reservationCoordinator)
4644 reservationCoordinator.didFinish = { [weak self] in
47− self?.navigationController?.popViewController(animated: false)
4845 self?.removeDependency(reservationCoordinator)
49− self?.didFinish?()
46+ self?.navigationController?.popViewController(animated: true)
5047 }
5148
5249 reservationCoordinator.start()
Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/1/AdminFirstStepReservationViewCoordinator.swiftdeleted−108
@@ -1,108 +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− 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−
Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/2/AdminSecondStepReservationViewCoordinator.swiftdeleted−54
@@ -1,54 +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− // 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.swiftdeleted−47
@@ -1,47 +0,0 @@
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.swiftnew file+61
@@ -0,0 +1,61 @@
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.swiftnew file+27
@@ -0,0 +1,27 @@
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()
119+ setUpIntervals(model.owner.isAdmin)
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() {
168+ func setUpIntervals(_ isAdmin: Bool) {
169169 guard let startPoint = startDate else { return }
170170
171− let startingPoint = startPoint.getAdminsStartingPoint()
172− let endingPoint = Constants.adminDuration
171+ let startingPoint = isAdmin ? startPoint.getAdminsStartingPoint() : Constants.clientStartingPoint
172+ let endingPoint = startingPoint + (isAdmin ? Constants.adminDuration : Constants.clientDuration)
173173
174174 for period in startingPoint...endingPoint {
175175 let timePointView = TimePointView.loadFromNib()
Hookah Tau/Models/Reservation.swift+2−11
@@ -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,16 +68,6 @@ 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− }
8171}
8272
8373struct AdminCreateReservation: MyCodable {
@@ -85,3 +75,4 @@ struct AdminCreateReservation: MyCodable {
8575 var user: String
8676}
8777
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