# Fullstack demo : Symfony + Nuxt + Caddy

This project is a full-stack web application demonstrating the integration of modern web technologies through a 
Docker Compose setup. 

It serves as both a proof of concept and a starter template for developers looking to work with this particular 
technology stack.

The backend is built with [Symfony 7](https://symfony.com/) and [API Platform 4](https://api-platform.com/). 
The frontend uses [Nuxt.js 3](https://nuxt.com/) with [Vuetify](https://vuetifyjs.com/en) components and [TypeScript](https://www.typescriptlang.org/).
The entire application is served through [Caddy](https://caddyserver.com/) web server, offering automatic HTTPS.
Enjoy!

## Install

Choose a domain's name for your project (project default: 'snc-demo.net'), then 
add those lines to your [hosts](https://linuxize.com/post/how-to-edit-your-hosts-file/) file :

    127.0.0.1 local.api.<domain>.fr
    127.0.0.1 local.app.<domain>.fr

Run from the project directory :

    docker-compose build

Copy the .env file and edit it if needed :

    cp .env.skeleton .env

Edit the following files to update the directives with you domain name 

* docker/api/vhost.conf
* docker/caddy/Caddyfile
* api/.env
* app/.env

## Run

Run from the project directory :

    docker-compose up

Install the API server : 

    docker exec -it snc_demo_api bash
    composer install --with-all-dependencies
    bin/console doctrine:database:create
    bin/console doctrine:schema:update --force

Start the nuxt server:

    docker exec -it snc_demo_app bash
    yarn install
    yarn dev

> **Warning**: You will probably have to open a tab for both of the subdomains (`local.api.<domain>.net` and 
>          `local.api.<domain>.net`) in your browser to add a security exception for the self-signed SSL certificate.
> Without it, the frontend's requests will be blocked as CORS errors.


## Add Fixtures

    docker exec -it snc_demo_db bash

    mysql -u root -p'Hxb3aMXUPb3m%$Ai*' -D snc_demo -e "
        ALTER TABLE `snc_demo`.`author` AUTO_INCREMENT = 1;
        INSERT INTO `snc_demo`.`author` (`name`)
        VALUES 
            ('Artist 1'),
            ('Artist 2'),
            ('Artist 3');
    
        ALTER TABLE `snc_demo`.`song` AUTO_INCREMENT = 1;
        INSERT INTO `snc_demo`.`song` (`title`, `author_id`)
        VALUES
            ('Song A', 1),
            ('Song B', 1),
            ('Song C', 1),
            ('Song D', 2),
            ('Song E', 2),
            ('Song F', 3),
            ('Song G', 3);
    "

> Warning : If you plan to use this as a starter for your own project, don't forget to change the 
> DB password !


## Try it

At this point, the application should be served at https://local.app.snc-demo.fr/.


## Accessing the OpenAPI Interface

The OpenAPI interface is available at:

```
https://local.api.snc-demo.net/api/docs
```

This interface provides documentation for all available API routes.
