From 1613c951d49e6d85aff52f312d57fa087b35c079 Mon Sep 17 00:00:00 2001 From: Ruben Beltran del Rio Date: Wed, 10 Sep 2025 22:48:37 +0200 Subject: Move things URL calls to a helper --- QSThingsPlugin/Helpers/ThingsHelper.m | 70 +++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 QSThingsPlugin/Helpers/ThingsHelper.m (limited to 'QSThingsPlugin/Helpers/ThingsHelper.m') diff --git a/QSThingsPlugin/Helpers/ThingsHelper.m b/QSThingsPlugin/Helpers/ThingsHelper.m new file mode 100644 index 0000000..cc7267b --- /dev/null +++ b/QSThingsPlugin/Helpers/ThingsHelper.m @@ -0,0 +1,70 @@ +#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 + ++ (instancetype)sharedInstance { + static ThingsHelper *sharedInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[self alloc] init]; + }); + return sharedInstance; +} + ++ (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 -- cgit