Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Clean code
  • Loading branch information
vtourraine committed Apr 16, 2015
1 parent 326308e commit e8496d5
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 66 deletions.
107 changes: 55 additions & 52 deletions SZNAltmetric/SZNAltmetricAPIClient.m
Expand Up @@ -40,68 +40,61 @@ - (void)fetchArticleWithPath:(NSString *)path

@implementation SZNAltmetricAPIClient

+ (SZNAltmetricAPIClient *)sharedClient
{
+ (SZNAltmetricAPIClient *)sharedClient {
static SZNAltmetricAPIClient *_sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURL *URL = [NSURL URLWithString:@"http://api.altmetric.com/v1/"];
_sharedClient = [[self alloc] initWithBaseURL:URL];
});

return _sharedClient;
}

- (id)initWithBaseURL:(NSURL *)url
{
- (id)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (!self)
if (!self) {
return nil;

}

[self setDefaultHeader:@"Accept" value:@"application/json"];

return self;
}

- (void)fetchArticleWithAltmetricIdentifier:(NSString *)altmetricIdentifier
success:(SZNAltmetricFetchArticleSuccessBlock)success
failure:(SZNAltmetricFetchArticleFailureBlock)failure
{
failure:(SZNAltmetricFetchArticleFailureBlock)failure {
[self fetchArticleWithPath:@"id" identifier:altmetricIdentifier success:success failure:failure];
}

- (void)fetchArticleWithDOI:(NSString *)DOI
success:(SZNAltmetricFetchArticleSuccessBlock)success
failure:(SZNAltmetricFetchArticleFailureBlock)failure
{
failure:(SZNAltmetricFetchArticleFailureBlock)failure {
[self fetchArticleWithPath:@"doi" identifier:DOI success:success failure:failure];
}

- (void)fetchArticleWithPubMedIdentifier:(NSString *)pubMedIdentifier
success:(SZNAltmetricFetchArticleSuccessBlock)success
failure:(SZNAltmetricFetchArticleFailureBlock)failure
{
failure:(SZNAltmetricFetchArticleFailureBlock)failure {
[self fetchArticleWithPath:@"pmid" identifier:pubMedIdentifier success:success failure:failure];
}

- (void)fetchArticleWithArXivIdentifier:(NSString *)arXivIdentifier
success:(SZNAltmetricFetchArticleSuccessBlock)success
failure:(SZNAltmetricFetchArticleFailureBlock)failure
{
failure:(SZNAltmetricFetchArticleFailureBlock)failure {
[self fetchArticleWithPath:@"arxiv" identifier:arXivIdentifier success:success failure:failure];
}

- (void)fetchArticleWithADSBibcode:(NSString *)ADSBibcode
success:(SZNAltmetricFetchArticleSuccessBlock)success
failure:(SZNAltmetricFetchArticleFailureBlock)failure
{
failure:(SZNAltmetricFetchArticleFailureBlock)failure {
[self fetchArticleWithPath:@"ads" identifier:ADSBibcode success:success failure:failure];
}

- (void)fetchArticlesCitationsWithTimeframe:(NSString *)timeframe
success:(SZNAltmetricFetchPaginatedArticlesSuccessBlock)success
failure:(SZNAltmetricFetchArticleFailureBlock)failure
{
failure:(SZNAltmetricFetchArticleFailureBlock)failure {
[self fetchArticlesCitationsWithTimeframe:timeframe
page:0
numberOfResults:0
Expand All @@ -121,21 +114,32 @@ - (void)fetchArticlesCitationsWithTimeframe:(NSString *)timeframe
NLMIdentifiers:(NSString *)NLMIdentifiers
subjects:(NSString *)subjects
success:(SZNAltmetricFetchPaginatedArticlesSuccessBlock)success
failure:(SZNAltmetricFetchArticleFailureBlock)failure
{
failure:(SZNAltmetricFetchArticleFailureBlock)failure {
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
if (page > 0)
if (page > 0) {
parameters[@"page"] = @(page);
if (numberOfResults > 0)
}

if (numberOfResults > 0) {
parameters[@"num_results"] = @(numberOfResults);
if (citedIn)
}

if (citedIn) {
parameters[@"cited_in"] = citedIn;
if (DOIPrefix)
}

if (DOIPrefix) {
parameters[@"doi_prefix"] = DOIPrefix;
if (NLMIdentifiers)
}

if (NLMIdentifiers) {
parameters[@"nlmid"] = NLMIdentifiers;
if (subjects)
}

if (subjects) {
parameters[@"subject"] = subjects;
}

[self fetchPaginatedArticlesWithPath:[@"citations" stringByAppendingPathComponent:timeframe]
parameters:parameters
success:success
Expand All @@ -145,8 +149,7 @@ - (void)fetchArticlesCitationsWithTimeframe:(NSString *)timeframe
- (void)fetchArticleDetailsWithIdentifierType:(NSString *)identifierType
identifier:(NSString *)identifier
success:(SZNAltmetricFetchArticleSuccessBlock)success
failure:(SZNAltmetricFetchArticleFailureBlock)failure
{
failure:(SZNAltmetricFetchArticleFailureBlock)failure {
[self fetchArticleWithPath:[@"fetch" stringByAppendingPathComponent:identifierType]
identifier:identifier
success:success
Expand All @@ -156,59 +159,59 @@ - (void)fetchArticleDetailsWithIdentifierType:(NSString *)identifierType
- (void)fetchPaginatedArticlesWithPath:(NSString *)path
parameters:(NSDictionary *)parameters
success:(SZNAltmetricFetchPaginatedArticlesSuccessBlock)success
failure:(SZNAltmetricFetchArticleFailureBlock)failure
{
failure:(SZNAltmetricFetchArticleFailureBlock)failure {
NSMutableDictionary *mutableParameters = [NSMutableDictionary dictionaryWithDictionary:parameters];
if (self.APIKey)
if (self.APIKey) {
mutableParameters[@"key"] = self.APIKey;

}

NSURLRequest *request = [self requestWithMethod:@"GET" path:path parameters:mutableParameters];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSDictionary *responseObject) {

NSNumberFormatter *numberFormatter = [NSNumberFormatter new];
numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;
self.dailyRateLimit = [numberFormatter numberFromString:[response allHeaderFields][@"X-DailyRateLimit-Limit"]];
self.dailyRateRemaining = [numberFormatter numberFromString:[response allHeaderFields][@"X-DailyRateLimit-Remaining"]];
self.hourlyRateLimit = [numberFormatter numberFromString:[response allHeaderFields][@"X-HourlyRateLimit-Limit"]];
self.hourlyRateRemaining = [numberFormatter numberFromString:[response allHeaderFields][@"X-HourlyRateLimit-Remaining"]];

if (success)
{
if (responseObject[@"results"] && responseObject[@"query"])
{
self.dailyRateLimit = [numberFormatter numberFromString:response.allHeaderFields[@"X-DailyRateLimit-Limit"]];
self.dailyRateRemaining = [numberFormatter numberFromString:response.allHeaderFields[@"X-DailyRateLimit-Remaining"]];
self.hourlyRateLimit = [numberFormatter numberFromString:response.allHeaderFields[@"X-HourlyRateLimit-Limit"]];
self.hourlyRateRemaining = [numberFormatter numberFromString:response.allHeaderFields[@"X-HourlyRateLimit-Remaining"]];

if (success) {
if (responseObject[@"results"] && responseObject[@"query"]) {
NSNumber *page = responseObject[@"query"][@"page"];
NSNumber *total = responseObject[@"query"][@"total"];

NSMutableArray *results = [NSMutableArray array];
for (NSDictionary *result in responseObject[@"results"]) {
SZNAltmetricArticle *article = [SZNAltmetricArticle articleWithAPIResponseObject:result];
if (article)
if (article) {
[results addObject:article];
}
}
success(results, [total unsignedIntegerValue], [page unsignedIntegerValue]);
success(results, total.unsignedIntegerValue, page.unsignedIntegerValue);
}
else {
SZNAltmetricArticle *article = [SZNAltmetricArticle articleWithAPIResponseObject:responseObject];
success(article ? @[article] : @[], NSNotFound, NSNotFound);
}
}
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
if (failure)
if (failure) {
failure(error);
}
}];
[operation start];
}

- (void)fetchArticleWithPath:(NSString *)path
identifier:(NSString *)identifier
success:(SZNAltmetricFetchArticleSuccessBlock)success
failure:(SZNAltmetricFetchArticleFailureBlock)failure
{
failure:(SZNAltmetricFetchArticleFailureBlock)failure {
[self fetchPaginatedArticlesWithPath:[path stringByAppendingPathComponent:identifier]
parameters:nil
success:^(NSArray *results, NSUInteger total, NSUInteger page) {
if (success)
success([results lastObject]);
if (success) {
success(results.lastObject);
}
}
failure:failure];
}
Expand Down
39 changes: 25 additions & 14 deletions SZNAltmetric/SZNAltmetricArticle.m
Expand Up @@ -33,14 +33,14 @@ + (NSDate *)dateFromResponseObject:(id)responseObject;

@implementation SZNAltmetricArticle

+ (SZNAltmetricArticle *)articleWithAPIResponseObject:(id)responseObject
{
if (![responseObject isKindOfClass:[NSDictionary class]])
+ (SZNAltmetricArticle *)articleWithAPIResponseObject:(id)responseObject {
if (![responseObject isKindOfClass:[NSDictionary class]]) {
return nil;

}

SZNAltmetricArticle *article = [SZNAltmetricArticle new];
article.content = responseObject;

NSDictionary *citationDictionary = responseObject[@"citation"] ?: responseObject;
article.addedOn = [self dateFromResponseObject:responseObject[@"added_on"]];
article.identifier = [NSString stringWithFormat:@"%@", responseObject[@"altmetric_id"]];
Expand All @@ -59,10 +59,15 @@ + (SZNAltmetricArticle *)articleWithAPIResponseObject:(id)responseObject
article.lastUpdated = [self dateFromResponseObject:responseObject[@"last_updated"]];
article.NLMIdentifier = citationDictionary[@"nlmid"];
article.pubMedIdentifier = citationDictionary[@"pmid"];
if (responseObject[@"published_on"])

if (responseObject[@"published_on"]) {
article.publishedOn = [self dateFromResponseObject:responseObject[@"published_on"]];
if (citationDictionary[@"pubdate"])
}

if (citationDictionary[@"pubdate"]) {
article.publishedOn = [self dateFromResponseObject:citationDictionary[@"pubdate"]];
}

article.schema = responseObject[@"schema"];
article.score = responseObject[@"score"];
article.subjects = responseObject[@"subjects"];
Expand All @@ -79,22 +84,28 @@ + (SZNAltmetricArticle *)articleWithAPIResponseObject:(id)responseObject
article.readersCount = responseObject[@"readers_count"];
article.readers = responseObject[@"readers"];
article.articleURL = [NSURL URLWithString:responseObject[@"url"]];

if ([citationDictionary[@"links"] isKindOfClass:[NSArray class]] &&
[citationDictionary[@"links"] count] > 0)
[citationDictionary[@"links"] count] > 0) {
article.detailsURL = [NSURL URLWithString:citationDictionary[@"links"][0]];
else
}
else {
article.detailsURL = [NSURL URLWithString:responseObject[@"details_url"]];
}

return article;
}

+ (NSDate *)dateFromResponseObject:(id)responseObject
{
if ([responseObject isKindOfClass:[NSNumber class]])
+ (NSDate *)dateFromResponseObject:(id)responseObject {
if ([responseObject isKindOfClass:[NSNumber class]]) {
return [NSDate dateWithTimeIntervalSince1970:[responseObject doubleValue]];
else if ([responseObject isKindOfClass:[NSString class]])
}
else if ([responseObject isKindOfClass:[NSString class]]) {
return [[ISO8601DateFormatter new] dateFromString:responseObject];
else
}
else {
return nil;
}
}

@end

0 comments on commit e8496d5

Please sign in to comment.