# Photogram

## Stack

### Futtatási környezet

- PHP 7.4+ (majd később lesz 8 is, ha a szerveren frissítettük a PHP-t)
- MySQL 8.0+

apache modulok:
mod_rewrite
mod_headers

A mysql.conf-ba:

```
[mysqld]
wait_timeout = 86500
interactive_timeout = 86500
```

A cron miatt kell, mert a redis syncprice nem fut le.

### Backend

- Codeigniter 4.0.3 - https://codeigniter.com/user_guide/index.html
- Carbon 2.46 - https://carbon.nesbot.com/docs/
- Twig 3.0 - https://twig.symfony.com/doc/3.x/
- Shovel - https://github.com/meszaros-lajos-gyorgy/shovel

### Frontend

- Bootstrap 4.0.0 - https://getbootstrap.com/docs/4.0/getting-started/introduction/
- Fontawesome 5.15.2 (free) - https://fontawesome.com/icons?d=gallery
- Animate CSS 3.5.1 - https://animate.style/
- Ramda 0.27.0 - https://ramdajs.com/docs/
- Ramda Adjunct 2.30.0 - https://char0n.github.io/ramda-adjunct/2.30.0/
- Datepicker 1.0.9 - https://fengyuanchen.github.io/datepicker
- Slim Image Cropper - https://pqina.nl/slim/
- Popper JS 1.14.3 - https://popper.js.org/docs/v1/
- QRCode - https://davidshimjs.github.io/qrcodejs/
- React 17.0.1 - https://reactjs.org/

Font-ok:

- OpenSans (normal(400), semibold(600) és bold(700))

Egyéb:

- ország zászlók - https://www.countryflags.io/

### TODO-k

- volt már, hogy nem ment a countryflags.io, saját host-olt megoldás kéne. potenciális alternatíva: https://github.com/hampusborgos/country-flags
- frontend oldalon teljesen átállni import/export-ra

## Koncepciók

### MVC helyett

> Model <- Library <- Controller <- View

A Model és Controller közé beékelődik egy stateless, statikus metódusokat és konstansokat tartalmazó Library réteg

A state a Controller-ben van kezelve, viszont ideális esetben a Model-hez nincs hozzáférése, csak Library-kat hívogathat

### Képek

A `User::get()` és hasonló függvények, amelyek lekérnek adatokat DB-ből csak a file nevét adják vissza, ahogy az a DB-ben tárolva van

A Controller-ek dolga az, hogy az igényeknek megfelelően a web-es linket kérjék le a képhez, vagy a fájl fizikai útvonalát.

A View-k és API végpontok viszont arra számítanak, hogy ő nekik már semmi dolguk nincs az útvonalakkal

## További információ

[api dokumentáció](docs/api/index.md)

[fejlesztői eszközök](docs/tools.md)

[referral debug-olás](docs/referral-debug.md)

[custom event-ek a rendszerben](docs/eventbus.md)

## Hasznos linkek:

- https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-2
- https://samnewman.io/patterns/architectural/bff/
- https://react-redux.js.org/api/hooks

## Egyéb infók:

### Fordítások

A magyar nyelvnél a felhasználót magázzuk

### Google Translate service

A google translate-es fordítás csak HTTPS-en kiszolgált oldalakon működik, lokálisan identity-ként működik.

### Tron wallet cím generálása:

https://iancoleman.io/bip39/

generate random mnemonicnál a szavak számát át kell írni 12-re és a Coin-nál Tron-t (TRX) kell kiválasztani

generate gomb

utána a lenti táblázat address oszlopából bármi jöhet

egy pár minta address teszteléshez:

```
TA7APJeWXfwTdNu6FZUUFpof7qrCmBKTEp
TTQ4o97uE3uSktKfVV7HEW74k9iknoZYKJ
TYgPg6W9prmXKigNRuYZfYKCAtHRawX92B
```

### vscode

Le kell tiltani az alap PHP validációt, hagyni kell, hogy a prettier csinálja, meg az intelliphense:

Beállításoknál:

```
php.validate.enable = false
```

Ezek a kiegészítők kellenek a fejlesztéshez:

- bmewburn.vscode-intelephense-client
- esbenp.prettier-vscode

Az intelephense-nél a kiegészítő beállításai között be kell állítani a PHP verziót, egyelőre 7.4, aztán majd lesz 8.0

```
intelephense.environment.phpVersion = '7.4'
```

## Admin > Dev menü belépési adatok

(adminként is be kell lépve lenni, nem elég a basic auth)

felhasználónév: isten
jelszó: 1q2w3e4r5

## Élesítés

### dev oldal (https://dev.photogram2020.com)

1. legyen minden felpush-olva `development` branch-re
2. lépj be a szerverre ssh-val
3. `sudo -s`
4. `cd /var/www/html/dev_photogram/photogram-web`
5. `sh scripts/ci/update-dev.sh` (kérni fogja a bitbucket-en használt felhasználónevet és jelszót)

### éles oldal (https://photogram2020.com)

1. legyen minden felpush-olva `master` branch-re
2. lépj be a szerverre ssh-val
3. `sudo -s`
4. `cd /var/www/html/photogram/`
5. `sh scripts/ci/update.sh` (kérni fogja a bitbucket-en használt felhasználónevet és jelszót)

## Tesztelés

PHPUnit van használva és a tesztek a tests/ mappában találhatóak.

Ez a Youtube lejátszási lista adja az alapját: https://www.youtube.com/playlist?list=PLfdtiltiRHWGXSggf05W-pJbD47-_d8bJ

A tesztek egyszeri futtatásához az alábbi parancsot futtasd:

`composer run-script test`

Ha szeretnéd, hogy a háttérben folyamatosan fusson a parancs és fusson le újra, ha módosítasz a kódon, akkor az alábbi parancsot futtasd:

`composer run-script test:watch`

Ez a tests és app mappát fogja figyelni és ha ott módosul bármilyen php fájl, akkor újra lefut.

---

## Codeigniter faszságok

### model->findColumn üres találathalmazzal

`$model->findColumn('valami')` üres tömb helyett `null`-al tér vissza, ha nincs találat. minden esetben le kell
kezelni null coalesce operátorral:

```php
$results = $model->findColumn('valami') ?? [];
```

### model->update null primaryKey-el

`$model->update($primaryKey, $data)` - ha $primaryKey `null`, akkor minden sort felülír a kód. Érdemes a $primaryKey-t
átnyomni egy `intval`-on, mert az `0`-t csinál a `null`-ból, amivel már biztonságos a kód:

```php
$model->update(intval($primaryKey), $data);
```

---

A fotó részletes oldalon is meg kell oldani, hogy ha a kép már a kosárban van bármilyen módon, akkor ne lehessen megvenni egyik méretet sem.

Plusz ha a sevenuser-es/threeuser-es fotók közül valamelyik a kosárban van már más okból, mint service/sector image, akkor újat sorsolni
## Gyakran ismétlődő kérdések Zolitól

### Milyen képeket vett a user mondjuk az adott service keretén belül?

ha csak 1 service-t vett a user, akkor az ahhoz tartozó képek:

```sql
SELECT whom_userid, cast(json_extract(data, '$.photoid') as unsigned) as photoid FROM `commerce` WHERE `who_userid` = 1216578 AND `status` = 4 and type = 2
```

Ezt még dátum alapján lehet szűrni olyannal, hogy

```sql
and created_at > '2021-09-01'
```

### Az adott fotót hányszor, miként vásárolták meg?

```sql
SELECT * FROM `commerce` where status = 4 and type in (2, 4, 5) and cast(json_extract(data, '$.photoid') as unsigned) = 8275592
```
