Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


Info

Developers please use

Newwindowlink
titlehttps://api-stage.bimplus.net/v2
urlhttps://api-stage.bimplus.net/v2
(stage version of Bimplus API) and
Newwindowlink
titlehttp://portal-stage.bimplus.net/
urlhttp://portal-stage.bimplus.net/
(stage version of Shop/Portal) for testing purposes. The production version of the portal is located under 
Newwindowlink
titlehttps://portal.bimplus.net/
urlhttps://portal.bimplus.net/
  and the base url of the API is different for the production version.


Composition Setup

Postman examples

  1. Please install Postman and import attached postman collections
    BimPlus.postman_collection.json

    postman_globals.json
    Production.postman_environment.json
    Stage.postman_environment.json

    if you don't know how it works show this video
    View file
    namePostmanCollection.mp4
    height150




  2. Set Postman authenication direct to OIDC server, avoiding authentication request on start.
    Postman supports OpenID authentication and can receive tokens directly from OIDC server.
    Open request group (or even down to single request), select Authorization page, set authorisation type 'OAuth 2.0' and configure OIDC BIm+ server.


    Image Added
    Then create Configure new token. Take server names from answer on discovery URL.
    Preferrably use variables to specify different servers for different environments. 

    Image Added
    Click "Get New Access Token". Token should be loaded in token field.
    Set "Auto-refresh Token" above to ON.
  3. Example for Ifc Import, creation of new revisions and final revision compare
    View file
    nameIfcImportWithRevisions.mp4
    height150


  4. Example for creating Modeldata 
    by using Geometry templates controller, objects controller and geometry types
     install additional postman collection 

    View file
    nameCreate Modeldata.postman_collection.json
    height150

    Some mp4, which shows usage of geometry templates, csg and mesh data
    View file
    nameCreateMeshdata.mp4
    height150

    View file
    nameCreate Geometry with BimPlus Api.mp4
    height150

    View file
    nameCreate Rooms.mp4
    height150


  5. Example for Attribute management and PSet definitions
    View file
    nameMCS Propertysets.mp4
    height150


    View file
    nameAttributes.postman_collection.json
    height250

    View file
    nameMGE_AttributeTemplateDefinitions.mp4
    height250
  6. Example for creating Alignments with REST API
    View file
    nameAlignments.mp4
    height150

    View file
    nameAlignments.postman_collection.json
    height150
  7. Example for creating StructuralAnalysis Modeldata with REST API
    you can find the same example as .NET Implementation using BIF assemblies under 
    https://github.com/Bimplus/bimplus-dotnet-demo
    View file
    nameStructuralAnalysisModel.postman_collection.json
    height150

    View file
    nameStructuralAnalysis.mp4
    height150
    View file
    nameAssembliesWithLinkToMembers.mp4
    height150
    y

C# demo projects

BimPlusCube.zip --> It explains how to create project data (nodes, geometry etc)

BimPlusDemo.zip --> It explains how to create project data (nodes, geometry etc)It explains how to authenticate, get your teams, get your project, how to create a project, how to get the project_id of your created project, create a model under the same project and upload an ifc file.


PHP Rest Client

BimplusRestClient.php (PHP REST client)

Code Block
languagephp
// Example 1: Hello function (no accessToken needed)
// ---------------------------------------------------------------------
$url = 'https://api-stage.bimplus.net/v2/hello';
$verb = 'GET';

// Create object
$request = new BimplusRestClient(
    $url,
    $verb
);

// Execute
$request->execute();
$response = $request->getResponse();

echo '<pre>';
print_r(json_decode($response));
echo '</pre>';




// Example 2: Get user data
// ---------------------------------------------------------------------
$userId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'; // Bimplus userID
$url = 'https://api-stage.bimplus.net/v2/users/' . $userId;
$verb = 'GET';
$accessToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'; // accessToken

// Create object
$request = new BimplusRestClient(
    $url,
    $verb,
    $accessToken
);

// Execute
$request->execute();
$response = $request->getResponse();

echo '<pre>';
print_r(json_decode($response));
echo '</pre>';



// Example 3: Update user data
// ---------------------------------------------------------------------
$userId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'; // Bimplus userID
$url = 'https://api-stage.bimplus.net/v2/users/' . $userId;
$verb = 'PUT';
$accessToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'; // accessToken
$requestBody = array(
    'email' => 'new.email@allplan.com'
);

// Create object
$request = new BimplusRestClient(
    $url,
    $verb,
    $accessToken,
    $requestBody
);

// Execute
$request->execute();
$response = $request->getResponse();

echo '<pre>';
print_r(json_decode($response));
echo '</pre>';


A Simple Javascript example

