work with APE
continuous-integration/drone/push Build is failing Details

issue_031_import
David D'ALMEIDA 1 year ago
parent d0d1d4c23d
commit adb9584cba

@ -11,7 +11,7 @@ $dotenv->safeLoad();
// const DB_DATABASE = $_ENV['DB_DATABASE'] ?? 'heartTrack'; // const DB_DATABASE = $_ENV['DB_DATABASE'] ?? 'heartTrack';
// const DB_USER = $_ENV['DB_USER'] ?? 'toto'; // const DB_USER = $_ENV['DB_USER'] ?? 'toto';
// const DB_PASSWORD = $_ENV['DB_PASSWORD'] ?? 'achanger'; // const DB_PASSWORD = $_ENV['DB_PASSWORD'] ?? 'achanger';
define("APP_ENV", 'development'); define("APP_ENV", "development");
const DB_HOST = 'localhost'; const DB_HOST = 'localhost';
const DB_DATABASE = 'heartTrack'; const DB_DATABASE = 'heartTrack';

@ -23,6 +23,7 @@ class AppCreator
$this->services[] = $serviceId; $this->services[] = $serviceId;
return $this; return $this;
} }
public function registerSingleton(string $serviceId, $service): self public function registerSingleton(string $serviceId, $service): self
{ {
$this->container->set($serviceId, $service, Container::SINGLETON); $this->container->set($serviceId, $service, Container::SINGLETON);
@ -39,6 +40,7 @@ class AppCreator
{ {
// Check the application environment // Check the application environment
switch (APP_ENV) { switch (APP_ENV) {
case 'console': case 'console':
// Load the Console.php file in case of the 'console' environment // Load the Console.php file in case of the 'console' environment
require_once __DIR__ . '/../console/Console.php'; require_once __DIR__ . '/../console/Console.php';
@ -58,7 +60,6 @@ class AppCreator
} }
function AddControllers($namespacePrefix = 'App\Controller', $pathToControllers = __DIR__ . '/controller'): self function AddControllers($namespacePrefix = 'App\Controller', $pathToControllers = __DIR__ . '/controller'): self
{ {
$controllerFiles = glob($pathToControllers . '/*.php'); $controllerFiles = glob($pathToControllers . '/*.php');
@ -93,7 +94,8 @@ class AppCreator
return $this->services; return $this->services;
} }
public function getDicontainer(){ public function getDicontainer()
{
return $this->container; return $this->container;
} }
} }

@ -54,7 +54,6 @@ class AuthController extends BaseController
]); ]);
} }
} }
#[Route('/login', name: 'login2',methods: ['GET'])] #[Route('/login', name: 'login2',methods: ['GET'])]
public function login2(IRequest $request): IResponse { public function login2(IRequest $request): IResponse {

@ -332,24 +332,6 @@ class Controller extends BaseController
]); ]);
} }
#[Route(path: '/import', name: 'import', methods: ['GET'])]
public function import(): Response
{
return $this->render('./page/import.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/profile', name: 'profile', methods: ['GET'])] #[Route(path: '/profile', name: 'profile', methods: ['GET'])]
public function profile(): Response public function profile(): Response

@ -1,36 +1,107 @@
<?php <?php
// namespace App\Controller; namespace App\Controller;
// use App\Container; use App\Container;
// use App\Router\Request\IRequest; use App\Router\Request\IRequest;
// use App\Router\Response\Response; use App\Router\Response\Response;
// use Shared\Attributes\Route; use Manager\ActivityManager;
// use Twig\Environment; use Shared\Attributes\Route;
// use Data\Core\Preferences; use Twig\Environment;
// use Shared\Log; use Data\Core\Preferences;
use Shared\Log;
// class HeartRateController extends BaseController
// { class HeartRateController extends BaseController
{
// #[Route(path: '/import', name: 'import', methods: ['GET'])] private ActivityManager $activityMgr;
// public function import(): Response
// { public function __construct(ActivityManager $manager)
// return $this->render('./page/import.html.twig',[ {
// 'css' => $this->preference->getCookie(), parent::__construct();
// 'pp' => "test2", $this->activityMgr = $manager;
// 'user' => "Doe", }
// 'role' => "Athlète",
// 'friendship' => [], #[Route(path: '/import', name: 'import', methods: ['GET'])]
// 'analyzes' => [], public function import(): Response
// 'mails' => [], {
// 'users' => [], return $this->render('./page/import.html.twig', [
// 'infoUser' => [], 'css' => $this->preference->getCookie(),
// 'exos' => [], 'pp' => "test2",
// 'member' => [] 'user' => "Doe",
// ]); 'role' => "Athlète",
// } 'friendship' => [],
'analyzes' => [],
'mails' => [],
// } 'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/upload', name: 'upload', methods: ['POST'])]
public function uploadFile(string $activityType, int $effort, IRequest $req): Response
{
$error = [];
/*$fileType = strtolower(pathinfo($_FILES["uploaded_file"]["name"], PATHINFO_EXTENSION));
if (!$fileType == "fit") {
$error [] = "";
}*/
// Validate effort
if ($effort < 0 || $effort > 5) {
$error [] = 'Invalid effort level.';
$resp = new Response('Invalid effort level.', 400);
return $this->render('./page/import.html.twig', [
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => [],
'error' => $error
], $resp);
}
/* $error [] = 'Le fichier doit être de type d\'une taille inferieur à 10 MB.';*/
// Move the file to the directory where files are stored
try {
$tmp_file = $_FILES['uploaded_file']['tmp_name'];
if(file_exists($tmp_file)) {
$fileExtension = pathinfo($_FILES['uploaded_file']['name'], PATHINFO_EXTENSION);
if ($fileExtension === 'fit') {
$content = file_get_contents($tmp_file);
if ($this->activityMgr->uploadFile($activityType, 5, $content)) {
/////////////
return $this->render('./page/home.html.twig', [
'css' => $this->preference->getCookie(),
]);
}else{
Log::dd('Ratter Model');
}
}else{
Log::dd('Le fichier doit être de type .fit.');
}
}else{
Log::dd("failed");
}
} catch (\Exception $e) {
Log::dd($e);
return new Response('File upload error.', 500);
}
return new Response('Invalid file type.', 400);
}
}

