{"id":21289850,"url":"https://github.com/fapi-cz/fapi-member","last_synced_at":"2026-01-06T21:09:43.616Z","repository":{"id":37398595,"uuid":"411629991","full_name":"fapi-cz/fapi-member","owner":"fapi-cz","description":null,"archived":false,"fork":false,"pushed_at":"2024-05-28T11:55:12.000Z","size":2548,"stargazers_count":0,"open_issues_count":19,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-05-29T03:21:29.026Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fapi-cz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-09-29T10:31:24.000Z","updated_at":"2024-05-30T12:48:39.492Z","dependencies_parsed_at":"2024-02-18T18:26:16.917Z","dependency_job_id":"cfd3d497-166a-4d80-a36b-c30115180caf","html_url":"https://github.com/fapi-cz/fapi-member","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fapi-cz%2Ffapi-member","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fapi-cz%2Ffapi-member/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fapi-cz%2Ffapi-member/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fapi-cz%2Ffapi-member/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fapi-cz","download_url":"https://codeload.github.com/fapi-cz/fapi-member/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245650459,"owners_count":20650105,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-21T12:43:31.840Z","updated_at":"2026-01-06T21:09:43.604Z","avatar_url":"https://github.com/fapi-cz.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Start up:\n1. run `make -C .docker-fapi-member dc-up-front`   (pro macbook si doplnit do docker-compose.yml k db: platform: linux/x86_64)\n\n2. open browser and go to page `http://localhost:8080`\n3. install wordpress\n4. enable FAPI Member plugin in plugin section\n5. develop plugin\n\nPoznámky\n========\n\n## Vývoj\n\n### Původní vývoj\n\nPlugin kód není moc pěkný, ale snažil jsem se maximálně využit Wordpressu a\nnestavět vedle WP nějaké další (cizí) struktury a způsoby (autoloading, šablony...), \nkteré by ale pro větší projekt určitě byly potřeba.\n\nObzvláště nehezké jsou věci kolem reakce na callback a posílání mailů.\nUvažoval jsem nad možností to přepsat, ale zase jsem se neodvážil dělat \nabstrakce a předjímat něco, protože myslím, že maily (pravidla, počet...) se určitě \nbudou měnit a ten systém s postupným plněním `$props` je nejpružnější, co mě napadl.\n\nTaky je použita stará verze PHP - protože [WP](https://cs.wordpress.org/about/requirements/) \nzatím podporuje PHP 5.6.20\n\n### Refactoring back-endu (2024)\n\nCelý backend aplikace byl předělán. Až na některé vyjímky byla zachována struktura ukládaných dat,\nale celá aplikace byla předělána do OOP. Bylo zjednodušeno zasílání e-mailů, \nkdy je již pro nahrazení zástupných symbolů potřeba znát pouze stav původního členství a nového členství.\n\n### Refactoring front-endu (2024)\n\nByly zahozeny php šablony a celý front-end byl předělán do reactu. Byla vytvořena nová verze API (v2),\nkterá je používána při komunikaci s front-endem. API v2 je momentálně pouze interní a není možné na ni posílat dotazy z jiných webů.\n\n## Datové struktury\n\nPlugin nedělá zásah do DB.\n\n### Členství\n\nČlenství je uloženo jako meta k uživateli pod klíčem v `FapiMembershipLoader::MEMBERSHIP_META_KEY`.\nStruktura je následující:\n~~~json\n[\n  {\n    \"level\":  12, \n    \"registered\": \"2020-01-01T20:00:01\", \n    \"until\": \"2020-01-01T20:00:01\",\n    \"isUnlimited\": true\n  },\n  {\n      \"level\":  10, \n      \"registered\": \"2020-02-01T20:00:01\", \n      \"until\": \"2020-04-01T20:00:01\",\n      \"isUnlimited\": false\n  }    \n]\n~~~\n\n### Historie členství\n\nHistorie členství je uložena jako user meta po klíčem v `FapiMembershipLoader::MEMBERSHIP_HISTORY_META_KEY`.\nUkládá se pole serializovaných FapiMembership objektů.\n\n### Úrovně\n\nÚrovně jsou uloženy jako neveřejná taxonomie s názvem v `FapiLevels::TAXONOMY`.\n\n### Nastavení úrovně\n\nÚroveň má své stránky, nastavení emailů a ostatních stránek uloženo v \nterm meta: `fapi_pages`, `fapi_email_*`, `fapi_page_*`\n\n### Globální nastavení\n\nPlugin si ukládá data i do options: `fapiMemberApiChecked`, `fapiSettings`, `fapiMemberApiKey`, `fapiMemberApiEmail`\n\n## API a callback\n\nVětšinou publikované routy fungují jen s url rewritingem, tyhle ošklivé níže\nby měly být univerzálnější.\n\n### URL pro definované sekce a úrovně\n~~~\n[site]/?rest_route=/fapi/v1/sections\n~~~\n\n### Callback url\n\n~~~\n[site]/?rest_route=/fapi/v1/callback\u0026level[]=1\u0026level[]=2\u0026days=31\n~~~\nV těle požadavku očekávám url encoded string jako:\n~~~\nid=187034262\u0026time=1614239639\u0026security=9edbc14e1905b61af468217f60d2406d160c4fdf\n~~~\nkde `id` použiju na načtení objednávky, `time` a `security` pro validaci \n\n#### Chybové kódy\n\nCallback vrací při chybě status code `400` a chybový text, jsou \"ošetřeny\" následující stavy:\n\n- Nepodařilo se načíst invoice/voucher z API\n- Voucher status není `applied`\n- Nelze najít email zákazníka v API response\n- V get parametrech callbacku chybý proměnná `level`\n- Některá sekce/úroveň z callbacku neexistuje ve WordPressu\n- Invoice / voucher security hash nesedí\n- a další\n\n## Odinstalace pluginu\n\nPlugin při deaktivaci nedělá nic. Při smazání pluginu před administraci WP se:\n - odebere taxonomie\n - odeberou options\n - odeberou user_meta všech uživatelů \n \n## Transpilace JS a CSS\n \nCss je zapsáno v scss (https://sass-lang.com/documentation/cli/dart-sass), pro kompilaci do css:\n~~~\nnpm run css\n~~~\n\nJavascript je transpilován webpackem, pro kompilaci po úpravách:\n~~~\nnpx webpack\n~~~\n\n## Build Reactu pro Divi / fix node_modules\n- `make divi-build`\n\n- Pokud nemáte stažené node_modules - fix\n  - `cd src/Divi`\n  - (`nvm install 14`)\n  - `nvm use 14`\n  - `npm install`\n  - `cd node_modules/divi-scripts`\n  - `npm install --save-dev webpack@3.10.0`\n  - jít do souboru /fapi-member/src/Divi/node_modules/divi-scripts/scripts/utils/verifyPackageTree.js\n  - pod řádek 18 přidat `return;`\n  - `nvm use 22` Nebo jinou verzi, kterou používáte\n\n## Testovací akce\n\nPokud ve `wp_options` nastavíte klíč `fapiIsDevelopment` na hodnotu `1`, pak se\nv menu pluginu objeví červená možnost Testovací akce, která umožní spustit obsah souboru `templates/test.php`,\nto je možné využít při vývoji na testování např. zakládání uživatelů, posílání mailů atd.\n\n# Překlady\n\nTest funkčnosti CLI:\nMusí přejít do složky s docker-compose.yml\n\n    docker compose run --rm wpcli core version\n\n1. Vygeneruje POT file. Tedy seznam všech překladových řetezců.\n```\ndocker compose run --rm -e WP_CLI_PHP_ARGS='-d memory_limit=768M' wpcli \\\n    i18n make-pot \\\n        wp-content/plugins/fapi-member \\\n        wp-content/plugins/fapi-member/languages/fapi-member.pot \\\n        --domain=fapi-member \\\n        --exclude=\"node_modules,build,dist,vendor,*.min.js,assets/js/vendor,wp-build,wp-svn,wp-build-test\"\n```\n\n2. Pokud již máš existující .po soubory a chceš je pouze aktualizovat (zachovat původní překlady a doplnit nové řetězce):\n```\nfor lang in cs_CZ en_US es_ES sk_SK hr_HR hu_HU de_DE vi_VN pl_PL ro_RO ru_RU it_IT pt_PT fr_FR zh_CN sl_SI; do\n  msgmerge --update --no-fuzzy-matching --backup=none fapi-member-$lang.po fapi-member.pot\ndone\n```\n\n3. BUILD překladů, vygenerování MO souborů, které se v produkci používají pro překlady\n```\nfor lang in *.po; do\n  msgfmt $lang -o \"${lang%.po}.mo\"\ndone\n```\n\n4. Vygeneruje JSON soubory pro React/JS překlady. Nejdřív smaže všechny existující JSON soubory a pak vygeneruje nové.\n```    \nrm -f languages/*.json\ncd .docker-fapi-member\ndocker compose run --rm -w /var/www/html/wp-content/plugins/fapi-member wpcli \\\n    i18n make-json languages --no-purge\n```\n\n# Build a nasazení na WP\n## POUZE POKUD VÍŠ CO DĚLÁŠ\nKoukni na: https://youtu.be/ypv-TVbMtcs\n1. Prvně si udělat rebase s origin/master - poté pokračuj viz níže\n2. Připravit deploy `make prepare-deploy version=x.x.x` (Pokud nemám nainstalované svn, tak první `brew install subversion`)\n3. zkontrolovat verzi v souborech\n    1. zkontrolovat `fapi-member.php`' - všude kde je uvedena verze\n    2. zkontrolovat`readme.txt` - všude kde je uvedena verze a napsat changelog\n4. Případně otestovat aplikační build na živém webu\n   1. Po `prepare-deploy` se vytvoří složka `wp-build-test` se zipem produkčního buildu aplikace\n   2. Nahrát soubor na živou verzi WordPressu a otestovat, jestli vše funguje\n5. Otevřít složku wp-svn `cd wp-svn`\n6. Dát do stavu track `svn add --force * --auto-props --parents --depth infinity -q`\n7. A vše commitnout do WP `svn ci -m '{Message s update zprávou}' --username fapi --password '{your_password}'`\n8. Následně vše commitnout do Githubu!!!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffapi-cz%2Ffapi-member","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffapi-cz%2Ffapi-member","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffapi-cz%2Ffapi-member/lists"}