Code Block
languagejs
jQuery(document).ready(function() {
	jQuery("#datagrid").jqGrid({
		datatype : 'json',
		type : "GET",
		ajaxGridOptions : {
			contentType : "application/json"
		},
		loadBeforeSend : function(xhr) {
			xhr.setRequestHeader('Authorization', 'BimPlus 199c55110e2044b88e21a0c1cbb02fe3')
		},
		url : 'http://api-dev.bimplus.net/v2/teams',
		colNames : ['ID', 'Name', 'Slug', 'Status'],
		colModel : [{
			name : 'id',
			width : 200,
			align : "center",
			sortable : true
		}, {
			name : 'name',
			width : 200,
			align : "center",
			sortable : true
		}, {
			name : 'slug',
			width : 200,
			align : "center",
			sortable : true
		}, {
			name : 'status',
			width : 200,
			align : "center",
			sortable : true
		}],
		jsonReader : {
			repeatitems : false,
			root : function(obj) {
				return obj;
			},
			page : function(obj) {
				return 1;
			},
			total : function(obj) {
				return 1;
			},
			records : function(obj) {
				return obj.length;
			}
		},
		rowNum : 10,
		rowList : [10, 20, 30],
		pager : '#pager10',
		viewrecords : true,
		caption : "Bimplus Team Details",
	}).navGrid('#navGrid');
})
window.setTimeout(refreshGrid, 5000);
function refreshGrid() {
	var grid = jQuery("#datagrid");
	grid.trigger("reloadGrid");
	window.setTimeout(refreshGrid, 5000);
}


ObjectiveC (iPad) Examples

Authentication
Find out how many teams I am part of
Get team project list
Get project details
Get project topology
Get project disciplines
Upload project thumbnail
Create an issue in the project
Get the issue list from the project
Delete all the issues from the project
Create a new pin for the issue
Get all the pins of the issue
Create/Upload a new attachment for the issue
Get the attachment list from the issue

Anchor
authenticationCode
authenticationCode

Authentication

Deck of Cards
idauthenticationCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];

    // building the json object
    if (([emailString length] != 0) && ([passwordString length] != 0))
    {

        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        NSString *requestURLString = [NSString stringWithFormat:@"%@authorize",[CSS getDefaultAPIURL]];
        [request setURL:[NSURL URLWithString:requestURLString]];
        [request setHTTPMethod:@"POST"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

        NSString *requestBodyString = [NSString stringWithFormat:@"{\"user_id\": \"%@\", \"password\": \"%@\", \"client_id\": \"%@\"}",emailString,passwordString,[[NSUserDefaults standardUserDefaults] objectForKey:@"ClientIdentificationForAuthorizationPurposes"]];
        [request setHTTPBody:[requestBodyString dataUsingEncoding:NSUTF8StringEncoding]];
        [request setTimeoutInterval:60];

        __block BOOL loginFailed = NO;

        __block BOOL invalidUser = NO;

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){

            //build an info object and convert to json
            NSError *requestError;
            NSHTTPURLResponse *responseHTTP;

            NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&responseHTTP error:&requestError];

            if ([responseHTTP statusCode] == 200)
            {
                NSDictionary *tempdict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableContainers error:&requestError];
                [CSS setUpAuthenticationForType:[tempdict valueForKey:@"token_type"] withID:[tempdict valueForKey:@"access_token"]];

                // authorization was successfull

            } else {

                loginFailed = YES;

                if (requestError.code == -1012) {

                    // Failed because it's an invalid user

                    invalidUser = YES;

                } else {

                    // check if project list stored on device.
                    // if yes, start offline mode
                }
            }
        });

    }




Anchor
howManyTeamsCode
howManyTeamsCode

Find out how many teams I am part of

