Update documentation #8

Merged
Sieciech merged 3 commits from 6-update-documentation into dev 2021-07-23 18:05:10 +00:00
26 changed files with 10682 additions and 10072 deletions
Showing only changes of commit 42af60cfc8 - Show all commits

36
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,36 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "PHP 8.0",
"type": "php",
"request": "launch",
"pathMappings": {
"/web/backend": "${workspaceFolder}\\src\\backend"
},
"skipFiles": [
"${workspaceFolder}/src/backend/vendor/",
"/web/backend/vendor/"
],
"port": 7780,
"hostname": "127.0.0.1",
"xdebugSettings": {
"max_children": 100,
}
},
{
"name": "PHP 8.0 with vendor",
"type": "php",
"request": "launch",
"pathMappings": {
"/web/backend": "${workspaceFolder}\\src\\backend"
},
"port": 7780,
"hostname": "127.0.0.1",
"xdebugSettings": {
"max_children": 100,
}
}
]
}

4
docker/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
logs/*
!logs/.gitkeep
cache/*/*
!cache/*/.gitkeep

50
docker/Dockerfile Normal file
View File

@ -0,0 +1,50 @@
FROM debian:10
RUN apt update \
&& echo "Binary::apt::APT::Keep-Downloaded-Packages \"true\";" | tee /etc/apt/apt.conf.d/01keep-debs \
&& apt install -y wget lsb-release ca-certificates apt-transport-https software-properties-common gnupg2 gcc g++ make \
&& echo "configure repos" \
&& echo "deb https://packages.sury.org/php/ buster main" | tee /etc/apt/sources.list.d/php.list \
&& echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" | tee /etc/apt/sources.list.d/postgresql.list \
&& echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/buster pgadmin4 main" | tee /etc/apt/sources.list.d/pgdg.list \
&& echo "download keys" \
&& (wget -qO - https://packages.sury.org/php/apt.gpg | apt-key add - ) \
&& (wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - ) \
&& (wget -qO - https://www.pgadmin.org/static/packages_pgadmin_org.pub | apt-key add - ) \
&& echo "install nodejs" \
&& wget -qO - https://deb.nodesource.com/setup_16.x | bash - \
&& echo "update repos" \
&& apt update \
&& echo "install software" \
&& apt install -y aptitude unzip \
&& apt install -y postgresql pgadmin4 \
&& apt install -y php8.0 php8.0-ctype php8.0-iconv php8.0-simplexml php8.0-tokenizer php8.0-fpm php8.0-pdo php8.0-pdo-pgsql php8.0-pgsql php8.0-mbstring php8.0-zip php8.0-xdebug \
&& apt install -y nginx \
&& apt install -y nodejs \
&& echo "configure tools" \
&& echo "# angular" \
&& npm install -g @angular/cli \
&& echo "# composer" \
&& php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php composer-setup.php --install-dir=/usr/local/bin/ --filename=composer \
&& php -r "unlink('composer-setup.php');" \
&& echo "# nginx" \
&& ln -s /web/config/nginx/app.conf /etc/nginx/conf.d/app.conf \
&& ln -s /web/config/nginx/php80.conf /etc/nginx/php80.conf \
&& echo "# postgresql" \
&& echo "postgres:WeryStronkPaz2" | chpasswd \
&& echo "# pgadmin4" \
&& bash -c 'PGADMIN_SETUP_EMAIL="admin@pgadmin.localhost" PGADMIN_SETUP_PASSWORD="WeryStronkPaz2" /usr/pgadmin4/bin/setup-web.sh --yes' \
&& echo "" > /etc/nginx/sites-enabled/default \
&& echo "!!! DONE !!!"
RUN apt install -y nano openssh-server telnet
VOLUME /web/backend/vendor
VOLUME /web/backend/var
VOLUME /web/frontend/node_modules
EXPOSE 7700 7780 7781
STOPSIGNAL SIGQUIT
CMD ["bash", "/web/config/startup.sh"]

0
docker/cache/.gitkeep vendored Normal file
View File

0
docker/cache/apt/.gitkeep vendored Normal file
View File

0
docker/cache/postgres/.gitkeep vendored Normal file
View File

22
docker/docker-compose.yml Normal file
View File

@ -0,0 +1,22 @@
version: "3.9"
services:
app:
build: .
ports:
- 7700:7700
expose:
- 7780:7780
- 7781:7781
volumes:
- .:/web/config
- ../src/backend:/web/backend:cached
- ../src/frontend:/web/frontend:cached
- ./logs:/var/log
- vendor:/web/backend/vendor
- var:/web/backend/var
- nodemodules:/web/frontend/node_modules
volumes:
nodemodules:
vendor:
var:
nodemodules:

0
docker/logs/.gitkeep Normal file
View File

27
docker/nginx/app.conf Normal file
View File

@ -0,0 +1,27 @@
server {
server_name localhost;
listen 7700;
root /web/backend/public;
index index.htm index.html index.php;
location / {
proxy_bind 127.0.0.1;
proxy_pass http://localhost:4200;
}
location /api/ {
try_files $uri $uri/ /index.php/$uri?$query_string;
}
location /coverage/ {
alias /web/coverage/html-coverage/;
index index.html;
}
location /pgadmin4/ {
include proxy_params;
proxy_bind 127.0.0.1;
proxy_pass http://localhost:80;
proxy_set_header X-Script-Name /pgadmin4;
}
proxy_intercept_errors on;
fastcgi_intercept_errors on;
fastcgi_hide_header X-Powered-By;
include "php80.conf";
}

14
docker/nginx/php80.conf Normal file
View File

@ -0,0 +1,14 @@
index index.php index.html index.htm;
include snippets/fastcgi-php.conf;
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_param HTTP_PROXY "";
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_buffering off;
}

View File

@ -0,0 +1,12 @@
zend_extension=xdebug.so
[xdebug]
xdebug.mode=coverage
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=7781
xdebug.show_exception_trace = 1
xdebug.show_error_trace = 1
xdebug.log_level = 0

View File

@ -0,0 +1,12 @@
zend_extension=xdebug.so
[xdebug]
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=7780
xdebug.show_exception_trace = 1
xdebug.show_error_trace = 1
xdebug.log_level = 0

View File

@ -0,0 +1,4 @@
ALTER USER postgres WITH PASSWORD 'WeryStronkPaz2';
CREATE USER curenet WITH PASSWORD 'WeryStronkPaz2';
CREATE DATABASE curenet;
GRANT ALL PRIVILEGES ON DATABASE curenet to curenet;

1
docker/run Normal file
View File

@ -0,0 +1 @@
docker.exe compose -p curenet up

45
docker/startup.sh Normal file
View File

@ -0,0 +1,45 @@
#!/bin/bash
echo "> Configure logs"
mkdir -p /var/log/{apache2,nginx,pgadmin,postgresql}
chown postgres:adm /var/log/postgresql -R
chown root:postgres /var/log/postgresql
echo "> Configure volumes"
[ -e /web/frontend/node_modules ] || ln -s /web/node /web/frontend/node_modules
[ -e /web/backend/var ] || ln -s /web/var /web/backend/var
[ -e /web/backend/vendor ] || ln -s /web/vendor /web/backend/vendor
echo "> Starting php8.0-fpm server"
[ -e /etc/php/8.0/fpm/conf.d/20-xdebug.ini ] && rm /etc/php/8.0/fpm/conf.d/20-xdebug.ini || echo OK
[ -e /etc/php/8.0/cli/conf.d/20-xdebug.ini ] && rm /etc/php/8.0/cli/conf.d/20-xdebug.ini || echo OK
cp /web/config/php8.0/xdebug-fpm.ini /etc/php/8.0/fpm/conf.d/20-xdebug.ini
cp /web/config/php8.0/xdebug-cli.ini /etc/php/8.0/cli/conf.d/20-xdebug.ini
service php8.0-fpm start
echo "> Starting nginx server"
service nginx start
echo "> Starting apache2 server for pgAdmin4"
service apache2 start
echo "> Starting postgresql database"
service postgresql start
echo "> Starting ssh server"
service ssh start
echo "> Configure database"
su postgres -c psql postgres < /web/config/postgres/init-data.sql
echo "> Configure symfony"
cd /web/backend
composer install
php bin/console doctrine:schema:update --force
echo "> Configure angular"
cd /web/frontend
npm ci
echo "> Starting angular"
ng serve

3
src/backend/.env.beta Normal file
View File

@ -0,0 +1,3 @@
APP_ENV=dev
APP_SECRET=0fc8d6b67b9f1100b3eb3e3c80d36fda
DATABASE_URL="postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=13&charset=utf8"

3
src/backend/.env.dev Normal file
View File

@ -0,0 +1,3 @@
APP_ENV=dev
APP_SECRET=0fc8d6b67b9f1100b3eb3e3c80d36fda
DATABASE_URL="postgresql://curenet:WeryStronkPaz2@127.0.0.1:5432/curenet?serverVersion=13&charset=utf8"

3
src/backend/.env.prod Normal file
View File

@ -0,0 +1,3 @@
APP_ENV=dev
APP_SECRET=0fc8d6b67b9f1100b3eb3e3c80d36fda
DATABASE_URL="postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=13&charset=utf8"

View File

@ -48,7 +48,7 @@
"symfony/browser-kit": "^5.3",
"symfony/css-selector": "^5.3",
"symfony/debug-bundle": "^5.3",
"symfony/maker-bundle": "^1.0",
"symfony/maker-bundle": "^1.33",
"symfony/phpunit-bridge": "^5.3",
"symfony/stopwatch": "^5.3",
"symfony/var-dumper": "^5.3",

View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "05166d01e6bf577938523c038634225a",
"content-hash": "e3fa1ece831d58dd0515e0413472408f",
"packages": [
{
"name": "composer/package-versions-deprecated",

View File

@ -1,16 +1,28 @@
security:
# https://symfony.com/doc/current/security/experimental_authenticators.html
enable_authenticator_manager: true
password_hashers:
App\Entity\User:
algorithm: auto
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
users_in_memory: { memory: null }
# used to reload user from session & other features (e.g. switch_user)
app_user_provider:
entity:
class: App\Entity\User
property: id
# used to reload user from session & other features (e.g. switch_user)
# used to reload user from session & other features (e.g. switch_user)
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
lazy: true
provider: users_in_memory
provider: app_user_provider
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#firewalls-authentication

View File

@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20210723170329 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE SEQUENCE "user_id_seq" INCREMENT BY 1 MINVALUE 1 START 1');
$this->addSql('CREATE TABLE "user" (id INT NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE SCHEMA public');
$this->addSql('DROP SEQUENCE "user_id_seq" CASCADE');
$this->addSql('DROP TABLE "user"');
}
}

View File

@ -0,0 +1,42 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20210723171757 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE "user" ADD email VARCHAR(255) NOT NULL');
$this->addSql('ALTER TABLE "user" ADD name VARCHAR(255) NOT NULL');
$this->addSql('ALTER TABLE "user" ADD surname VARCHAR(255) NOT NULL');
$this->addSql('ALTER TABLE "user" ADD avatar VARCHAR(255) DEFAULT NULL');
$this->addSql('ALTER TABLE "user" ADD country VARCHAR(3) DEFAULT NULL');
$this->addSql('ALTER TABLE "user" ADD state VARCHAR(10) DEFAULT NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE SCHEMA public');
$this->addSql('ALTER TABLE "user" DROP email');
$this->addSql('ALTER TABLE "user" DROP name');
$this->addSql('ALTER TABLE "user" DROP surname');
$this->addSql('ALTER TABLE "user" DROP avatar');
$this->addSql('ALTER TABLE "user" DROP country');
$this->addSql('ALTER TABLE "user" DROP state');
}
}

View File

@ -0,0 +1,219 @@
<?php
namespace App\Entity;
use App\Repository\UserRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* @ORM\Entity(repositoryClass=UserRepository::class)
* @ORM\Table(name="`user`")
*/
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="json")
*/
private $roles = [];
/**
* @var string The hashed password
* @ORM\Column(type="string")
*/
private $password;
/**
* @ORM\Column(type="string", length=255)
*/
private $email;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\Column(type="string", length=255)
*/
private $surname;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $avatar;
/**
* @ORM\Column(type="string", length=3, nullable=true)
*/
private $country;
/**
* @ORM\Column(type="string", length=10, nullable=true)
*/
private $state;
public function getId(): ?string
{
return $this->id;
}
public function setId(string $id): self
{
$this->id = $id;
return $this;
}
/**
* A visual identifier that represents this user.
*
* @see UserInterface
*/
public function getUserIdentifier(): string
{
return (string) $this->id;
}
/**
* @deprecated since Symfony 5.3, use getUserIdentifier instead
*/
public function getUsername(): string
{
return (string) $this->id;
}
/**
* @see UserInterface
*/
public function getRoles(): array
{
$roles = $this->roles;
// guarantee every user at least has ROLE_USER
$roles[] = 'ROLE_USER';
return array_unique($roles);
}
public function setRoles(array $roles): self
{
$this->roles = $roles;
return $this;
}
/**
* @see PasswordAuthenticatedUserInterface
*/
public function getPassword(): string
{
return $this->password;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
/**
* Returning a salt is only needed, if you are not using a modern
* hashing algorithm (e.g. bcrypt or sodium) in your security.yaml.
*
* @see UserInterface
*/
public function getSalt(): ?string
{
return null;
}
/**
* @see UserInterface
*/
public function eraseCredentials()
{
// If you store any temporary, sensitive data on the user, clear it here
// $this->plainPassword = null;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): self
{
$this->email = $email;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getSurname(): ?string
{
return $this->surname;
}
public function setSurname(string $surname): self
{
$this->surname = $surname;
return $this;
}
public function getAvatar(): ?string
{
return $this->avatar;
}
public function setAvatar(?string $avatar): self
{
$this->avatar = $avatar;
return $this;
}
public function getCountry(): ?string
{
return $this->country;
}
public function setCountry(?string $country): self
{
$this->country = $country;
return $this;
}
public function getState(): ?string
{
return $this->state;
}
public function setState(?string $state): self
{
$this->state = $state;
return $this;
}
}

View File

@ -0,0 +1,67 @@
<?php
namespace App\Repository;
use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
/**
* @method User|null find($id, $lockMode = null, $lockVersion = null)
* @method User|null findOneBy(array $criteria, array $orderBy = null)
* @method User[] findAll()
* @method User[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class UserRepository extends ServiceEntityRepository implements PasswordUpgraderInterface
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, User::class);
}
/**
* Used to upgrade (rehash) the user's password automatically over time.
*/
public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $newHashedPassword): void
{
if (!$user instanceof User) {
throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', \get_class($user)));
}
$user->setPassword($newHashedPassword);
$this->_em->persist($user);
$this->_em->flush();
}
// /**
// * @return User[] Returns an array of User objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('u')
->andWhere('u.exampleField = :val')
->setParameter('val', $value)
->orderBy('u.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
/*
public function findOneBySomeField($value): ?User
{
return $this->createQueryBuilder('u')
->andWhere('u.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}

View File

@ -38,7 +38,7 @@
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/frontend",
"outputPath": "dist",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",