Example #1
0
 /**
  * @Route("/api/v1/campaigns/{campaignId}/files", name="_campaign_files_post")
  * @Method("POST")
  *
  * @ApiDoc(
  *      description="Upload a file and associate it to a campaign and specific task such as the Strategic Reckoner file to the JTBD task.",
  *      section="Z_DISABLED",
  *      statusCodes={
  *          200 = "OK",
  *          400 = {"Please input values for task_id, file_type_id.", "Please specify file to be uploaded."},
  *          403 = "Invalid API KEY",
  *          500 = "Header x-wsse does not exist", 
  *      },
  *      requirements={
  *          {"name"="campaignId", "dataType"="string", "description"="Campaign identifier for uploading files."}
  *      },
  *      parameters={
  *          {"name"="campaign_file", "dataType"="file", "required"=true, "description"="The file to be uploaded."},
  *          {"name"="task_id", "dataType"="string", "required"=true, "description"="The task related to the uploaded file."},
  *          {"name"="file_type_id", "dataType"="string", "required"=true, "description"="The file type of the uploaded file."}
  *      }
  * )
  *
  */
 public function postCampaignFilesAction($campaignId, Request $request)
 {
     if (strpos(get_class($request->files->get('campaign_file')), 'UploadedFile') != FALSE) {
         // File has been sent in the request:
         if (!$request->get('task_id') || !$request->get('file_type_id')) {
             $response = new Response();
             $response->setStatusCode(400);
             $response->setContent(json_encode(array('success' => false, 'message' => 'Please input values for task_id, file_type_id.')));
             return $response;
         }
     } else {
         // File was not specified:
         $response = new Response();
         $response->setStatusCode(400);
         $response->setContent(json_encode(array('success' => false, 'message' => 'Please specify file to be uploaded.')));
         return $response;
     }
     // End of validation IF.
     // Populate file instance:
     $file = new ProjectFile();
     $file->setCampaignFile($request->files->get('campaign_file'));
     $file->setUuid(Uuid::uuid4()->toString());
     $file->setOriginalName(rawurldecode($file->getFile()->getClientOriginalName()));
     $file->setContentType($file->getFileExtension($file->getOriginalName()));
     $file->setFileLength($file->getFile()->getClientSize());
     $file->setFileName($file->getUuid() . $file->getContentType());
     $file->setNotVisible(FALSE);
     // Set time for when the file was created:
     $creationDate = new \DateTime();
     $creationDate->setTimezone(self::timezoneUTC());
     $file->setCreatedAt($creationDate);
     $file->setUpdatedAt($creationDate);
     // Specify designated campaign:
     $campaign = $this->getDoctrine()->getRepository('CampaignBundle:Campaign')->findOneBy(array('id' => $campaignId));
     $file->setCampaign($campaign);
     // Return designated task specified in request (task should already exist in database):
     $task = $this->getDoctrine()->getRepository('TaskBundle:Task')->findOneBy(array('id' => $request->get('task_id')));
     $file->setTask($task);
     // Specify Task Type:
     $fileType = $this->getDoctrine()->getRepository('CampaignBundle:Filetype')->findOneBy(array('id' => $request->get('file_type_id')));
     $file->setFileType($fileType);
     // Specify User Creator:
     $userCreator = $this->getUser();
     $file->setUser($userCreator);
     $response = new Response();
     // Create and prepare Response object to be sent back to client.
     $response->headers->set('Content-Type', 'application/json');
     // Retrieve latest version of the file:
     $fileRepository = $this->getDoctrine()->getRepository('FileBundle:File');
     $versionQuery = $fileRepository->createQueryBuilder('f')->where('f.campaign = :campaign 
             AND f.originalName = :originalName
             AND f.task = :task
             AND f.fileType = :fileType
             AND f.contentType = :contentType
             AND f.version IS NOT NULL
             AND f.notVisible != TRUE
             ')->setParameter('campaign', $campaign)->setParameter('originalName', $file->getOriginalName())->setParameter('task', $task)->setParameter('fileType', $fileType)->setParameter('contentType', $file->getContentType())->orderBy('f.version', 'DESC')->setMaxResults(1)->getQuery();
     $latestFileVersion = $versionQuery->getOneOrNullResult();
     // Return latest version or NULL if file name does not match.
     if ($latestFileVersion != null) {
         // File already exists.
         $file->setVersion($latestFileVersion->getVersion() + 1);
     } else {
         $file->setVersion(1);
     }
     // End of version IF().
     // Get validator service to check for errors:
     $validator = $this->get('validator');
     $errors = $validator->validate($file);
     // Validate the values entered in the File object:
     if (count($errors) > 0) {
         // Return $errors in JSON format:
         $serializer = $this->get('jms_serializer');
         $serializer->serialize($errors, 'json');
         $response->setContent($errors);
         return $response;
     }
     // End of errors IF.
     // Persis object to database:
     $em = $this->getDoctrine()->getManager();
     $targetDir = 'campaign_files/' . $campaign->getId();
     // Specify target directory for file.
     $file->upload($targetDir);
     // Move campaign file in target directory.
     $em->persist($file);
     //RECALCULATE AND ASSIGN CAMPAIGN COMPLETENESS AFTER POSTING EACH FILE.
     $updateDate = new \DateTime();
     $updateDate->setTimezone(self::timezoneUTC());
     $new_campaign_completeness = self::recalculate_campaign_completeness($campaign);
     $campaign->setCompleteness($new_campaign_completeness);
     $campaign->setUpdatedAt($updateDate);
     //END RECALCULATION
     $em->flush();
     $response->setContent(json_encode(array('success' => true)));
     return $response;
 }