Deck of Cards
idhowManyTeamsCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];

    //build an info object and convert to json
    NSError *requestError;
    NSHTTPURLResponse *responseHTTP;

    NSMutableURLRequest *requestForSlug = [[NSMutableURLRequest alloc] init];

    NSString *teamRequestString = [NSString stringWithFormat:@"%@teams",[CSS getDefaultAPIURL]];
    [requestForSlug setURL:[NSURL URLWithString:teamRequestString]];
    [requestForSlug setHTTPMethod:@"GET"];
    [requestForSlug setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [requestForSlug setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];

    NSData *responseForSlug = [NSURLConnection sendSynchronousRequest:requestForSlug returningResponse:&responseHTTP error:&requestError];
    [requestForSlug release];

    if ([responseHTTP statusCode] == 200) {
        // Success. Team names array.
        NSArray *tempdictForSlug = [NSJSONSerialization JSONObjectWithData:responseForSlug options:NSJSONReadingMutableContainers error:&requestError];
        NSLog(@"How many teams I am part of: %d", [tempdictForSlug count]);
    }else{
        // Login Failed.
    }




Anchor
teamProjectListCode
teamProjectListCode

Get team project list

Deck of Cards
idteamProjectList


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];

    //build an info object and convert to json
    NSError *requestError;
    NSHTTPURLResponse *responseHTTP;

    //get projectList
    NSMutableURLRequest *requestForProjectList = [[NSMutableURLRequest alloc] init];

    NSString *projectListRequestString = [NSString stringWithFormat:@"%@%@/projects",[CSS getDefaultAPIURL],[CSS getSlug]];
    [requestForProjectList setURL:[NSURL URLWithString:projectListRequestString]];
    [requestForProjectList setHTTPMethod:@"GET"];
    [requestForProjectList setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [requestForProjectList setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];

    NSData *responseForProjectList = [NSURLConnection sendSynchronousRequest:requestForProjectList returningResponse:&responseHTTP error:&requestError];

    [requestForProjectList release];

    if (responseForProjectList == NULL) {

            // Login Failed
    }
    else {

        NSError *error;
        NSArray *projectList = [NSJSONSerialization JSONObjectWithData:responseForProjectList options:NSJSONReadingMutableContainers error:&error];

        BOOL success = [[ProjectManager sharedProjectManager] loadProjectsFromData:projectList];

        if (!success){

            // Failed to Load Projects List

        }
    }




Anchor
getProjectDetailsCode
getProjectDetailsCode

Get project details

Deck of Cards
idgetProjectDetailsCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
//build an info object and convert to json
        NSError *requestError;
        NSHTTPURLResponse *responseHTTP;
        NSError *dictError;

        //Get project details

        NSMutableURLRequest *requestForProjectDetails;
        requestForProjectDetails = [[NSMutableURLRequest alloc] init];

        [requestForProjectDetails setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@/projects/%@",[CSS getDefaultAPIURL],[CSS getSlug],proj.mID]]];
        [requestForProjectDetails setHTTPMethod:@"GET"];
        [requestForProjectDetails setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [requestForProjectDetails setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];

        NSData *responseForProjectDetails = [NSURLConnection sendSynchronousRequest:requestForProjectDetails returningResponse:&responseHTTP error:&requestError];
        [requestForProjectDetails release];

        if (responseHTTP.statusCode == 200) {

            // Success, we have a project detail dictionary
            NSDictionary *projectDetails = [NSJSONSerialization JSONObjectWithData:responseForProjectDetails options:NULL error:&dictError];

            // Time to process this project details as you want/need
            [proj processProjectDetails:projectDetails];

        }else{
            // Download Failed
            return;
        }




Anchor
getProjectTopology
getProjectTopology

Get project topology

Deck of Cards
idgetProjectTopology


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
//build an info object and convert to json
        NSError *requestError;
        NSHTTPURLResponse *responseHTTP;

        NSString* requestString = [[NSString alloc] initWithFormat:@"%@%@/projects/%@/topology",[CSS getDefaultAPIURL],[CSS getSlug], mProjectID];

        NSMutableURLRequest *requestForProjectsTree = [[NSMutableURLRequest alloc] init];
        [requestForProjectsTree setURL:[NSURL URLWithString:requestString]];
        [requestString release];

        [requestForProjectsTree setHTTPMethod:@"GET"];
        [requestForProjectsTree setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [requestForProjectsTree setValue:[[CommunicationSingleton sharedSingleton] getAuthorization] forHTTPHeaderField:@"Authorization"];

        NSData *response = [NSURLConnection sendSynchronousRequest:requestForProjectsTree returningResponse:&responseHTTP error:&requestError];
        [requestForProjectsTree release];

        NSString *path = [[proj getProjectFolderPath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.topology", mProjectID]];

        if ([responseHTTP statusCode] == 200)
        {
            // Save project topology locally.
            [response writeToFile:path atomically:NO];

            // Load project topology to memory.
            [proj loadTopologyFromData:response];

        } else {

            // If Failed

            // Check if we have the last used topology for this project is available offline (rembember that this is could not be the last version)
            if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
                // Loading project topology offline

                NSData* data = [NSData dataWithContentsOfFile:path];
                [proj loadTopologyFromData:data];

            } else {
                // Download Failed + Local Storage not available
            }

        }




Anchor
getProjectDisciplines
getProjectDisciplines

Get project disciplines

Deck of Cards
idgetProjectDisciplines


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
    Project* proj = [[ProjectManager sharedProjectManager] getProjectbyID:mProjectID];

    maxNodes = [[proj getAllNodesWithoutParents] count];

    // Don't download nodes data if we want to download them dynamically
    // we are still going to need the parents
    if ( ![[[NSUserDefaults standardUserDefaults] valueForKey:kDownloadNodesDynamically] boolValue] ) {

        dispatch_async(dispatch_get_main_queue(), ^(void){

            mDownloadManager = [[DownloadManager alloc] init];
            mDownloadManager.delegate = self;

            //get disciplines
            NSArray *disciplineIds = proj.projectsDisciplineIDs;
            for (int i = 0; i < [disciplineIds count]; i++) {
                [mDownloadManager downloadFiles:[proj getAllNodesWithoutParents] forProject:mProjectID forDiscipline:[disciplineIds objectAtIndex:i]];
            }

            if ([disciplineIds count] < 1) {
                [mDownloadManager downloadFiles:[proj getAllNodesWithoutParents] forProject:mProjectID forDiscipline:NULL];
            }

        });
    }

In "downloadFiles" method there are some logic and data storage operations and for each of the discipline you can call this snippet:


	NodeHeaderDatas *nodeDatas = [mFilesToProcess objectAtIndex:0];
	NSString *nodeidForAPICall = nodeDatas.nodeID;

	CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];
	NSMutableURLRequest *requestForNodeData = [[NSMutableURLRequest alloc] init];
	NSString *nodesURL;
        if (nodeDatas.disciplineForDownloading != NULL) {
            nodesURL = [NSString stringWithFormat:
                        @"%@%@/objects/%@/disciplines/%@/geometries/threejs",
                        [CSS getDefaultAPIURL],
                        [CSS getSlug],
                        nodeidForAPICall,
                        nodeDatas.disciplineForDownloading
Note

This web page is under construction.

...

Authentication
Find out how many teams I am part of
Get team project list
Get project details
Get project topology
Get project disciplines
Upload project thumbnail
Create an issue in the project
Get the issue list from the project
Delete all the issues from the project
Create a new pin for the issue
Get all the pins of the issue
Create/Upload a new attachment for the issue
Get the attachment list from the issue

...

Authentication

Deck of Cards
idauthenticationCode
Card
labelObjectiveC
Code Block
borderColorGreen
langjava
titleJSON

CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];

    // building the json object
    if (([emailString length] != 0) && ([passwordString length] != 0))
    {

        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        NSString *requestURLString = [NSString stringWithFormat:@"%@authorize",[CSS getDefaultAPIURL]];
}else{
            nodesURL [request= setURL:[NSURLNSString URLWithStringstringWithFormat:requestURLString]];
          [request setHTTPMethod:@"POST"];
             [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

 %@%@/objects/%@/geometries/threejs",
       NSString *requestBodyString = [NSString stringWithFormat:@"{\"user_id\": \"%@\", \"password\": \"%@\", \"client_id\": \"%@\"}",emailString,passwordString,[[NSUserDefaults standardUserDefaults] objectForKey:@"ClientIdentificationForAuthorizationPurposes"]];
        [request setHTTPBody:[requestBodyStringCSS dataUsingEncoding:NSUTF8StringEncoding]];
getDefaultAPIURL],
               [request setTimeoutInterval:60];

         [CSS getSlug],
        __block BOOL loginFailed = NO;

        __block BOOL invalidUser = NOnodeidForAPICall];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){

    }
        [requestForNodeData setURL:[NSURL URLWithString:nodesURL]];
  //build an info object and convert to json
  [requestForNodeData setHTTPMethod:@"GET"];
        [requestForNodeData setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [requestForNodeData  NSError *requestError;setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];

            NSHTTPURLResponse *responseHTTP;

if(requestForNodeData){
            NSData *responsemConnection = [[NSURLConnection alloc] sendSynchronousRequestinitWithRequest:requestrequestForNodeData returningResponsedelegate:&responseHTTPself errorstartImmediately:&requestErrorYES];

        }
if (!mConnection)
    if ([responseHTTP statusCode] == 200){
            {
// Connection Failed
        }
      NSDictionary *tempdict =else
 [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableContainers error:&requestError];
    {
            [CSSmConnection setUpAuthenticationForTypescheduleInRunLoop:[tempdict valueForKey:@"token_type"NSRunLoop currentRunLoop] withID:[tempdict valueForKey:@"access_token"]forMode:NSRunLoopCommonModes];

            [mConnection start];
   // authorization was successfull

     }
       } else {

                loginFailed = YES;

                if (requestError.code == -1012) {

                    // Failed because it's an invalid user

                    invalidUser = YES[requestForNodeData release];




Anchor
uploadThumbnailCode
uploadThumbnailCode

Upload project thumbnail

Deck of Cards
iduploadThumbnailCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];
NSString *urlString = [[CSS getDefaultAPIURL] stringByAppendingFormat:@"%@/projects/%@/thumbnail",[CSS getSlug],currentProject.mID];
MultIPartFormCommunication *MPC = [MultIPartFormCommunication sharedSingleton];
if (![MPC uploadImage:imagePlaceholder.image withExtension:@"jpeg" withFileName:@"thumbnail" ToURLString:urlString]){
[[ProjectManager sharedProjectManager] addUnUploadedThumbnailsProjectIdToList:currentProject.mID];
}

See the bottom of the page to see the uploadImage method



Anchor
createIssueProjectCode
createIssueProjectCode

Create an issue in the project

Deck of Cards
idcreateIssueProjectCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];
//get its dictionary:
    NSMutableDictionary *currentIssueData = [self getIssueInformationForIssueId:ISSUE_ID];

    //create nsdata           } else {

 for uploading:
    NSError *error;
    NSData *dataForCurrentIssue = [NSJSONSerialization dataWithJSONObject:currentIssueData options:NSJSONWritingPrettyPrinted error:&error];

    //create checkissue ifrequest:
 project list stored on device.NSMutableURLRequest *uploadRequestForCurrentIssue;
    uploadRequestForCurrentIssue = [[NSMutableURLRequest alloc] init];

    NSString *urlStringForIssue =      // if yes, start offline mode
        [NSString stringWithFormat:@"%@%@/projects/%@/issues",
        }
            }
        });

    }

Card
labelC#

...

Find out how many teams I am part of

Deck of Cards
idhowManyTeamsCode
Card
labelObjectiveC
Code Block
borderColorGreen
langjava
titleJSON

CommunicationSingleton *CSS = [CommunicationSingletonCSS sharedSingletongetDefaultAPIURL];

    //build an info object and convert to json
,
      NSError *requestError;
    NSHTTPURLResponse *responseHTTP;

    NSMutableURLRequest *requestForSlug = [[NSMutableURLRequest alloc] init];

    NSString *teamRequestString = [NSString stringWithFormat:@"%@teams",[CSS getDefaultAPIURL]];
    [requestForSlug setURL:[NSURLCSS URLWithString:teamRequestString]];
getSlug],
      [requestForSlug setHTTPMethod:@"GET"];
    [requestForSlug setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [requestForSlug setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];

    NSData *responseForSlug = [NSURLConnection sendSynchronousRequest:requestForSlug returningResponse:&responseHTTP error:&requestError];
    [requestForSlug releaseself.mID];

    if[uploadRequestForCurrentIssue (setURL:[responseHTTP statusCode] == 200) {NSURL URLWithString:urlStringForIssue]];
        // Success. Team names array.
        NSArray *tempdictForSlug = [NSJSONSerialization JSONObjectWithData:responseForSlug options:NSJSONReadingMutableContainers error:&requestError[uploadRequestForCurrentIssue setHTTPMethod:@"POST"];
    [uploadRequestForCurrentIssue setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [uploadRequestForCurrentIssue setValue:[CSS   NSLog(@"How many teams I am part of: %d", [tempdictForSlug count]);
    }else{
        // Login Failed.
    }
Card
labelC#

...

Get team project list

Deck of Cards
idteamProjectList
Card
labelObjectiveC
Code Block
borderColorGreen
langjava
titleJSON

CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];

    //build an info object and convert to json
    NSError *requestError;
    NSHTTPURLResponse *responseHTTP;

getAuthorization] forHTTPHeaderField:@"Authorization"];
    [uploadRequestForCurrentIssue setHTTPBody:dataForCurrentIssue];

    NSHTTPURLResponse *responseHTTPForCurrentIssue;

    NSData *responseForCurrentIssue = [NSURLConnection sendSynchronousRequest:uploadRequestForCurrentIssue returningResponse:&responseHTTPForCurrentIssue error:&error];
    [uploadRequestForCurrentIssue release];

    if ([responseHTTPForCurrentIssue statusCode] == 201) {
        // Success, issue uploaded
    }else{
        //get projectList
Error, upload failed
  NSMutableURLRequest *requestForProjectList = [[NSMutableURLRequest alloc] init];

    NSString * }




Anchor
getIssueListCode
getIssueListCode

Get the issue list from the project

Deck of Cards
idgetIssueListCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
CommunicationSingleton *CSSprojectListRequestString = [NSString stringWithFormat:@"%@%@/projects",[CSS getDefaultAPIURL],[CSS getSlug]]CommunicationSingleton sharedSingleton];
    [requestForProjectList setURL:[NSURL URLWithString:projectListRequestString]];//create issue request:
    [requestForProjectList setHTTPMethod:@"GET"];
    [requestForProjectList setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [requestForProjectList setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"NSMutableURLRequest *issueListRequest;
    issueListRequest = [[NSMutableURLRequest alloc] init];

    NSDataNSString *responseForProjectListurlStringForIssue = [NSURLConnectionNSString sendSynchronousRequest:requestForProjectList returningResponse:&responseHTTP error:&requestError];

stringWithFormat:@"%@%@/projects/%@/issues",
                   [requestForProjectList release];

    if (responseForProjectList == NULL) {

       [CSS getDefaultAPIURL],
    // Login Failed
    }
    else {

        NSError *error;
        NSArray *projectList = [NSJSONSerialization JSONObjectWithData:responseForProjectList options:NSJSONReadingMutableContainers error:&error];
CSS getSlug],
        BOOL success = [[ProjectManager sharedProjectManager] loadProjectsFromData:projectList];

        if (!success){

            // Failed to Load Projects List
 self.mID];
    DLog(@"%@",urlStringForIssue);
    [issueListRequest setURL:[NSURL URLWithString:urlStringForIssue]];
   }
    }
