Commit 27643fa3 authored by François Agneray's avatar François Agneray
Browse files

Initial commit

parents
Pipeline #923 passed with stages
in 5 minutes and 11 seconds
nbproject/
.vscode/
.idea/
vendor/*
data/
build/*
logs/*
cache
._*
.~lock.*
.buildpath
.DS_Store
.idea
.project
.settings
.phpunit*
anis_v3.sqlite
\ No newline at end of file
stages:
- metrics
- metrics-build
- metrics-deploy
- install
- test
- build
- deploy
variables:
METRICS_IMAGE: portus.lam.fr/anis/anis-v3-server-metrics
CONTAINER_IMAGE: portus.lam.fr/anis/anis-v3-server
php-metrics:
image: jakzal/phpqa
stage: metrics
script:
- phpmetrics --report-html=var/php-metrics .
allow_failure: true
cache:
paths:
- var
policy: push
only:
refs:
- develop
php-metrics-build:
image: docker:stable
stage: metrics-build
script:
- echo "FROM nginx" > var/Dockerfile
- echo "COPY php-metrics /usr/share/nginx/html" >> var/Dockerfile
- docker login -u fagneray -p $PORTUS_TOKEN portus.lam.fr
- docker pull $METRICS_IMAGE:latest || true
- docker build --cache-from $METRICS_IMAGE:latest -t $METRICS_IMAGE:latest var
- docker push $METRICS_IMAGE:latest
allow_failure: true
cache:
paths:
- var
policy: pull
only:
refs:
- develop
php-metrics-deploy:
image: alpine
stage: metrics-deploy
script:
- apk add --update curl
- curl -XPOST $METRICS_WEBHOOK
only:
refs:
- develop
install:
image: jakzal/phpqa
stage: install
script:
- composer install
cache:
paths:
- vendor
policy: push
only:
refs:
- develop
phpunit:
image: jakzal/phpqa
stage: test
script:
- phpdbg -qrr ./vendor/bin/phpunit --bootstrap ./tests/bootstrap.php --whitelist src --coverage-text --colors=never ./tests
cache:
paths:
- vendor
policy: pull
only:
refs:
- develop
build:
image: docker:stable
stage: build
script:
- docker login -u fagneray -p $PORTUS_TOKEN portus.lam.fr
- docker pull $CONTAINER_IMAGE:latest-dev || true
- docker build --cache-from $CONTAINER_IMAGE:latest-dev -t $CONTAINER_IMAGE:latest-dev .
- docker push $CONTAINER_IMAGE:latest-dev
cache:
paths:
- vendor
policy: pull
only:
refs:
- develop
deploy:
image: alpine
stage: deploy
script:
- apk add --update curl
- curl -XPOST $DEV_WEBHOOK
only:
refs:
- develop
\ No newline at end of file
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [3.0.0] - yyyy-mm-dd
### Added
- Pour les nouvelles fonctionnalités.
### Changed
- Pour les changements au sein des fonctionnalités déjà existantes.
### Deprecated
- Pour les fonctionnalités qui seront supprimées dans la prochaine publication.
### Removed
- Pour les anciennes fonctionnalités Deprecated qui viennent d’être supprimées.
### Fixed
- Pour les corrections de bugs.
### Security
- Pour encourager les utilisateurs à mettre à niveau afin d’éviter des failles de sécurité.
FROM php:7.2-apache
# Install modules
RUN apt-get update \
&& apt-get install -y zlib1g zlib1g-dev libpq-dev libpq5 libzip-dev zip unzip \
&& docker-php-ext-install pgsql pdo_pgsql zip
RUN a2enmod rewrite
COPY . /srv/app
COPY ./conf-dev/vhost.conf /etc/apache2/sites-available/000-default.conf
WORKDIR /srv/app
CMD ["apache2-foreground"]
\ No newline at end of file
This diff is collapsed.
UID := $(shell id -u)
GID := $(shell id -g)
list:
@echo ""
@echo "Useful targets:"
@echo ""
@echo " install > install php composer dependancies"
@echo " up > build php image and start anis-v3-server containers for dev only (php + mailer)"
@echo " start > start anis-v3-server containers"
@echo " restart > restart anis-v3-server containers"
@echo " stop > stop and kill running anis-v3-server containers"
@echo " log > display anis-v3-server containers logs"
@echo " debug > shell into php anis-v3-server container"
@echo " phpunit > run php unit test suite"
@echo " phpcs > run php code sniffer test suite"
@echo " init-db > generate a new metadata database (anis-v3-server containers running needed)"
@echo " validate-db > validate the doctrine mapping entity files (anis-v3-server containers running needed)"
@echo ""
install:
@docker run --init -it --rm --user $(UID):$(GID) \
-e COMPOSER_CACHE_DIR=/dev/null \
-v $(CURDIR):/project \
-w /project jakzal/phpqa composer install
up:
@docker-compose up --build -d
start:
@docker-compose up -d
restart: stop start
stop:
@docker-compose kill
@docker-compose rm -v --force
log:
@docker-compose logs -f -t
debug:
@docker-compose run php bash
phpunit:
@docker run --init -it --rm --user $(UID):$(GID) \
-v $(CURDIR):/project \
-w /project jakzal/phpqa phpdbg -qrr ./vendor/bin/phpunit --bootstrap ./tests/bootstrap.php \
--whitelist src --coverage-text --colors=never ./tests
phpcs:
@docker run --init -it --rm --user $(UID):$(GID) \
-v $(CURDIR):/project \
-w /project jakzal/phpqa phpcs --standard=PSR2 --extensions=php -n --colors src
init-db:
@docker-compose run php ./vendor/bin/doctrine orm:schema-tool:create
validate-db:
@docker-compose run php ./vendor/bin/doctrine orm:validate-schema
\ No newline at end of file
# ANIS V3 SERVER
## Introduction
AstroNomical Information System est un outil web générique qui vise à faciliter
la mise à disposition de données (Astrophysiques), accessible depuis
une base de données, à une communauté de scientifiques.
ANIS-V3-SERVER est un composant de ANIS-V3 qui permet de piloter une ou plusieurs
bases de données liées à des projets en astronomie uniquement via des URLS.
ANIS permet de rechercher et visualiser des données à partir de formulaires de
recherche générés automatiquement par l'application. Le scientifique à la
possibilité de visualiser ces données sous la forme d'un tableau HTML interactif,
il à également la possibilité de visualiser des données issues d'images
astronomiques, de spectres ou de fichier FITS.
## Auteurs
* `François Agneray` : Laboratoire d'Astrophysique de Marseille (CNRS)
* `Chrystel Moreau` : Laboratoire d'Astrophysique de Marseille (CNRS)
# Guide d'installation
## Dépendances
Cette application requiert les dépendances suivantes pour fonctionner:
"slim/slim": "^3.8",
"doctrine/orm": "^2.5"
"monolog/monolog": "^1.23",
"lcobucci/jwt": "^3.2",
"swiftmailer/swiftmailer": "^6.0"
Ces dépendances sont installées via le logiciel `composer.phar` et le fichier de
configuration `composer.json` disponible à la racine de l'application.
## Dépendances : installation
Pour lancer l'installation des dépendances, il faut utiliser la commande suivante
à la racine du projet ANIS :
> php composer.phar install
`Composer.phar` va utiliser automatique le fichier `composer.json` pour télécharger
les dépendances et les placer dans le dossier `vendor` à la racine du projet.
## Base de données metamodel : création de la base
Une instance ANIS nécessite une base de données de `metamodel` pour fonctionner.
Commencer par créer une base de données vierge avec un utilisateur en mode lecture
écriture pouvant s'y connecter.
## Base de données metamodel : fichier de configuration
La configuration pour la connexion à la base de données `metamodel` se trouve dans
le fichier `settings.php` dans le dossier `app` du projet.
Le fichier `settings.php` contient un tableau de clé => valeur. Les options de
connexion se trouvent dnas la partie settings => metadata => connection_options.
Mettez les options de connexion correspondant à la base de données `metamodel`
vierge préalablement créée.
## Base de données metamodel: génération des tables
Pour générer les tables de la la base de données `metamodel` qui correspondent aux
fichier `Entity` (voir la doc `Doctrine2` pour plus d'information), il faut utiliser
l'utilitaire en ligne de commande fournit par `Doctrine 2` disponible dans le dossier `vendor` :
> ./vendor/bin/doctrine
Doctrine 2 permet de valider le schéma qui correpond aux fichiers `entity` :
> ./vendor/bin/doctrine orm:validate-schema
Si le schéma est valide, Doctrine 2 permet de générer automatiquement la base de données :
> ./vendor/bin/doctrine orm:schema-tool:create
## Lancement de l'application en mode docker :
Vous pouvez lancer l'application en mode docker gràce au fichier docker-compose.yml se trouvant à la racine du projet.
Pour ce faire vous devez avoir installé docker et docker-compose sur votre machine puis lancer la commande suivante :
> make build
> make start
Le container une fois lancé va rédiriger l'application su le port 8080 de votre machine. Rendez-vous sur l'URL http://localhost:8080 de votre machine pour vous assurez que l'application fonctionne.
## Liens
* `Slim` : [http://www.slimframework.com/](http://www.slimframework.com/)
* `Doctrine 2` : [https://www.doctrine-project.org/](https://www.doctrine-project.org/)
* `Swiftmailer` : [https://swiftmailer.symfony.com/](https://swiftmailer.symfony.com/)
* `Monolog` : [https://seldaek.github.io/monolog/](https://seldaek.github.io/monolog/)
* `Composer` : [https://getcomposer.org/](https://getcomposer.org/)
* `PHP-FIG` : [http://www.php-fig.org/](http://www.php-fig.org/)
* `PHP-Unit` : [http://phpunit.de/](http://phpunit.de/)
* `GIT` : [http://git-scm.com/](http://git-scm.com/)
## Répertoires
* `config`: Répèrtoire qui contient le fichier de configuration nécéssaire pour l'utilitaire doctrine en ligne de commande
* `documentation`: Contient le MCD de la base de données metamodel ainsi que la documentation des URL disponibles
* `public`: Racine du serveur web
* `src`: Code source de l'application
* `test`: Tests de l'application avec `phpunit`
* `vendor`: Dépendances de l'application
## Fichiers clés
* `public/index.php`: Fichier de démarrage de l'application
* `src/settings.php`: Configuration de l'application
* `src/dependencies.php`: Configuration des services disponibles dans Pimple
* `src/middleware.php`: Configuration des middlewares
* `src/routes.php`: Configuration des routes de l'application (URL)
# Guide d'utilisation des URLS
# Vérification du service
* [/](documentation/api/root.md) => `GET`
# Login
Création d'un nouvel utilisateur :
- [/register](documentation/api/register.md) => `POST`
- [/activate-account](documentation/api/activate-account.md) => `GET`
Connexion et récupération d'un jeton d'authentification
- [/login](documentation/api/login.md) => `POST`
Changement de mot de passe
- [/new-password](documentation/api/new-password.md) => `POST`
- [/change-password](documentation/change-password.md) => `POST`
# Pilotage de la base metamodel
La base de données metamodel se pilote via une API REST et fonctionne avec les
méthodes `GET`, `POST`, `PUT` et `DELETE`
* `GET`: Récupération d'un ou plusieurs enregistrements
* `POST`: Ajout d'un enregistrement
* `PUT`: Modification d'un enregistrement
* `DELETE`: Suppression d'un enregistrement
Voici la liste des URLS et méthodes disponibles:
* Information sur les bases de données métiers {name} = nom de la base et {tname} = nom de la table:
- [/metadata/database](documentation/api/database-list.md) => `GET`, `POST`
- [/metadata/database/{name}](documentation/api/database.md) => `GET`, `PUT`, `DELETE`
- [/metadata/database/{name}/table](documentation/api/tables-available.md) => `GET`
* Information sur les projets {name} = nom du projet:
- [/metadata/project](documentation/api/project-list.md) => `GET`, `POST`
- [/metadata/project/{name}](documentation/api/project.md) => `GET`, `PUT`, `DELETE`
* Information sur les jeux de données {name} = nom du dataset:
- [/metadata/dataset](documentation/api/dataset-list.md) => `GET`, `POST`
- [/metadata/dataset/{name}](documentation/api/dataset.md) => `GET`, `PUT`, `DELETE`
- [/metadata/dataset/{name}/file](documentation/api/file-list.md) => `GET`, `POST` (fichiers associés au jeux de données)
- /metadata/dataset/{name}/attribute => `GET`, `PUT` (attributs associés au jeux de données)
- /metadata/dataset/{name}/attribute/option => `GET`
* Information sur un fichier d'un jeu de données {id} = identifiant du fichier
- [/metadata/file/{id}](documentation/api/file.md) => `GET`, `PUT`, `DELETE`
* Information sur une categorie {id} = identifiant de la catégorie
- [/metadata/category](documentation/api/category-list.md) => `GET`, `POST`
- [/metadata/cayegory/{id}](documentation/api/category.md) => `GET`, `PUT`, `DELETE`
* Information sur les groupes d'utilisateur {name} = nom du groupe
- [/metadata/group](documentation/api/group-list.md) => `GET`, `POST`
- [/metadata/group/{id}](documentation/api/group.md) => `GET`, `PUT`, `DELETE`
* Information sur les utilisateurs {login} = login de l'utilisateur
- [/metadata/user](documentation/api/user-list.md) => `GET`, `POST`
- [/metadata/user/{login}](documentation/api/user.md) => `GET`, `PUT`, `DELETE`
# Effectuer une recherche dans un dataset
* URL d'interrogation: /search
* Le paramètre `d` est obligatoire est doit contenir le nom du dataset à interroger
## Recherche par `critères`
* `c`: Le paramètre `c` est un tableau qui contient la liste des critères de
recherche
* Un critère de recherche doit contenir trois paramètres séparés par le caractère `-`
- Le premier paramètre contient l'`id` de l'attribut sur lequel le critère s'applique
- Le deuxième paramètre contient le type de critère sous la forme de deux lettres
- Le troisième paramètre contient les information nécessaires pour la création du critère
* Exemple: c[]=78-bw-102.49334|102.49540
## Liste des `critères` de recherche disponible
* Between (`bw`) :
1. Le troisième paramètre doit contenir les `valeurs` séparés par le caractère `|`
2. Exemple: 78-bw-`102.49334|102.49540`
* Date range (`dr`) paramètres :
1. Le troisième paramètre doit contenir les `dates` séparés par le caractère `|`
* Field (`fd`) paramètres :
1. Le troisième paramètre doit contenir l'`opérateur` et la `valeur` séparés par le caractère `|`
* Combobox (`co`) paramètres :
1. TODO
* Radio (`ra`) paramètre :
1. TODO
* Datalist (`dl`) paramètre :
1. TODO
* Select (`se`) paramètre :
1. TODO
* Checkbox (`ch`) paramètre :
1. TODO
## Recherche par `cone-search`
* Fonction de recherche spatiale
* Paramètres du `cone-search` :
1. `RA`: Ascension droite en degré
2. `DE`: Déclinaison en degré
3. `SR`: Rayon du `cone-search` en arc seconde
## Affichage des `colonnes de sortie`
* Le choix d'affichage des colonnes de sortie s'applique à tous les types de recherche
* `a`: Le paramètre `a` doit contenir une liste d'identifiants d'attribut séparés par un `|`
* Exemple: `a`=1|2|5|8
## `Ordre` d'affichage des enregistrements
* Par défaut les enregistrements sont triés par l'attribut contenant le search_flag `ID`
* Si l'utilisateur veut un ordre d'affichage précis il doit utiliser le paramètre `o` avec
comme valeur l'identifiant d'attribut souhaité ainsi que le sens
* `a` pour ascendant et `d` pour descendant
* Exemple: `o=5-a`
## Choix du `format` de sortie
* Le choix du format de sortie s'applique également à tous les types de recherche
* `f`: Le paramètre `f` doit contenir un format de sortie disponible (`json`,`csv`,`ascii`)
* Si le format `json` est sélectionné les paramètres de pagination sont obligatoires :
- `p[s]`: Contient le nombre d'objets par page
- `p[c]`: Contient le numéro de la page courante
# Guide développeur
# phpunit
* Permet d'éffectuer des tests unitaires sur le code source
> ./vendor/bin/phpunit --bootstrap ./test/bootstrap.php --colors ./test
# phpdoc
* Permet de fabriquer la documentation à partir des sources PHP
`$ php phpDocumentor.phar -d app/ -t ./build/api --ignore *library/*,*tests/*,*utils/*,*build/*,*js/*,*drupal/*,*bin/*`
# phpcpd
* Permet de détecter les copier coller (duplication) dans le code source
`$ ./vendor/bin/phpcpd app/`
# phploc
* Permet de mesurer la taille et d'analyser la structure du code source d'un projet PHP
`$ ./vendor/bin/phploc --progress app/`
# PHP_CodeSniffer
* Permet de valider le code à la norme de codage PSR-2
`$ ./vendor/bin/phpcs --report=full --standard=PSR2 --extensions=php --ignore=*library/*,*tests/*,*utils/*,*build/*,*js/*,*drupal/*,*bin/* ./app`
# PhpMetrics
* Donne des informations statistiques sur un projet PHP
`$ ./vendor/bin/phpmetrics --report-html=./build/phpmetrics.html app/
`
# PHP Mess Detector
* Permet d'évaluer la qualité de code source PHP
`$ ./vendor/bin/phpmd ./app html cleancode,codesize,controversial,design,naming,unusedcode --reportfile ./build/pmd.html --exclude *library/*,*tests/*,*utils/*,*build/*,*js/*,*drupal/*,*bin/*`
3.0.0
\ No newline at end of file
<?php
// File needed by doctrine cli
require 'vendor/autoload.php';
$settings = require './src/settings.php';
$metadata = $settings['settings']['metadata'];
$c = \Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration($metadata['entity_path'], $metadata['dev_mode']);
$c->setProxyDir(getcwd() . '/' . $metadata['path_proxy']);
if ($metadata['dev_mode']) {
$c->setAutoGenerateProxyClasses(true);
} else {
$c->setAutoGenerateProxyClasses(false);
}
$em = \Doctrine\ORM\EntityManager::create($metadata['connection_options'], $c);
$helpers = new Symfony\Component\Console\Helper\HelperSet(array(
'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));
return \Doctrine\ORM\Tools\Console\ConsoleRunner::createHelperSet($em);
{
"name": "cesamsi/anis-v3-server",
"description": "CMS used for astronomical project",
"authors": [
{
"name": "François Agneray",
"email": "francois.agneray@lam.fr"
}
],
"require": {
"slim/slim": "^3.8",
"doctrine/orm": "^2.5",
"monolog/monolog": "^1.23",
"lcobucci/jwt": "^3.2",
"swiftmailer/swiftmailer": "^6.0"
},
"require-dev": {
"phpunit/phpunit": "^7.2",
"phpunit/dbunit": "^4.0"
},
"autoload": {
"psr-4": {
"App\\": "src"
}
}
}
This diff is collapsed.
FROM php:7.2-apache
# Install modules
RUN apt-get update \
&& apt-get install -y zlib1g zlib1g-dev libpq-dev libpq5 libzip-dev zip unzip \
&& docker-php-ext-install pgsql pdo_pgsql zip
# Install pecl modules
RUN pecl install xdebug \
&& rm -rf /tmp/pear
# Install mod_rewrite
RUN a2enmod rewrite
# Create doctrine_proxy folder
RUN mkdir /tmp/doctrine_proxy && chmod 777 /tmp/doctrine_proxy
CMD ["apache2-foreground"]
\ No newline at end of file
display_errors=1
error_reporting=E_ALL
date.timezone=Europe/Paris
[xdebug]
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_port=9900
xdebug.remote_connect_back=1
#xdebug.remote_host=host.docker.internal
xdebug.remote_log=/var/log/xdebug_remote.log
<VirtualHost *:80>
DocumentRoot /srv/app/public
<Directory "/srv/app/public">
Require all granted
RewriteEngine on
RewriteRule ^.+$ index.php [L]
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
\ No newline at end of file
version: '3'
services:
php:
build: conf-dev
working_dir: /srv/app
environment:
docker: "true"