--- /dev/null
+<?php
+
+/**
+ * ProjectAPI short summary.
+ *
+ * GET : Verify if user exists and if it's administrator. Give username, name and firstname
+ * PUT : Create a non-administrator user
+ * POST : Add a project proposed by User (authentification necessary)
+ * DELETE : Delete this user (authentification necessary)
+ *
+ * ProjectAPI description.
+ *
+ * @version 1.0
+ * @author Ferrand
+ */
+class ProjectAPI extends RestAPI {
+ use dontAllowDeleteCollection;
+ use dontAllowPutCollection;
+ use dontAllowPost;
+
+ protected function GETCollectionAction() {
+ $dbh = $this->databaseHelper();
+ $whereClauses = "";
+ $whereValue = [];
+
+ if(isset($_GET['lastSync'])) {
+ $whereClauses = " WHERE `lastModification` > :lastSync";
+ $whereValue[':lastSync'] = $_GET['lastSync'];
+ }
+
+ $response = $dbh->prepare('SELECT * FROM pub_Project'.$whereClauses);
+ $response->execute($whereValue);
+
+ if($response === false) {
+ $this->respondeError();
+ return;
+ }
+
+ $data = array();
+ while (($row = $response->fetch(PDO::FETCH_ASSOC)) !== false) {
+ $serverProject = new ServerProject();
+ $serverProject->id = $row['id'];
+ $serverProject->active = $row['active'];
+ $serverProject->proposedBy = $row['proposedBy'];
+ $serverProject->validate = $row['validate'];
+ $serverProject->name = $row['name'];
+ $serverProject->description = $row['description'];
+ $serverProject->currentFunding = $row['currentFunding'];
+ $serverProject->requestedFunding = $row['requestedFunding'];
+ $serverProject->lastModification = $row['lastModification'];
+ $serverProject->creationDate = $row['creationDate'];
+ $serverProject->beginDate = $row['beginDate'];
+ $serverProject->endDate = $row['endDate'];
+ $serverProject->latitude = $row['latitude'];
+ $serverProject->longitude = $row['longitude'];
+ $serverProject->illustration = $row['illustration'];
+ $serverProject->email = $row['email'];
+ $serverProject->website = $row['website'];
+ $serverProject->phone = $row['phone'];
+
+
+ array_push($data, $serverProject);
+ }
+ $this->responde(200, $data);
+ }
+
+ protected function GETAction() {
+ $dbh = $this->databaseHelper();
+
+ $response = $dbh->prepare('SELECT * FROM pub_Project
+ WHERE id = :id
+ ');
+ $response->execute(['id' => $this->element]);
+
+ if($response === false) {
+ $this->respondeError();
+ return; // end this
+ }
+
+ $row = $response->fetch(PDO::FETCH_ASSOC) ;
+ if($row === false) {
+ $this->respondeNoResult();
+ return; // end this
+ }
+
+ $serverProject = new DetailedServerProject();
+ $serverProject->id = $row['id'];
+ $serverProject->active = $row['active'];
+ $serverProject->proposedBy = $row['proposedBy'];
+ $serverProject->validate = $row['validate'];
+ $serverProject->name = $row['name'];
+ $serverProject->description = $row['description'];
+ $serverProject->currentFunding = $row['currentFunding'];
+ $serverProject->requestedFunding = $row['requestedFunding'];
+ $serverProject->lastModification = $row['lastModification'];
+ $serverProject->creationDate = $row['creationDate'];
+ $serverProject->beginDate = $row['beginDate'];
+ $serverProject->endDate = $row['endDate'];
+ $serverProject->latitude = $row['latitude'];
+ $serverProject->longitude = $row['longitude'];
+ $serverProject->illustration = $row['illustration'];
+ $serverProject->fundedBy = array();
+ $serverProject->commentedBy = array();
+ $serverProject->email = $row['email'];
+ $serverProject->website = $row['website'];
+ $serverProject->phone = $row['phone'];
+
+ $response = $dbh->prepare('SELECT * FROM pub_Funding
+ WHERE projectId = :id
+ ');
+ $response->execute(['id' => $this->element]);
+
+ if($response === false) {
+ $this->respondeError();
+ return; // end this
+ }
+
+ while($row = $response->fetch(PDO::FETCH_ASSOC)) {
+ $serverFunding = new ServerFunding();
+ $serverFunding->id = $row['id'];
+ $serverFunding->transactionId = $row['transactionId'];
+ $serverFunding->value = $row['value'];
+ $serverFunding->creationDate = $row['creationDate'];
+ $serverFunding->username = $row['userId'];
+ $serverFunding->projectID = $row['projectId'];
+
+ $serverProject->fundedBy[] = $serverFunding;
+ }
+
+ $response = $dbh->prepare('SELECT * FROM pub_Commentary
+ WHERE projectId = :id
+ ');
+ $response->execute(['id' => $this->element]);
+
+ if($response === false) {
+ $this->respondeError();
+ return; // end this
+ }
+
+ while($row = $response->fetch(PDO::FETCH_ASSOC)) {
+ $serverCommentary = new ServerCommentary();
+ $serverCommentary->id = $row['id'];
+ $serverCommentary->title = $row['title'];
+ $serverCommentary->message = $row['description'];
+ $serverCommentary->mark = $row['rating'];
+ $serverCommentary->creationDate = $row['creationDate'];
+ $serverCommentary->username = $row['userId'];
+ $serverCommentary->projectID = $row['projectId'];
+
+ $serverProject->commentedBy[] = $serverCommentary;
+ }
+
+ $this->responde(200, $serverProject);
+ }
+
+ /**
+ * returnCode :
+ * 0 : Created (201)
+ * 1 : Missing username or password
+ * 2 : username already exists
+ */
+ protected function PUTAction() {
+
+ $auth = $this->authentication();
+ if($auth === null) {
+ $this->respondeUnauthorized();
+ return;
+ }
+
+
+ $dbh = $this->databaseHelper();
+
+ $response = $dbh->prepare('SELECT * FROM pub_Project
+ WHERE id = :id
+ ');
+ $response->execute(['id' => $this->element]);
+
+ if($response === false) {
+ $this->respondeError();
+ return; // end this
+ }
+
+ $row = $response->fetch(PDO::FETCH_ASSOC) ;
+ if($row === false) {
+ $this->respondeNoResult();
+ return; // end this
+ }
+
+ $serverProject = new ServerProject();
+ $serverProject->id = $row['id'];
+ $serverProject->active = $row['active'];
+ $serverProject->proposedBy = $row['proposedBy'];
+ $serverProject->validate = $row['validate'];
+ $serverProject->name = $row['name'];
+ $serverProject->description = $row['description'];
+ $serverProject->currentFunding = $row['currentFunding'];
+ $serverProject->requestedFunding = $row['requestedFunding'];
+ $serverProject->creationDate = $row['creationDate'];
+ $serverProject->beginDate = $row['beginDate'];
+ $serverProject->endDate = $row['endDate'];
+ $serverProject->latitude = $row['latitude'];
+ $serverProject->longitude = $row['longitude'];
+ $serverProject->illustration = $row['illustration'];
+ $serverProject->commentedBy = array();
+ $serverProject->email = $row['email'];
+ $serverProject->website = $row['website'];
+ $serverProject->phone = $row['phone'];
+
+
+ $data = $this->getBodyData();
+ $compare = $this->compare($serverProject, $data);
+
+
+ //var_dump($copare['fieldChanged']);
+
+ // No change, we respond 1
+ if(empty($compare['fieldChanged'])) {
+ $simpleResponse = new SimpleServerResponse();
+ $simpleResponse->code = 1;
+ $this->responde(200, $simpleResponse);
+ return;
+ }
+
+ // Check if want to change validate or active, to restrict for admin
+ if(in_array('validate', $compare['fieldChanged']) or in_array('active', $compare['fieldChanged'])) {
+ if($auth['administrator'] == 0) {
+ $this->respondeForbidden();
+ return;
+ }
+ }
+
+ $response = $dbh->prepare('UPDATE pub_Project
+ SET ' . $compare['setLine'] . ', `lastModification` = NOW()
+ WHERE id = :id
+ ');
+ $response->execute([':id' => $this->element]);
+
+ if($response === false) {
+ $this->respondeError();
+ return; // end this
+ }
+
+ $simpleResponse = new SimpleServerResponse();
+ $simpleResponse->code = 0;
+ $this->responde(200, $simpleResponse);
+ }
+
+ protected function POSTCollectionAction() {
+ $dbh = $this->databaseHelper();
+
+ $data = $this->getBodyData();
+ $user = $this->authentication();
+
+ if($user === null or $user['pseudo'] !== $data->proposedBy) {
+ $this->respondeUnauthorized();
+ return; // end this!
+ }
+
+ if($data->validate == 1) {
+ if($user['administrator'] == 0) {
+ $this->respondeForbidden();
+ return; // end this!
+ }
+ }
+
+ $request = 'INSERT INTO `pub_Project` (
+ `id` , `active`, `name` , `description` , `validate` , `proposedBy` ,
+ `requestedFunding` , `currentFunding` ,
+ `creationDate` , `beginDate` , `endDate` ,
+ `latitude` , `longitude` ,
+ `illustration` , `lastModification` ,
+ `email` , `phone` , `website`)
+ VALUES ("" , "1", :name, :description, :validate,
+ :proposedBy, :requestedFunding, "0", NOW(), :beginDate, :endDate, :latitude, :longitude, :illustration,
+ NOW(), :contactAddress , :contactPhone, :contactWebsite);';
+
+ $response = $dbh->prepare($request);
+ $response->execute([
+ ':name' => $data->name,
+ ':description' => $data->description,
+ ':validate' => $data->validate,
+ ':proposedBy' => $data->proposedBy,
+ ':requestedFunding' => $data->requestedFunding,
+ ':beginDate' => $data->beginDate,
+ ':endDate' => $data->endDate,
+ ':latitude' => $data->latitude,
+ ':longitude' => $data->longitude,
+ ':illustration' => $data->illustration,
+ ':contactAddress' => $data->email,
+ ':contactPhone' => $data->phone,
+ ':contactWebsite' => $data->website
+ ]);
+
+ if($response === false) { // Server/database fails
+ $this->respondeError();
+ }
+
+ $rowAffected = new RowAffected();
+ $rowAffected->id = $dbh->lastInsertId();
+
+ $this->responde(200, $rowAffected);
+ }
+
+ protected function DELETEAction() {
+
+ }
+
+}