Card
labelC#

...

Get project details

Deck of Cards
idgetProjectDetailsCode
Card
labelObjectiveC
Code Block
borderColorGreen
langjava
titleJSON

//build an info object and convert to json[issueListRequest setHTTPMethod:@"GET"];
    [issueListRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [issueListRequest setValue:[CSS   NSError *requestError;
    getAuthorization] forHTTPHeaderField:@"Authorization"];

    NSHTTPURLResponse *responseHTTPresponseHTTPForIssueList;
        NSError *dictErrorerror;

    NSData *rawIssueList =  //Get project details

        NSMutableURLRequest *requestForProjectDetails;
    [NSURLConnection sendSynchronousRequest:issueListRequest returningResponse:&responseHTTPForIssueList error:&error];
    requestForProjectDetails = [[NSMutableURLRequest alloc] init][issueListRequest release];

    if ([responseHTTPForIssueList statusCode] == 200) [requestForProjectDetails setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@/projects/%@",[CSS getDefaultAPIURL],[CSS getSlug],proj.mID]]];
{
        NSMutableArray *issueList = [NSJSONSerialization  [requestForProjectDetails setHTTPMethod:@"GET"JSONObjectWithData:rawIssueList options:NSJSONReadingMutableContainers error:&error];
        [requestForProjectDetails setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
  return  issueList;
    }else{
      [requestForProjectDetails setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"] return NULL;

    }




Anchor
deleteIssueListCode
deleteIssueListCode

Delete all the issues from the project

Deck of Cards
iddeleteIssueListCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
//delete it form the NSDataserver
	CommunicationSingleton *responseForProjectDetailsCSS = [NSURLConnection sendSynchronousRequest:requestForProjectDetails returningResponse:&responseHTTP error:&requestErrorCommunicationSingleton sharedSingleton];
	//create issue request:
	NSMutableURLRequest *deleteRequest = [[NSMutableURLRequest   [requestForProjectDetails releasealloc] init];

	NSString *urlStringForIssue = [NSString stringWithFormat:@"%@%@/issues/%@",
     if (responseHTTP.statusCode == 200) {

            // Success, we have a project detail dictionary
            NSDictionary *projectDetails = [NSJSONSerialization JSONObjectWithData:responseForProjectDetails options:NULL error:&dictError];
CSS getDefaultAPIURL],
            // Time to process this project details as you want/need
            [proj processProjectDetails:projectDetails];

        }else{
  [CSS getSlug],
         // Download Failed
            return;
        }
Card
labelC#

...

            issueid];

	[deleteRequest setURL:[NSURL URLWithString:urlStringForIssue]];
	[deleteRequest setHTTPMethod:@"DELETE"];
	[deleteRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
	[deleteRequest setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];

	NSHTTPURLResponse *responseHTTPForDeletion;
	[NSURLConnection sendSynchronousRequest:deleteRequest returningResponse:&responseHTTPForDeletion error:&error];
	[deleteRequest release];

	if ([responseHTTPForDeletion statusCode] == 200) {

		//successful deletion
		return 0;

	} else {

	//add it to a deletion list
	[self addIssueToUnDeletedIssueList:issueid];

	return 1;

	}




Anchor
createNewPinCode
createNewPinCode

Create a new pin for the issue

Deck of Cards
idcreateNewPinCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];

	NSMutableDictionary *pinData = [self getPinDataForPinId:PIN_ID inIssue:ISSUE_ID];

	//remove the id and the objectsparent id since they are unrequired data for the server:
	NSString *oldObjectsParentID = [pinData objectForKey:@"objectsParentId"];
	[pinData removeObjectForKey:@"objectsParentId"];
	NSString *oldPinId = [pinData objectForKey:@"id"];
	[pinData removeObjectForKey:@"id"];

	//set the new issue id:
	[pinData setObject:newCurrentIssueId forKey:@"issueId"];

	//create nsdata for uploading:
	NSData *dataForCurrentPin = [NSJSONSerialization dataWithJSONObject:pinData options:NSJSONWritingPrettyPrinted error:&error];

	//create pin request:
	NSMutableURLRequest *uploadRequestForCurrentPin;
	uploadRequestForCurrentPin = [[NSMutableURLRequest alloc] init];

	NSString *urlStringForPin = [NSString stringWithFormat:@"%@%@/issues/%@/pins",

...

Get project topology

Deck of Cards
idgetProjectTopology
Card
labelObjectiveC
Code Block
borderColorGreen
langjava
titleJSON

//build an info object and convert to json
        NSError *requestError;
        NSHTTPURLResponse *responseHTTP;

        NSString* requestString = [[NSString alloc] initWithFormat:@"%@%@/projects/%@/topology",[CSS getDefaultAPIURL],[CSS getSlug], mProjectID];

        NSMutableURLRequest *requestForProjectsTree = [[NSMutableURLRequest alloc] init];
        [requestForProjectsTree setURL:[NSURL URLWithString:requestString]];
        [requestString release];

        [requestForProjectsTree setHTTPMethod:@"GET"];
        [requestForProjectsTree setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [requestForProjectsTree setValue:[[CommunicationSingleton sharedSingleton] getAuthorization] forHTTPHeaderField:@"Authorization"];

        NSData *response = [NSURLConnection sendSynchronousRequest:requestForProjectsTree returningResponse:&responseHTTP error:&requestError];
        [requestForProjectsTree release];

        NSString *path = [[proj getProjectFolderPath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.topology", mProjectID]];

        if ([responseHTTP statusCode] == 200)
        {
            // Save project topology locally.
            [response writeToFile:path atomically:NO];

CSS getDefaultAPIURL],
                  // Load project topology to memory.
            [projCSS loadTopologyFromData:responsegetSlug];

,
               } else {

            // If Failed

    self.newCurrentIssueID];

	[uploadRequestForCurrentPin setURL:[NSURL URLWithString:urlStringForPin]];
	[uploadRequestForCurrentPin      // Check if we have the last used topology for this project is available offline (rembember that this is could not be the last version)
            if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
                // Loading project topology offline

                NSData* data = [NSData dataWithContentsOfFile:path];
                [proj loadTopologyFromData:data];
setHTTPMethod:@"POST"];
	[uploadRequestForCurrentPin setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
	[uploadRequestForCurrentPin setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];
	[uploadRequestForCurrentPin setHTTPBody:dataForCurrentPin];
NSHTTPURLResponse *responseHTTPForCurrentPin;

	NSData *responseForCurrentPin = [NSURLConnection sendSynchronousRequest:uploadRequestForCurrentPin returningResponse:&responseHTTPForCurrentPin error:&error];
	[uploadRequestForCurrentPin release];

	if ([responseHTTPForCurrentPin statusCode] == 201) {
		// success
	} else {
		// Upload Failed
	}




Anchor
getPinListCode
getPinListCode

Get all the pins of the issue

Deck of Cards
idgetPinListCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];
    //create issue request:
    NSMutableURLRequest *pinListRequest;
    pinListRequest = [[NSMutableURLRequest alloc] init];

    NSString *urlStringForIssue = [NSString stringWithFormat:@"%@%@/issues/%@/pins",
            } else {
                // Download Failed + Local Storage not available
    [CSS getDefaultAPIURL],
        }

        }
Card
labelC#

...

Get project disciplines

Deck of Cards
idgetProjectDisciplines
Card
labelObjectiveC
Code Block
borderColorGreen
langjava
titleJSON

        Project* proj = [[ProjectManager sharedProjectManager] getProjectbyID:mProjectID];

    maxNodes = [[projCSS getAllNodesWithoutParentsgetSlug],
 count];

    // Don't download nodes data if we want to download them dynamically
    // we are still going to need the parents
    if ( ![[[NSUserDefaults standardUserDefaultsissueid] valueForKey:kDownloadNodesDynamically] boolValue] ) {
;
    DLog(@"%@",urlStringForIssue);
    [pinListRequest setURL:[NSURL   dispatch_async(dispatch_get_main_queue(), ^(void){

  URLWithString:urlStringForIssue]];
    [pinListRequest setHTTPMethod:@"GET"];
    [pinListRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    mDownloadManager = [[DownloadManager alloc] init];
   [pinListRequest setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];

    NSHTTPURLResponse *responseHTTPForPinList;
    mDownloadManager.delegate = selfNSError *error;

    NSData *rawPinList = [NSURLConnection sendSynchronousRequest:pinListRequest returningResponse:&responseHTTPForPinList error:&error];
  //get disciplines
 [pinListRequest release];

    if ([responseHTTPForPinList statusCode] == 200) {
 NSArray *disciplineIds = proj.projectsDisciplineIDs;
    NSMutableArray *pinList = [NSJSONSerialization JSONObjectWithData:rawPinList options:NSJSONReadingMutableContainers error:&error];
  for (int i = 0; i <return [disciplineIds count]pinList; i++) 
    }else{
        return NULL;
    }




Anchor
createAttachmentForIssueCode
createAttachmentForIssueCode

Create/Upload a new attachment for the issue

Deck of Cards
idcreateAttachmentForIssueCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
NSString *attachmentURL = [mDownloadManager downloadFiles:[projCSS getAllNodesWithoutParentsgetDefaultAPIURL] forProject:mProjectID forDiscipline:[disciplineIds objectAtIndex:i]stringByAppendingFormat:@"%@/issues/%@/attachments", [CSS getSlug],currentIssueId];
	MultIPartFormCommunication *MPC = [MultIPartFormCommunication sharedSingleton];
	NSString *imageName = [NSString stringWithFormat:@"issueImage%f",[[NSDate    }

            date] timeIntervalSince1970]];
	if ([disciplineIds count] < 1) {
   MPC uploadImage:issueImage withExtension:@"jpeg" withFileName:imageName ToURLString:attachmentURL]){
             [mDownloadManager downloadFiles:[proj getAllNodesWithoutParents] forProject:mProjectID forDiscipline:NULL]; //succesful uploading
            }
else{
        });
    }

In "downloadFiles" method there are//unsuccesful uploading store the issue image in a list:
            }

See the bottom of the page to see the uploadImage method



Anchor
getAttachmentListFromIssueCode
getAttachmentListFromIssueCode

Get the attachment list from the issue

Deck of Cards
idgetAttachmentListFromIssueCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton]some logic and data storage operations and for each of the discipline you can call this snippet:


	NodeHeaderDatas *nodeDatas = [mFilesToProcess objectAtIndex:0];
	NSString *nodeidForAPICall = nodeDatas.nodeID;

	CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];
	NSMutableURLRequest *requestForNodeData = [[NSMutableURLRequest alloc] init];
	NSString *nodesURL;
    NSMutableURLRequest *attachmentsRequest;
   if (nodeDatas.disciplineForDownloadingattachmentsRequest != NULL) { [[NSMutableURLRequest alloc] init];

    NSString        nodesURL *urlStringForIssue = [NSString stringWithFormat:
                        @"%@%@/objectsissues/%@/disciplines/%@/geometries/threejs",
              attachments",
          [CSS getDefaultAPIURL],
                        [CSS getSluggetDefaultAPIURL],
                        nodeidForAPICall,
           [CSS getSlug],
            nodeDatas.disciplineForDownloading];
        }else{
            nodesURL = [NSString stringWithFormat: issueid];
    DLog(@"%@",urlStringForIssue);
    [attachmentsRequest setURL:[NSURL URLWithString:urlStringForIssue]];
              @"%@%@/objects/%@/geometries/threejs",[attachmentsRequest setHTTPMethod:@"GET"];
    [attachmentsRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [attachmentsRequest setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];

    NSHTTPURLResponse *responseHTTPForAttachments;
      [CSS getDefaultAPIURL],NSError *error;

    NSData *rawAttachmentsList = [NSURLConnection sendSynchronousRequest:attachmentsRequest returningResponse:&responseHTTPForAttachments error:&error];
    [attachmentsRequest release];

    if ([responseHTTPForAttachments statusCode]   [CSS getSlug],== 200) {
        NSMutableArray *attachmentsList = [NSJSONSerialization JSONObjectWithData:rawAttachmentsList options:NSJSONReadingMutableContainers error:&error];
        if ([attachmentsList nodeidForAPICallcount];

 > 0) {
     }
       return [requestForNodeData setURL:[NSURL URLWithString:nodesURL]];
attachmentsList;
        }else{
  [requestForNodeData setHTTPMethod:@"GET"];
        [requestForNodeData setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
 return NULL;
        }
    [requestForNodeData setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];

        if(requestForNodeData){
            mConnection = [[NSURLConnection alloc] initWithRequest:requestForNodeData delegate:self startImmediately:YES}else{
        return NULL;
    }




Anchor
uploadImageCode
uploadImageCode

Upload image utility method for ObjectiveC

Deck of Cards
iduploadImageCode


Card
labelObjectiveC


Code Block
borderColorGreen
langjava
titleJSON
- (BOOL)uploadImage:(UIImage*)image withExtension:(NSString*)ext withFileName:(NSString*)fileName ToURLString:(NSString*)urlString{

    CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];
    NSURL *url = [NSURL URLWithString:urlString];
    NSMutableURLRequest *request =  }
if (!mConnection)[NSMutableURLRequest requestWithURL:url];
    // Method
   {
        [request setHTTPMethod:@"POST"];

    // ConnectionSet Failedheaders
    NSString *boundary   }= @"AaB03x";
    NSString *contentType =  else
        {[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];

    [request setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];
     [mConnectionrequest scheduleInRunLoopaddValue:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModescontentType forHTTPHeaderField:@"Content-Type"];

    // FORM
    NSData *dataForTestImage  [mConnection start]= UIImageJPEGRepresentation(image, 1.0);
    NSMutableData *body =  }[NSMutableData data];

        [requestForNodeData release];

Card
labelC#

...

Upload project thumbnail

...

iduploadThumbnailCode
Card
labelObjectiveC
Code Block
borderColorGreen
langjava
titleJSON

CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];
NSString *urlString = [[CSS getDefaultAPIURL] stringByAppendingFormat:@"%@/projects/%@/thumbnail",[CSS getSlug],currentProject.mID];
MultIPartFormCommunication *MPC = [MultIPartFormCommunication sharedSingleton];
if (![MPC uploadImage:imagePlaceholder.image withExtension:@"jpeg" withFileName:@"thumbnail" ToURLString:urlString]){
[[ProjectManager sharedProjectManager] addUnUploadedThumbnailsProjectIdToList:currentProject.mID];
}

...

labelC#

...

Create an issue in the project

Deck of Cards
idcreateIssueProjectCode
C#
Card
labelObjectiveC
Code Block
borderColorGreen
langjava
titleJSON

CommunicationSingleton *CSS = [CommunicationSingleton sharedSingleton];
//get its dictionary:
    NSMutableDictionary *currentIssueData = [self getIssueInformationForIssueId:ISSUE_IDbody appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@.%@\"\r\n", fileName,ext] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:dataForTestImage];

    // fileName
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    //create nsdata for uploading:
    NSError *error;
    NSData *dataForCurrentIssue = [NSJSONSerialization dataWithJSONObject:currentIssueData options:NSJSONWritingPrettyPrinted error:&error];
    
    //create issue request:
    NSMutableURLRequest *uploadRequestForCurrentIssue;
    uploadRequestForCurrentIssue = [[NSMutableURLRequest alloc] init];
    
    NSString *urlStringForIssue = [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"fileName\"\r\n\r\n%@.%@", fileName,ext] dataUsingEncoding:NSUTF8StringEncoding]];

    // type
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"type\"\r\n\r\nimage/%@", ext] dataUsingEncoding:NSUTF8StringEncoding]];

    // size
    [body appendData:[[NSString stringWithFormat:@"%@%@/projects/%@/issues",
                                   [CSS getDefaultAPIURL],\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"size\"\r\n\r\n%d", [dataForTestImage length]] dataUsingEncoding:NSUTF8StringEncoding]];


    // objectIds
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",   boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data;   [CSS getSlug],name=\"objectIds\"\r\n\r\n%@", @""]
dataUsingEncoding:NSUTF8StringEncoding]];

    // End
    [body           appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    [request setHTTPBody:body];

    NSHTTPURLResponse* response;
     self.mID]NSError* err;
    [NSURLConnection sendSynchronousRequest:request
      [uploadRequestForCurrentIssue setURL:[NSURL URLWithString:urlStringForIssue]];
    [uploadRequestForCurrentIssue setHTTPMethod:@"POST"];
    [uploadRequestForCurrentIssue setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [uploadRequestForCurrentIssue setValue:[CSS getAuthorization] forHTTPHeaderField:@"Authorization"];returningResponse:&response
    [uploadRequestForCurrentIssue setHTTPBody:dataForCurrentIssue];
      
    NSHTTPURLResponse *responseHTTPForCurrentIssue;
    
    NSData *responseForCurrentIssue = [NSURLConnection sendSynchronousRequest:uploadRequestForCurrentIssue returningResponse:&responseHTTPForCurrentIssue error:&error];
    [uploadRequestForCurrentIssue release];
    error:&err];

    if ([responseHTTPForCurrentIssueresponse statusCode] == 201) {
        // Success, issue uploadedreturn true;
    }else{
        // Error, upload failedreturn false;
    }
}
Card
label