From 2bab9a9ab1748f24cb669774aae02a0ff5a629e1 Mon Sep 17 00:00:00 2001 From: phongnv Date: Mon, 14 Aug 2017 00:06:07 +0700 Subject: [PATCH] update api and token --- LifeLog/LifeLog.xcodeproj/project.pbxproj | 20 ++++++- LifeLog/LifeLog/AppDelegate.m | 14 ++++- LifeLog/LifeLog/Entities.h | 1 + LifeLog/LifeLog/HomeViewController.m | 20 +++++++ LifeLog/LifeLog/ServerAPI.h | 6 +++ LifeLog/LifeLog/ServerAPI.m | 89 +++++++++++++++++++++++++++++++ LifeLog/LifeLog/StepObject.h | 15 ++++++ LifeLog/LifeLog/StepObject.m | 13 +++++ LifeLog/LifeLog/TargetInfor.h | 17 ++++++ LifeLog/LifeLog/TargetInfor.m | 27 ++++++++++ LifeLog/LifeLog/TopObject.h | 19 +++++++ LifeLog/LifeLog/TopObject.m | 13 +++++ 12 files changed, 252 insertions(+), 2 deletions(-) create mode 100644 LifeLog/LifeLog/StepObject.h create mode 100644 LifeLog/LifeLog/StepObject.m create mode 100644 LifeLog/LifeLog/TargetInfor.h create mode 100644 LifeLog/LifeLog/TargetInfor.m create mode 100644 LifeLog/LifeLog/TopObject.h create mode 100644 LifeLog/LifeLog/TopObject.m diff --git a/LifeLog/LifeLog.xcodeproj/project.pbxproj b/LifeLog/LifeLog.xcodeproj/project.pbxproj index 6fc0550..551053e 100644 --- a/LifeLog/LifeLog.xcodeproj/project.pbxproj +++ b/LifeLog/LifeLog.xcodeproj/project.pbxproj @@ -35,6 +35,9 @@ 6E84E3C61F27ACAE001EB88E /* MapViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6E84E3C41F27ACAE001EB88E /* MapViewController.xib */; }; 6E8DA0F71F2BAC3400CCE941 /* TodayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E8DA0F51F2BAC3400CCE941 /* TodayViewController.m */; }; 6E8DA0F81F2BAC3500CCE941 /* TodayViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6E8DA0F61F2BAC3400CCE941 /* TodayViewController.xib */; }; + 6EA4AF311F40BB7A00F52CFE /* StepObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EA4AF2C1F40BB7A00F52CFE /* StepObject.m */; }; + 6EA4AF321F40BB7A00F52CFE /* TargetInfor.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EA4AF2E1F40BB7A00F52CFE /* TargetInfor.m */; }; + 6EA4AF331F40BB7A00F52CFE /* TopObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EA4AF301F40BB7A00F52CFE /* TopObject.m */; }; 6ECC40711F2A5FEB00AAEB97 /* NSDate+helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 6ECC40701F2A5FEB00AAEB97 /* NSDate+helper.m */; }; 6EDC8BEE1F2C2FB800765ACC /* Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EDC8BED1F2C2FB800765ACC /* Utilities.m */; }; 6EDC8BF41F2C68D700765ACC /* CMMotionActivityExtra.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EDC8BF31F2C68D700765ACC /* CMMotionActivityExtra.m */; }; @@ -140,6 +143,12 @@ 6E8DA0F41F2BAC3400CCE941 /* TodayViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TodayViewController.h; sourceTree = ""; }; 6E8DA0F51F2BAC3400CCE941 /* TodayViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TodayViewController.m; sourceTree = ""; }; 6E8DA0F61F2BAC3400CCE941 /* TodayViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TodayViewController.xib; sourceTree = ""; }; + 6EA4AF2B1F40BB7A00F52CFE /* StepObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StepObject.h; sourceTree = ""; }; + 6EA4AF2C1F40BB7A00F52CFE /* StepObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StepObject.m; sourceTree = ""; }; + 6EA4AF2D1F40BB7A00F52CFE /* TargetInfor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TargetInfor.h; sourceTree = ""; }; + 6EA4AF2E1F40BB7A00F52CFE /* TargetInfor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TargetInfor.m; sourceTree = ""; }; + 6EA4AF2F1F40BB7A00F52CFE /* TopObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopObject.h; sourceTree = ""; }; + 6EA4AF301F40BB7A00F52CFE /* TopObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopObject.m; sourceTree = ""; }; 6ECC406F1F2A5FEB00AAEB97 /* NSDate+helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+helper.h"; sourceTree = ""; }; 6ECC40701F2A5FEB00AAEB97 /* NSDate+helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+helper.m"; sourceTree = ""; }; 6EDC8BEC1F2C2FB800765ACC /* Utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Utilities.h; sourceTree = ""; }; @@ -255,9 +264,15 @@ 6E18CED91F2E40AE0029891F /* Model */ = { isa = PBXGroup; children = ( + 6E18CEDD1F2E46570029891F /* Entities.h */, + 6EA4AF2B1F40BB7A00F52CFE /* StepObject.h */, + 6EA4AF2C1F40BB7A00F52CFE /* StepObject.m */, + 6EA4AF2D1F40BB7A00F52CFE /* TargetInfor.h */, + 6EA4AF2E1F40BB7A00F52CFE /* TargetInfor.m */, + 6EA4AF2F1F40BB7A00F52CFE /* TopObject.h */, + 6EA4AF301F40BB7A00F52CFE /* TopObject.m */, 6E18CEDA1F2E40F50029891F /* User.h */, 6E18CEDB1F2E40F50029891F /* User.m */, - 6E18CEDD1F2E46570029891F /* Entities.h */, E9373E481F35AA180059355A /* HistoryObject.h */, E9373E491F35AA180059355A /* HistoryObject.m */, E9373E4B1F361A230059355A /* HistoryGraphObject.h */, @@ -781,6 +796,7 @@ 6E7F93431F35872B00EFBC71 /* TPKeyboardAvoidingScrollView.m in Sources */, 6E7F93421F35872B00EFBC71 /* TPKeyboardAvoidingCollectionView.m in Sources */, E968550A1F3C444900317CEF /* AutoTransButton.m in Sources */, + 6EA4AF321F40BB7A00F52CFE /* TargetInfor.m in Sources */, E933E6741F3E0E4E002926F5 /* GroupObject.m in Sources */, 9CBDA0FA1F2ECE2C0055DED1 /* BaseViewController.m in Sources */, 6E8DA0F71F2BAC3400CCE941 /* TodayViewController.m in Sources */, @@ -797,6 +813,7 @@ E9F73DCC1F338A0F004A3A6F /* HistoryListTableViewCell.m in Sources */, 6EDC8BF41F2C68D700765ACC /* CMMotionActivityExtra.m in Sources */, E933E6791F40513C002926F5 /* GroupDetailViewController.m in Sources */, + 6EA4AF311F40BB7A00F52CFE /* StepObject.m in Sources */, 9CBDA0FF1F2F03810055DED1 /* RegisterViewController.m in Sources */, E9373E4A1F35AA180059355A /* HistoryObject.m in Sources */, 9CA8AEEA1F31BB4600C5FC74 /* ConfirmForgetPassViewController.m in Sources */, @@ -807,6 +824,7 @@ 6E18CEDC1F2E40F50029891F /* User.m in Sources */, 6ECC40711F2A5FEB00AAEB97 /* NSDate+helper.m in Sources */, 6E18CED31F2E39DB0029891F /* LoginViewController.m in Sources */, + 6EA4AF331F40BB7A00F52CFE /* TopObject.m in Sources */, E9D909241F3D6E8C004CF99F /* BaseTableViewController.m in Sources */, 6E84E3761F27A701001EB88E /* main.m in Sources */, E933E6701F3E09B6002926F5 /* SearchGroupTableViewCell.m in Sources */, diff --git a/LifeLog/LifeLog/AppDelegate.m b/LifeLog/LifeLog/AppDelegate.m index 79ccea1..320af23 100644 --- a/LifeLog/LifeLog/AppDelegate.m +++ b/LifeLog/LifeLog/AppDelegate.m @@ -14,6 +14,7 @@ #import "MapViewController.h" #import "SNSViewController.h" #import "ServerAPI.h" +#import "Utilities.h" @interface AppDelegate () @@ -40,10 +41,21 @@ else { [self gotoMainMenu]; } - + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(gotoLogin) name:kNotificationToken object:nil]; return YES; } +- (void)gotoLogin { + [[NSUserDefaults standardUserDefaults] removeObjectForKey:kUser]; + [[NSUserDefaults standardUserDefaults] removeObjectForKey:kToken]; + [[NSUserDefaults standardUserDefaults] synchronize]; + LoginViewController *loginVC = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil]; + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:loginVC]; + self.window.rootViewController = navigation; + [self.window makeKeyAndVisible]; + [Utilities showErrorMessage:@"Token is invalid" withViewController:self.window.rootViewController]; +} - (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. diff --git a/LifeLog/LifeLog/Entities.h b/LifeLog/LifeLog/Entities.h index d639ce2..553f9da 100644 --- a/LifeLog/LifeLog/Entities.h +++ b/LifeLog/LifeLog/Entities.h @@ -16,5 +16,6 @@ #import "HistoryGraphObject.h" #import "HistoryObject.h" #import "User.h" +#import "TopObject.h" #endif /* Entities_h */ diff --git a/LifeLog/LifeLog/HomeViewController.m b/LifeLog/LifeLog/HomeViewController.m index 3e5ae52..b98cfe7 100644 --- a/LifeLog/LifeLog/HomeViewController.m +++ b/LifeLog/LifeLog/HomeViewController.m @@ -120,6 +120,26 @@ static NSInteger numberTotal = 10000; // _timer = [NSTimer scheduledTimerWithTimeInterval:1.5f target:self selector:@selector(countStep) userInfo:nil repeats:YES]; // [_timer fire]; [self countStep]; + + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateFormat:@"yyyy-MM-dd"]; + NSString *dateString = [dateFormatter stringFromDate:_dateCurrent]; + + HomeViewController __weak *weakSelf = self; + [[ServerAPI server] requestTopWithMode:(int)_segmentHome.selectedSegmentIndex andDate:dateString CompletionHandler:^(TopObject *topObject, NSError *error) { + if(weakSelf == nil) { + return ; + } + if (error == nil) { + NSLog(@"TopObject: %@", topObject); + } + else { + dispatch_async(dispatch_get_main_queue(), ^{ + NSString *message = [error.userInfo objectForKey:@"message"]; + [Utilities showErrorMessage:message withViewController:weakSelf]; + }); + } + }]; } - (void)viewWillDisappear:(BOOL)animated { diff --git a/LifeLog/LifeLog/ServerAPI.h b/LifeLog/LifeLog/ServerAPI.h index 90da9d9..adcb0ac 100644 --- a/LifeLog/LifeLog/ServerAPI.h +++ b/LifeLog/LifeLog/ServerAPI.h @@ -12,16 +12,22 @@ extern NSString *const kServerAddress; extern NSString *const kUser; extern NSString *const kToken; +extern NSString *const kNotificationToken; @interface ServerAPI : NSObject + (instancetype) server; @property (nonatomic, assign) NSTimeInterval timeOutInterval; + +#pragma mark - Login and Register - (void)loginWithEmail:(NSString *)email Password:(NSString *)password CompletionHandler: (void (^)(User *, NSString *, NSError *)) completion; - (void)registerUserWithParams:(NSDictionary *)params CompletionHandler: (void (^)(User *, NSString *, NSError *)) completion; - (void)uploadImage:(NSString *)token andImageData:(NSData *)data CompletionHandler:(void (^)(NSString *, NSError *)) completion; - (void)forgetPass:(NSString *)email CompletionHandler:(void (^)(NSError *)) completion; - (void)confirmForgetPass:(NSString *)email withConfirm:(NSString *)confirm CompletionHandler:(void (^)(NSError *)) completion; +#pragma mark - Home Screen Function +- (void)requestTopWithMode:(int)mode andDate:(NSString *)date CompletionHandler:(void (^)(TopObject *, NSError *)) completion; + #pragma mark - History Screen Function - (void) requestHistory:(NSString *)token atDate:(NSDate *)date withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryObject *, NSError *)) completion; - (void) requestHistoryGraph:(NSString *)token withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryGraphObject *, NSError *)) completion; diff --git a/LifeLog/LifeLog/ServerAPI.m b/LifeLog/LifeLog/ServerAPI.m index 3865f44..7c6446e 100644 --- a/LifeLog/LifeLog/ServerAPI.m +++ b/LifeLog/LifeLog/ServerAPI.m @@ -11,6 +11,7 @@ NSString *const kServerAddress = @"http://clover.timesfun.jp:9001/"; NSString *const kUser = @"KEY_USER"; NSString *const kToken = @"KEY_TOKEN"; +NSString *const kNotificationToken = @"TOKEN_INVALID"; @implementation NSString (NSString_Extended) - (NSString *)urlencode { @@ -60,6 +61,7 @@ NSURLSessionDataTask * searchTask; return self; } +#pragma mark - Login and Register // Login - (void)loginWithEmail:(NSString *)email Password:(NSString *)password CompletionHandler: (void (^)(User *, NSString *, NSError *)) completion { @@ -283,6 +285,80 @@ NSURLSessionDataTask * searchTask; } } +#pragma mark - Home Screen Function +- (void)requestTopWithMode:(int)mode andDate:(NSString *)date CompletionHandler:(void (^)(TopObject *, NSError *)) completion +{ + NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; + NSString *url = [kServerAddress stringByAppendingFormat:@"/api/top/%d/%@", mode, date]; + [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) { + + if (completion == NULL) { + return ; + } + + if (error == nil) + { + NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; + int status = [dataResult[@"status"] intValue]; + if (status == 1) { // status = 1 success + if(dataResult[@"result"] != nil) { + NSDictionary * dictResult = dataResult[@"result"]; + TopObject *topObject = [[TopObject alloc] init]; + TargetInfor *targetInfor = [[TargetInfor alloc] initWithData:dictResult[@"targetInf"]]; + topObject.targetInfor = targetInfor; + topObject.kcal = [[NSString stringWithFormat:@"%@", dictResult[@"kcal"]] intValue]; + topObject.distance = [[NSString stringWithFormat:@"%@", dictResult[@"distance"]] floatValue]; + topObject.time = [NSString stringWithFormat:@"%@", dictResult[@"time"]]; + NSMutableArray *arrayStep = [[NSMutableArray alloc] init]; + NSArray *array = dictResult[@"dataChart"]; + for(NSDictionary *dict in array) { + StepObject *object = [[StepObject alloc] init]; + if([dict objectForKey:@"numStep"] != nil) { + object.step = [dict[@"numStep"] intValue]; + } + if([dict objectForKey:@"hour"] != nil) { + object.hour = [dict[@"hour"] intValue]; + } + switch (mode) { + case 1: + object.typeStep = @"walking"; + break; + case 2: + object.typeStep = @"running"; + break; + case 3: + object.typeStep = @"bike"; + break; + default: + break; + } + [arrayStep addObject:object]; + } + topObject.dataChart = [[NSMutableArray alloc] initWithArray:arrayStep]; + completion(topObject, nil); + } + else { + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}]; + completion(nil, errorObject); + } + } + else { + NSString *message = dataResult[@"message"]; + if (message == nil) { + message = @"Unknown error"; + } + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; + completion(nil, errorObject); + [self checkToken:message]; + } + } + else + { + completion(nil, error); + } + }]; +} + #pragma mark - History Screen Function - (void) requestHistory:(NSString *)token atDate:(NSDate *)date withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryObject *, NSError *)) completion { NSString *url = [kServerAddress stringByAppendingFormat:@"/api/history/%@/%d", [self convertIntToString:type], mode]; @@ -309,6 +385,7 @@ NSURLSessionDataTask * searchTask; } NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; completion(nil, errorObject); + [self checkToken:message]; } } else @@ -343,6 +420,7 @@ NSURLSessionDataTask * searchTask; } NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; completion(nil, errorObject); + [self checkToken:message]; } } else @@ -388,6 +466,7 @@ NSURLSessionDataTask * searchTask; } NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; completion(nil, errorObject); + [self checkToken:message]; } } else @@ -434,6 +513,7 @@ NSURLSessionDataTask * searchTask; NSString *message = dataResult[@"message"]; NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; completion(nil, errorObject); + [self checkToken:message]; } } else @@ -490,6 +570,15 @@ NSURLSessionDataTask * searchTask; } #pragma mark - Private Function +- (BOOL) checkToken:(NSString *)message { + if ([message isEqualToString:@"Token is invalid"]) { + [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationToken object:nil]; + return YES; + } + else { + return NO; + } +} - (NSData *) _encodeDictionary: (NSDictionary *) dictionary { NSMutableArray *parts = [[NSMutableArray alloc] init]; diff --git a/LifeLog/LifeLog/StepObject.h b/LifeLog/LifeLog/StepObject.h new file mode 100644 index 0000000..5203e86 --- /dev/null +++ b/LifeLog/LifeLog/StepObject.h @@ -0,0 +1,15 @@ +// +// StepObject.h +// LifeLog +// +// Created by Nguyen Van Phong on 8/11/17. +// Copyright © 2017 PhongNV. All rights reserved. +// + +#import + +@interface StepObject : NSObject +@property (nonatomic) int step; +@property (nonatomic, strong) NSString *typeStep; +@property (nonatomic) int hour; +@end diff --git a/LifeLog/LifeLog/StepObject.m b/LifeLog/LifeLog/StepObject.m new file mode 100644 index 0000000..ec76728 --- /dev/null +++ b/LifeLog/LifeLog/StepObject.m @@ -0,0 +1,13 @@ +// +// StepObject.m +// LifeLog +// +// Created by Nguyen Van Phong on 8/11/17. +// Copyright © 2017 PhongNV. All rights reserved. +// + +#import "StepObject.h" + +@implementation StepObject + +@end diff --git a/LifeLog/LifeLog/TargetInfor.h b/LifeLog/LifeLog/TargetInfor.h new file mode 100644 index 0000000..cfa59cb --- /dev/null +++ b/LifeLog/LifeLog/TargetInfor.h @@ -0,0 +1,17 @@ +// +// TargetInfor.h +// LifeLog +// +// Created by Nguyen Van Phong on 8/13/17. +// Copyright © 2017 PhongNV. All rights reserved. +// + +#import + +@interface TargetInfor : NSObject +@property (nonatomic) int target_step; +@property (nonatomic) int num_step; +@property (nonatomic) int remaining_step; +@property (nonatomic) float complete_percent; +-(id) initWithData : (NSDictionary *) dict; +@end diff --git a/LifeLog/LifeLog/TargetInfor.m b/LifeLog/LifeLog/TargetInfor.m new file mode 100644 index 0000000..ecacdf8 --- /dev/null +++ b/LifeLog/LifeLog/TargetInfor.m @@ -0,0 +1,27 @@ +// +// TargetInfor.m +// LifeLog +// +// Created by Nguyen Van Phong on 8/13/17. +// Copyright © 2017 PhongNV. All rights reserved. +// + +#import "TargetInfor.h" + +@implementation TargetInfor +-(id) initWithData : (NSDictionary *) dict { + if([dict objectForKey:@"target_step"] != nil) { + self.target_step = [dict[@"target_step"] intValue]; + } + if([dict objectForKey:@"num_step"] != nil) { + self.num_step = [dict[@"num_step"] intValue]; + } + if([dict objectForKey:@"remaining_step"] != nil) { + self.remaining_step = [dict[@"remaining_step"] intValue]; + } + if([dict objectForKey:@"complete_percent"] != nil) { + self.complete_percent = [dict[@"complete_percent"] floatValue]; + } + return self; +} +@end diff --git a/LifeLog/LifeLog/TopObject.h b/LifeLog/LifeLog/TopObject.h new file mode 100644 index 0000000..cbc4c05 --- /dev/null +++ b/LifeLog/LifeLog/TopObject.h @@ -0,0 +1,19 @@ +// +// TopObject.h +// LifeLog +// +// Created by Nguyen Van Phong on 8/13/17. +// Copyright © 2017 PhongNV. All rights reserved. +// + +#import +#import "StepObject.h" +#import "TargetInfor.h" + +@interface TopObject : NSObject +@property (nonatomic) int kcal; +@property (nonatomic) float distance; +@property (nonatomic, strong) NSString *time; +@property (nonatomic, strong) TargetInfor *targetInfor; +@property (nonatomic, strong) NSMutableArray *dataChart; +@end diff --git a/LifeLog/LifeLog/TopObject.m b/LifeLog/LifeLog/TopObject.m new file mode 100644 index 0000000..0de1bcd --- /dev/null +++ b/LifeLog/LifeLog/TopObject.m @@ -0,0 +1,13 @@ +// +// TopObject.m +// LifeLog +// +// Created by Nguyen Van Phong on 8/13/17. +// Copyright © 2017 PhongNV. All rights reserved. +// + +#import "TopObject.h" + +@implementation TopObject + +@end -- 1.8.5.3