@ -7,6 +7,8 @@
<meta name="description" content="Accueil" /> <meta name="description" content="Accueil" />
<meta name="author" content="PINAGOT Antoine" /> <meta name="author" content="PINAGOT Antoine" />
<title>{% block title %}{% endblock %}</title> <title>{% block title %}{% endblock %}</title>
<link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/simple-datatables@7.1.2/dist/style.min.css" rel="stylesheet" /> <link href="https://cdn.jsdelivr.net/npm/simple-datatables@7.1.2/dist/style.min.css" rel="stylesheet" />
<link href="/css/{% block css %}style{% endblock %}.css" rel="stylesheet" /> <link href="/css/{% block css %}style{% endblock %}.css" rel="stylesheet" />
<script src="https://use.fontawesome.com/releases/v6.3.0/js/all.js" crossorigin="anonymous"></script> <script src="https://use.fontawesome.com/releases/v6.3.0/js/all.js" crossorigin="anonymous"></script>

@ -12,30 +12,53 @@
<div class="container-fluid px-4"> <div class="container-fluid px-4">
<h1 class="mt-4">Importer</h1> <h1 class="mt-4">Importer</h1>
<ol class="breadcrumb mb-4"> <ol class="breadcrumb mb-4">
<li class="breadcrumb-item"><a href="home.html">Accueil</a></li> <li class="breadcrumb-item"><a href="/">Accueil</a></li>
<li class="breadcrumb-item active">Importer</li> <li class="breadcrumb-item active">Importer</li>
</ol> </ol>
<div class="flex items-center justify-center">
<div class="row"> <div class="sm:max-w-lg w-full p-10 bg-white rounded-xl z-10 ">
<div class="col"> <div class="text-center">
<div class="card mb-4"> <h2 class="mt-5 text-3xl font-bold text-gray-900">
<div class="card-header"> Importer un fichier .fit !
<img src="/assets/img/bupload.png"></i> </h2>
Importer un fichier .fit <p class="mt-2 text-sm text-gray-400">Let's go</p>
</div> </div>
<div class="card-body"> <form class="mt-8 space-y-3" action="/upload" method="POST" enctype="multipart/form-data">
<div class="grid grid-cols-1 space-y-2">
<div style="text-align:center; margin-bottom: 15px;"> <label class="text-sm font-bold text-gray-500 tracking-wide">Veuillez renseigner le type d'activité</label>
<label for="file-input"> <input class="text-base p-2 border border-gray-300 rounded-lg focus:outline-none focus:border-indigo-500" type="text" name="activityType" placeholder="Course à pied">
<img src="/assets/img/uploadW.svg"/> </div>
<div class="grid grid-cols-1 space-y-2">
<label class="text-sm font-bold text-gray-500 tracking-wide">Effort Level (0-5)</label>
<input class="text-base p-2 border border-gray-300 rounded-lg focus:outline-none focus:border-indigo-500" type="number" name="effort" min="0" max="5" placeholder="Enter effort level (0-5)">
</div>
<div class="grid grid-cols-1 space-y-2">
<label class="text-sm font-bold text-gray-500 tracking-wide">Attach Document</label>
<div class="flex items-center justify-center w-full">
<label class="flex flex-col rounded-lg border-4 border-dashed w-full h-60 p-10 group text-center cursor-pointer">
<div class="h-full w-full text-center flex flex-col items-center justify-center items-center ">
<div class="flex flex-auto max-h-48 w-2/5 mx-auto -mt-10">
<img class="has-mask h-36 object-center" src="https://img.freepik.com/free-vector/image-upload-concept-landing-page_52683-27130.jpg?size=338&ext=jpg" alt="freepik image">
</div>
<p class="pointer-none text-gray-500 "><span class="text-sm">Drag and drop</span> files here <br /> or
<span class="text-blue-600 hover:underline">select a file</span>
from your computer</p>
</div>
<input type="file" class="hidden" id="file-input" name="uploaded_file">
</label> </label>
<form action="/analyses" method="post"> <p id="file-name-display" class="text-sm text-gray-500"></p>
<input id="file-input" type="file" name="fileToUpload" value=""style="visibility: hidden; width:0; height:0;"/>
<input type="submit" value="Soumettre le fichier" name="submit"/>
</form>
</div> </div>
</div> </div>
<p class="text-sm text-gray-300">
<span>File type: .fit</span>
</p>
<div class="flex justify-center">
<button type="submit" class="my-5 w-3/4 flex justify-center bg-blue-500 text-gray-100 p-4 rounded-full tracking-wide
font-semibold focus:outline-none focus:shadow-outline hover:bg-blue-600 shadow-lg cursor-pointer transition ease-in duration-300">
Upload
</button>
</div> </div>
</form>
</div> </div>
</div> </div>
</div> </div>

