#import "ThingsHelper.h" NS_ASSUME_NONNULL_BEGIN ThingsURLRoute const ThingsURLRouteSearch = @"search"; ThingsURLRoute const ThingsURLRouteShow = @"show"; ThingsURLRoute const ThingsURLRouteUpdate = @"update"; ThingsURLRoute const ThingsURLRouteUpdateProject = @"update-project"; ThingsURLRoute const ThingsURLRouteAdd = @"add"; ThingsURLRoute const ThingsURLRouteAddProject = @"add-project"; @implementation ThingsHelper + (BOOL)requiresAuthentication:(ThingsURLRoute)route { if ([route isEqualToString:ThingsURLRouteSearch] || [route isEqualToString:ThingsURLRouteShow]) { return NO; } return YES; } + (BOOL)callRoute:(ThingsURLRoute)route withParameters:(NSDictionary *)parameters { NSString *authenticationKey = [KeychainHelper authenticationKey]; if ([self requiresAuthentication:route] && !authenticationKey) { NSLog(@"Attempted to call an authenticated things URL without an authentication key."); return NO; } NSString *baseURL = [NSString stringWithFormat:@"things:///%@", route]; NSMutableArray *queryComponents = [NSMutableArray array]; if ([self requiresAuthentication:route]) { [queryComponents addObject:[NSString stringWithFormat:@"auth-token=%@", authenticationKey]]; } for (NSString *key in parameters) { id value = parameters[key]; NSString *encodedKey = [self urlEncodeString:key]; NSString *encodedValue = [self urlEncodeString:[NSString stringWithFormat:@"%@", value]]; [queryComponents addObject:[NSString stringWithFormat:@"%@=%@", encodedKey, encodedValue]]; } NSString *urlString = baseURL; if ([queryComponents count] > 0) { urlString = [NSString stringWithFormat:@"%@?%@", baseURL, [queryComponents componentsJoinedByString:@"&"]]; } NSURL *url = [NSURL URLWithString:urlString]; [[NSWorkspace sharedWorkspace] openURL:url]; return YES; } + (NSString *)urlEncodeString:(NSString *)string { NSCharacterSet *allowedCharacters = [NSCharacterSet URLQueryAllowedCharacterSet]; return [string stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters]; } @end NS_ASSUME_NONNULL_END