Today's Menu  Portugal
journal and plan nutrition
V7GoogDriveAPIController.m
Go to the documentation of this file.
1 //
2 // V7GoogDriveAPIController.m
3 // PantryLevel
4 //
5 // Created by Don Zeek on 12/27/18.
6 // Copyright © 2018 coordinated-medicine. All rights reserved.
7 //
8 
10 #import "Z5DataController.h"
11 
12 
24 @implementation V7GoogDriveAPIController
25 
26 id<V7GoogDriveAPIProtocol> mDriveAPIDelegate;
27 
28 - (instancetype) initWithDelegate:(id <V7GoogDriveAPIProtocol>)delegate
29 {
30  self = [super init];
31  if (self) {
33  }
34  return self;
35 }
36 
37 // List up to 10 files in Drive
38 - (GTLRServiceTicket *)listRoot {
39 
41  remoteDataController] driveController];
42  GTLRDriveQuery_FilesList *query = [GTLRDriveQuery_FilesList query];
43  query.fields = @"nextPageToken, files(id, name)";
44  query.pageSize = 100;
45  query.q = @"name = 'NutritionJournal'";
46 
47  NSMutableDictionary<NSString *,id> *extraTicketProps = [[NSMutableDictionary alloc] init];
48  [extraTicketProps setObject:@"chase-root" forKey:@"query-stage"];
49  [query.executionParameters setTicketProperties:extraTicketProps];
50 
51  NSLog(@"V7GoogDriveAPIController.listRoot: authorizer: %@", driveController.service.authorizer);
52 
53  GTLRServiceTicket *queryTicket = [driveController.service executeQuery:query
54  delegate:self
55  didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)];
56 
57  return queryTicket;
58 }
59 
60 - (GTLRServiceTicket *)listJournalRoot:(NSString *)journalRootId {
61 
62  NSLog(@"V7GoogDriveAPIController.listRoot");
63  Z5GoogleDriveController *driveController = [[[Z5DataController sharedInstance] remoteDataController] driveController];
64 
65  GTLRDriveQuery_FilesList *query = [GTLRDriveQuery_FilesList query];
66  query.fields = @"nextPageToken, files(id, name, mimeType)";
67  query.pageSize = 100;
68  query.q = [NSString stringWithFormat:@"'%@' in parents and mimeType = 'application/vnd.google-apps.folder'",
69  journalRootId];
70 
71  NSMutableDictionary<NSString *,id> *extraTicketProps = [[NSMutableDictionary alloc] init];
72  [extraTicketProps setObject:@"chase-journal-root" forKey:@"query-stage"];
73  [query.executionParameters setTicketProperties:extraTicketProps];
74 
75  NSLog(@"V7GoogDriveAPIController.listRoot: authorizer: %@", driveController.service.authorizer);
76 
77  GTLRServiceTicket *queryTicket = [driveController.service
78  executeQuery:query
79  delegate:self
80  didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)];
81 
82  return queryTicket;
83 }
87 - (NSArray *)listJournalItemRoot:(NSArray<GTLRDrive_File *> *)itemFiles
88 {
89  NSLog(@"V7GoogDriveAPIController.listJournalItemRoot: input file count: %lu", (unsigned long)[itemFiles count]);
90 
91  NSMutableArray * ret = [[NSMutableArray alloc] init];
92  for (GTLRDrive_File *file in itemFiles) {
93  NSLog(@"V7GoogDriveAPIController.listJournalItemRoot: mimeType %@", file.mimeType);
94 
95  [ret addObject:[file name]];
96 
97  if ([file.mimeType isEqualToString:@"application/vnd.google-apps.folder"]) {
98  [self listJournaItemPartRoot:file.identifier];
99  } else {
100 
101  }
102  }
103  return ret;
104 }
105 - (GTLRServiceTicket *)listJournaItemPartRoot:(NSString *)journalItemPartRootId {
106 
107  NSLog(@"V7GoogDriveAPIController.listJournaItemPartRoot");
108  Z5GoogleDriveController *driveController = [[[Z5DataController sharedInstance] remoteDataController] driveController];
109 
110  GTLRDriveQuery_FilesList *query = [GTLRDriveQuery_FilesList query];
111  query.fields = @"nextPageToken, files(id, name)";
112  query.pageSize = 100;
113  query.q = [NSString stringWithFormat:@"'%@' in parents", journalItemPartRootId];
114 
115  NSMutableDictionary<NSString *,id> *extraTicketProps = [[NSMutableDictionary alloc] init];
116  [extraTicketProps setObject:@"chase-journal-item-part-root" forKey:@"query-stage"];
117  [query.executionParameters setTicketProperties:extraTicketProps];
118 
119  // NSLog(@"V7GoogDriveAPIController.listJournaItemPartRoot: authorizer: %@", driveController.service.authorizer);
120 
121  GTLRServiceTicket *queryTicket = [driveController.service executeQuery:query
122  delegate:self
123  didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)];
124 
125  return queryTicket;
126 }
127 
128 // Process the response and display output
129 - (void)displayResultWithTicket:(GTLRServiceTicket *)ticket
130  finishedWithObject:(GTLRDrive_FileList *)result
131  error:(NSError *)error {
132 
133  NSDictionary<NSString *,id> *extraTicketProps = [ticket ticketProperties];
134  NSString *queryFetchKey = [extraTicketProps objectForKey:@"query-stage"];
135 
136  // NSLog(@"V7GoogDriveAPIController.displayResultWithTicket: queryFetchKey: %@", queryFetchKey);
137  NSLog(@"V7GoogDriveAPIController.displayResultWithTicket: key: %@ count: %lu",
138  queryFetchKey, [result.files count]);
139  if (error == nil) {
140  if ([queryFetchKey isEqualToString:@"chase-root"]) {
141  // TODO: journalRootId: save for multiple access
142  NSString *journalRootId;
143  for (GTLRDrive_File *file in result.files) {
144  journalRootId = file.identifier;
145  }
146  [self listJournalRoot:journalRootId];
147  } else if ([queryFetchKey isEqualToString:@"chase-journal-root"]) {
148  NSLog(@"V7GoogDriveAPIController.displayResultWithTicket: JournalRoot");
149  // this is the original, only, use of .resultStage
150  [mDriveAPIDelegate resultStage:qJournalRoot returnedFiles:result.files];
151  } else if ([queryFetchKey isEqualToString:@"chase-journal-item-root"]) {
152  NSLog(@"V7GoogDriveAPIController.displayResultWithTicket: JournalItemRoot");
153  /* TODO: save result 'journalItemRoot' */
154  [mDriveAPIDelegate resultStage:kOblateSpheroid returnedFiles:result.files];
155  } else if ([queryFetchKey isEqualToString:@"chase-journal-item-part-root"]) {
156  NSLog(@"V7GoogDriveAPIController.displayResultWithTicket: JournalItemPartRoot");
157  [mDriveAPIDelegate resultStage:qJournalPartRoot returnedFiles:result.files];
158  }
159  [self logFilesList:result.files];
160  [mDriveAPIDelegate ticketCompleted:ticket];
161 
162  } else {
163  NSMutableString *errMessage = [[NSMutableString alloc] init];
164  [errMessage appendFormat:@"Error getting presentation data: %@\n", error.localizedDescription];
165  // [self showAlert:@"Error" message:message];
166  NSLog(@"V7GoogDriveAPIController.displayResultWithTicket:: Error: %@", error.localizedDescription);
167  }
168  // END -- Log files list
169 }
170 
171 
172 
173 - (void) placeRecipe
174 {
175  [self createFolder:@"Baked Halibut" inFolder:nil];
176 }
177 - (void) createFolder:(NSString *) newFolderName inFolder:(NSObject *) parent
178 {
179  [self createFolder:@"Baked Halibut" inFolder:nil];
180  Z5GoogleLoginController *loginControl = [[[Z5DataController sharedInstance] remoteDataController] loginController];
181  NSLog(@"Z5GoogleDriveController.createFolder: user: %@ new folder name: %@", [loginControl username], newFolderName);
182  if (nil!=[loginControl username]) {
183  // this branch executes, however Error: Code=401 "Login Required"
184  GTLRDrive_File *metadata = [GTLRDrive_File object];
185  metadata.name = newFolderName;
186  metadata.mimeType = @"application/vnd.google-apps.folder";
187  GTLRDriveQuery_FilesCreate *query =
188  [GTLRDriveQuery_FilesCreate queryWithObject:metadata
189  uploadParameters:nil];
190  query.fields = @"id";
191  [mDriveAPIDelegate.service executeQuery:query completionHandler:^(GTLRServiceTicket *ticket,
192  GTLRDrive_File *file,
193  NSError *error) {
194  if (error == nil) {
195  NSLog(@"Z5GoogleDriveController.createFolder: File ID %@", file.identifier);
196  } else {
197  NSLog(@"Z5GoogleDriveController.createFolder: An error occurred: %@", error);
198  }
199  }];
200  } else {
201  NSLog(@"Z5GoogleDriveController.createFolder: not logged in");
202  }
203 }
204 
205 - (void) uploadFile
206 {
207  [self createFolder:@"Baked Halibut" inFolder:nil];
208  NSData *fileData = [[NSFileManager defaultManager] contentsAtPath:@"files/photo.jpg"];
209  NSString *folderId = @"0BwwA4oUTeiV1UVNwOHItT0xfa2M";
210 
211  GTLRDrive_File *metadata = [GTLRDrive_File object];
212  metadata.name = @"photo.jpg";
213  metadata.parents = [NSArray arrayWithObject:folderId];
214 
215  GTLRUploadParameters *uploadParameters = [GTLRUploadParameters uploadParametersWithData:fileData MIMEType:@"image/jpeg"];
216  uploadParameters.shouldUploadWithSingleRequest = TRUE;
217  GTLRDriveQuery_FilesCreate *query = [GTLRDriveQuery_FilesCreate queryWithObject:metadata
218  uploadParameters:uploadParameters];
219  query.fields = @"id";
220  [mDriveAPIDelegate.service executeQuery:query completionHandler:^(GTLRServiceTicket *ticket,
221  GTLRDrive_File *file,
222  NSError *error) {
223  if (error == nil) {
224  NSLog(@"Z5GoogleDriveController.uploadFile: File ID %@", file.identifier);
225  } else {
226  NSLog(@"Z5GoogleDriveController.uploadFile: An error occurred: %@", error);
227  }
228  }];
229 }
230 
231 
232 
233 - (void) logFilesList:(NSArray<GTLRDrive_File *> *)fileArr
234 {
235  // Log files list
236  NSMutableString *output = [[NSMutableString alloc] init];
237  if (fileArr.count > 0) {
238  [output appendString:@"Files:\n"];
239  int count = 1;
240  for (GTLRDrive_File *file in fileArr) {
241  [output appendFormat:@"%@ (%@)\n", file.name, file.identifier];
242  count++;
243  }
244  } else {
245  [output appendString:@"No files found."];
246  }
247  NSLog(@"V7GoogleDriveViewController.logFilesList: %@", output);
248  // END = Log files list
249 }
250 
251 @end
id< V7GoogDriveAPIProtocol > mDriveAPIDelegate
GTLRServiceTicket * listJournaItemPartRoot:(NSString *journalItemPartRootId)
void createFolder:inFolder:(NSString *newFolderName, [inFolder] NSObject *parent)
instancetype sharedInstance()
GTLRServiceTicket * listJournalRoot:(NSString *journalRootId)
NSString * journalRootId
id< U7ParamEditControlDelegate > delegate
Singleton interface to both core and remote data sources.
void logFilesList:(NSArray< GTLRDrive_File *> *fileArr)