@ -759,7 +759,13 @@ function profileMenu(Model $model)
do { do {
$effort = trim(fgets(STDIN)); $effort = trim(fgets(STDIN));
} while ($effort < 0 || $effort > 5); } while ($effort < 0 || $effort > 5);
try {
$isAddActivity = $model->activityMgr->uploadFile($typeActivity, $effort, $passFile); $isAddActivity = $model->activityMgr->uploadFile($typeActivity, $effort, $passFile);
}catch (\Throwable $exception){
echo $exception;
}
echo $isAddActivity ? "Activité ajoutée avec succès" : "Erreur lors de l'ajout de l'activité"; echo $isAddActivity ? "Activité ajoutée avec succès" : "Erreur lors de l'ajout de l'activité";
case '0': case '0':
return; return;
@ -790,7 +796,7 @@ while (true) {
}*/ }*/
break; break;
case '2': // S'inscrire case '2': // S'inscrire
if($model->userMgr->login("bruce.lee@example.com", "hello321")) if($model->userMgr->login("bruce.lee@example.com", "password123"))
$loggedIn = true; $loggedIn = true;
// if (registerUser($model)) { // if (registerUser($model)) {
// $loggedIn = true; // $loggedIn = true;

@ -14,6 +14,7 @@ use adriangibbons\phpFITFileAnalysis;
use Exception; use Exception;
use Model\Activity; use Model\Activity;
use Network\IAuthService; use Network\IAuthService;
use Shared\Log;
use Stub\AuthService; use Stub\AuthService;
/** /**
@ -27,6 +28,12 @@ class ActivityManager
*/ */
private IAuthService $authService; private IAuthService $authService;
/**
* @var DataManager
*/
private DataManager $dataManager;
/** /**
* Constructeur de la classe ActivityManager. * Constructeur de la classe ActivityManager.
* *
@ -35,6 +42,7 @@ class ActivityManager
public function __construct(DataManager $dataManager,IAuthService $authService) public function __construct(DataManager $dataManager,IAuthService $authService)
{ {
$this->authService = $authService; $this->authService = $authService;
$this->dataManager = $dataManager;
} }
/** /**
@ -63,9 +71,8 @@ class ActivityManager
// Conversion des données en format JSON // Conversion des données en format JSON
$jsonFitData = json_encode($fitData, JSON_PRETTY_PRINT); $jsonFitData = json_encode($fitData, JSON_PRETTY_PRINT);
// Enregistrement du fichier JSON // Enregistrement du fichier JSON
file_put_contents('/Users/Perederii/SAE/git/Web/Sources/src/data/model/fitFileSaver/jsonFiles/ActivitySave.json', $jsonFitData); file_put_contents( './you.json', $jsonFitData);
return true; return true;
} catch (\Exception $e) { } catch (\Exception $e) {
@ -85,12 +92,13 @@ class ActivityManager
* @return bool Retourne true en cas de succès, sinon false. * @return bool Retourne true en cas de succès, sinon false.
* @throws Exception En cas d'erreur lors du téléchargement, du traitement ou de l'enregistrement des données. * @throws Exception En cas d'erreur lors du téléchargement, du traitement ou de l'enregistrement des données.
*/ */
public function uploadFile($type, $effortRessenti, $file_path_or_data, ?array $options = null): bool public function uploadFile(string $type, int $effortRessenti, string $file_path_or_data, ?array $options = null): bool
{ {
try { try {
// Vérification des options par défaut // Vérification des options par défaut
if (empty($options)) { if (empty($options)) {
$options = [ $options = [
'input_is_data' => true,
'fix_data' => ['all'], 'fix_data' => ['all'],
'data_every_second' => false, 'data_every_second' => false,
'units' => 'metric', 'units' => 'metric',
@ -99,7 +107,6 @@ class ActivityManager
'overwrite_with_dev_data' => false 'overwrite_with_dev_data' => false
]; ];
} }
// Ouverture du fichier FIT // Ouverture du fichier FIT
if (!($monFichierFit = new phpFITFileAnalysis($file_path_or_data, $options))) { if (!($monFichierFit = new phpFITFileAnalysis($file_path_or_data, $options))) {
throw new Exception("Problème lors de l'ouverture du fichier FIT"); throw new Exception("Problème lors de l'ouverture du fichier FIT");
@ -150,11 +157,13 @@ class ActivityManager
$averageTemperature, $averageTemperature,
$isPaused $isPaused
); );
// $this->dataManager->activityRepository->add($newActivity);
if ($this->saveFitFileToJSON($monFichierFit)){
// Ajout de l'activité et enregistrement du fichier FIT en JSON // Ajout de l'activité et enregistrement du fichier FIT en JSON
if ($this->authService->getCurrentUser()->getRole()->addActivity($newActivity) && $this->saveFitFileToJSON($monFichierFit)) { if ($this->authService->getCurrentUser()->getRole()->addActivity($newActivity)) {
return true; return true;
} }
}
} catch (\Exception $e) { } catch (\Exception $e) {
echo $e; echo $e;
} }

@ -11,6 +11,7 @@ abstract class DataManager {
public IRelationshipRequestRepository $relationshipRequestRepository; public IRelationshipRequestRepository $relationshipRequestRepository;
public ITrainingRepository $trainingRepository; public ITrainingRepository $trainingRepository;
public INotificationRepository $notificationRepository; public INotificationRepository $notificationRepository;
public IActivityRepository $activityRepository;
} }
?> ?>

@ -1,5 +1,7 @@
<?php <?php
namespace Stub; namespace Stub;
use Model\Athlete; use Model\Athlete;
use Model\CoachAthlete; use Model\CoachAthlete;
@ -8,30 +10,37 @@ use Repository\IUserRepository;
use Shared\Exception\NotImplementedException; use Shared\Exception\NotImplementedException;
use Network\IAuthService; use Network\IAuthService;
use Shared\IHashPassword; use Shared\IHashPassword;
use Shared\Log;
use Stub\UserRepository; use Stub\UserRepository;
class AuthService implements IAuthService {
class AuthService implements IAuthService
{
private IUserRepository $userRepository; private IUserRepository $userRepository;
private IHashPassword $passwordHacher; private IHashPassword $passwordHacher;
private ?User $currentUser; private ?User $currentUser;
public function __construct(UserRepository $userRepository, IHashPassword $passwordHacher) { public function __construct(UserRepository $userRepository, IHashPassword $passwordHacher)
{
$this->userRepository = $userRepository; $this->userRepository = $userRepository;
$this->passwordHacher = $passwordHacher; $this->passwordHacher = $passwordHacher;
} }
public function login(string $emailUser,string $password): bool { public function login(string $emailUser, string $password): bool
{
$user = $this->userRepository->getItemByEmail($emailUser); $user = $this->userRepository->getItemByEmail($emailUser);
if (!$user instanceof User) { if (!$user instanceof User) {
throw new \Exception('Unable to find user with that name'); throw new \Exception('Unable to find user with that name');
} }
if ($user->isValidPassword($password)) { if (!$this->passwordHacher->isPasswordValid($user->getMotDePasse(), $password)) {
return false;
}
$this->currentUser = $user; $this->currentUser = $user;
return true; return true;
}
return false;
} }
public function register(string $username, string $password, $data): bool public function register(string $username, string $password, $data): bool
{ {
@ -55,8 +64,7 @@ class AuthService implements IAuthService {
$role = null; $role = null;
if ($roleName == "Coach") { if ($roleName == "Coach") {
$role = new CoachAthlete(); $role = new CoachAthlete();
} } else if ($roleName == "Athlete") {
else if($roleName == "Athlete"){
$role = new Athlete(); $role = new Athlete();
} }
$user = new User( $user = new User(

Loading…
Cancel
Save