Skip to content

Commit c8256ea

Browse files
committed
Merge pull request #1 from codebendercc/development
Development
2 parents 05685ab + 7c414c2 commit c8256ea

File tree

2 files changed

+74
-73
lines changed

2 files changed

+74
-73
lines changed

Symfony/src/Codebender/ApiBundle/Controller/DefaultController.php

Lines changed: 73 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -22,49 +22,6 @@ public function statusAction()
2222
return new Response(json_encode(array("success" => true, "status" => "OK")));
2323
}
2424

25-
/**
26-
* compileWebsite action
27-
*
28-
* @return Response Response intance.
29-
*
30-
*/
31-
public function compileWebsiteAction($auth_key, $version)
32-
{
33-
34-
if ($auth_key !== $this->container->getParameter('auth_key'))
35-
{
36-
return new Response(json_encode(array("success" => false, "step" => 0, "message" => "Invalid authorization key.")));
37-
}
38-
39-
if ($version !== $this->container->getParameter('version'))
40-
{
41-
return new Response(json_encode(array("success" => false, "step" => 0, "message" => "Invalid api version.")));
42-
}
43-
44-
$request = $this->getRequest()->getContent();
45-
46-
$contents = json_decode($request, true);
47-
48-
$apihandler = $this->get('codebender_api.handler');
49-
50-
$personalMatchedLibs = $contents['libraries'];
51-
52-
$files = $contents["files"];
53-
54-
$headersArr = $this->checkHeaders($files, $personalMatchedLibs);
55-
56-
$contents["libraries"] = $headersArr['libraries'];
57-
$request_content = json_encode($contents);
58-
59-
// perform the actual post to the compiler
60-
$data = $apihandler->post_raw_data($this->container->getParameter('compiler'), $request_content);
61-
$decoded_compiler_data = json_decode($data, true);
62-
63-
$responsedata = array('success' => true, 'personal' => array_keys($personalMatchedLibs), 'library' => $headersArr['libraries'], 'foundFiles' => $headersArr['foundFiles'], 'notFoundHeaders' => $headersArr['notFoundHeaders'], 'compileResponse' => $decoded_compiler_data);
64-
65-
return new Response(json_encode($responsedata));
66-
}
67-
6825
/**
6926
* compile action
7027
*
@@ -76,85 +33,135 @@ public function compileAction($auth_key, $version)
7633

7734
if ($auth_key !== $this->container->getParameter('auth_key'))
7835
{
79-
return new Response(json_encode(array("success" => false, "step" => 0, "message" => "Invalid authorization key.")));
36+
return new Response(json_encode(array("success" => false, "message" => "Invalid authorization key.")));
8037
}
8138

8239
if ($version !== $this->container->getParameter('version'))
8340
{
84-
return new Response(json_encode(array("success" => false, "step" => 0, "message" => "Invalid api version.")));
41+
return new Response(json_encode(array("success" => false, "message" => "Invalid api version.")));
8542
}
8643

8744
$request = $this->getRequest()->getContent();
45+
if (empty($request))
46+
{
47+
return new Response(json_encode(array("success" => false, "message" => "Invalid input.")));
48+
}
8849

8950
$contents = json_decode($request, true);
9051

9152
$apihandler = $this->get('codebender_api.handler');
9253

9354
$files = $contents["files"];
9455

56+
$this->checkForUserProject($files);
57+
9558
$userlibs = array();
59+
9660
if (array_key_exists('libraries', $contents))
9761
$userlibs = $contents['libraries'];
9862

99-
$headersArr = $this->checkHeaders($files, $userlibs);
63+
$parsedLibs = $this->checkHeaders($files, $userlibs);
10064

101-
$contents['files'][] = array('filename' => 'user_null.txt', 'content' => '');
102-
$contents['files'][] = array('filename' => 'null.txt', 'content' => '');
65+
$contents["libraries"] = $parsedLibs['libraries'];
10366

104-
$contents["libraries"] = $headersArr['libraries'];
10567
$request_content = json_encode($contents);
10668

10769
// perform the actual post to the compiler
10870
$data = $apihandler->post_raw_data($this->container->getParameter('compiler'), $request_content);
10971

110-
return new Response($data);
72+
$decoded = json_decode($data, true);
73+
if ($decoded == null)
74+
{
75+
return new Response(json_encode(array("success" => false, "message"=> "Failed to get compiler response.")));
76+
}
77+
78+
if ($decoded["success"] === false && !array_key_exists("step", $decoded))
79+
$decoded["step"] = "unknown";
80+
81+
unset($parsedLibs['libraries']);
82+
$decoded['additionalCode'] = $parsedLibs;
83+
84+
return new Response(json_encode($decoded));
11185
}
11286

11387
/**
11488
*
115-
* @param type $files
116-
* @param array $personalLibs
89+
* @param array $files
90+
* @param array $userLibs
11791
*
118-
* @return type
92+
* @return array
11993
*/
120-
protected function checkHeaders($files, array $personalLibs)
94+
protected function checkHeaders($files, array $userlibs)
12195
{
12296
$apiHandler = $this->get('codebender_api.handler');
12397

12498
$headers = $apiHandler->read_libraries($files);
12599

126100
// declare arrays
127-
$libraries = $notFoundHeaders = $foundFiles = array();
101+
$libraries = $notFoundHeaders = $foundHeaders = $fetchedLibs = $providedLibs = array();
102+
103+
$providedLibs = array_keys($userlibs);
128104

129105
// get library manager url
130106
$libmanager_url = $this->container->getParameter('library');
131107

132-
$libraries = $personalLibs;
108+
$libraries = $userlibs;
133109

134110
foreach ($headers as $header) {
135-
$foundPersonal = false;
136-
foreach ($personalLibs as $plibrary){
137-
foreach ($plibrary as $libcontent){
138-
if ($libcontent["filename"] == $header.".h")
139-
$foundPersonal = true;
111+
112+
$exists_in_request = false;
113+
foreach ($userlibs as $lib){
114+
foreach ($lib as $libcontent){
115+
if ($libcontent["filename"] == $header.".h") {
116+
$exists_in_request = true;
117+
$foundHeaders[] = $header . ".h";
118+
}
140119
}
141120
}
142-
if ($foundPersonal === false) {
121+
if ($exists_in_request === false) {
143122

144123
$data = $apiHandler->get($libmanager_url . "/fetch?library=" . urlencode($header));
145124
$data = json_decode($data, true);
146125

147126
if ($data["success"]) {
127+
$fetchedLibs[] = $header;
128+
148129
$libraries[$header] = $data["files"];
149-
foreach ($data['files'] as $file) {
150-
$foundFiles[] = $file['filename'];
151-
}
130+
$foundHeaders[] = $header . ".h";
131+
152132
} elseif (!$data['success']){
153133
$notFoundHeaders[] = $header . ".h";
154134
}
155135
}
156136
}
157-
return array('libraries' => $libraries, 'foundFiles' => $foundFiles, 'notFoundHeaders' => $notFoundHeaders);
137+
138+
return array(
139+
'libraries' => $libraries,
140+
'providedLibraries' => $providedLibs,
141+
'fetchedLibraries' => $fetchedLibs,
142+
'detectedHeaders'=> $headers,
143+
'foundHeaders' => $foundHeaders,
144+
'notFoundHeaders' => $notFoundHeaders);
145+
}
146+
147+
/**
148+
*
149+
* @param array $files
150+
* Checks if project id and user id txt files exist in the request files.
151+
* If not, creates these files with null id
152+
*
153+
*/
154+
protected function checkForUserProject(&$files)
155+
{
156+
$foundProj = $foundUsr = false;
157+
158+
foreach ($files as $file) {
159+
if (preg_match('/(?<=user_)[\d]+/', $file['filename'])) $foundUsr = true;
160+
if (preg_match('/(?<=project_)[\d]+/', $file['filename'])) $foundProj = true;
161+
}
162+
163+
if (!$foundUsr) $files[] = array('filename' => 'user_null.txt', 'content' => '');
164+
if (!$foundProj) $files[] = array('filename' => 'project_null.txt', 'content' => '');
158165
}
159166
}
160167

Symfony/src/Codebender/ApiBundle/Resources/config/routing.yml

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,8 @@ CodebenderApiBundle_status_check:
22
pattern: /status
33
defaults: { _controller: CodebenderApiBundle:Default:status }
44

5-
CodebenderApiBundle_cb_website_compile:
6-
pattern: /{auth_key}/{version}/website/compile
7-
defaults: { _controller: CodebenderApiBundle:Default:compileWebsite }
8-
requirements:
9-
_method: POST
10-
115
CodebenderApiBundle_compile:
126
pattern: /{auth_key}/{version}/compile
137
defaults: { _controller: CodebenderApiBundle:Default:compile }
148
requirements:
15-
_method: POST
9+
_method: POST

0 commit comments

Comments
 (0)