zeppaman / api-farm
ApiFarm Core bundles. User zeppaman/api-farm-skeleton for creating a project
Requires
- php: >=7.2.5
- ext-ctype: *
- ext-iconv: *
- composer/package-versions-deprecated: 1.11.99.1
- doctrine/annotations: ^1.12
- doctrine/doctrine-bundle: ^2.2
- doctrine/orm: ^2.8
- lexik/jwt-authentication-bundle: ^2.11
- mongodb/mongodb: ^1.8
- nyholm/psr7: ^1.4
- phpdocumentor/reflection-docblock: ^5.2
- sensio/framework-extra-bundle: ^5.1
- stagem/php-graphql-scalars: dev-master
- symfony/asset: 5.2.*
- symfony/console: 5.2.*
- symfony/dotenv: 5.2.*
- symfony/expression-language: 5.2.*
- symfony/flex: ^1.3.1
- symfony/form: 5.2.*
- symfony/framework-bundle: 5.2.*
- symfony/http-client: 5.2.*
- symfony/intl: 5.2.*
- symfony/mailer: 5.2.*
- symfony/mime: 5.2.*
- symfony/monolog-bundle: ^3.1
- symfony/notifier: 5.2.*
- symfony/process: 5.2.*
- symfony/property-access: 5.2.*
- symfony/property-info: 5.2.*
- symfony/proxy-manager-bridge: 5.2.*
- symfony/security-bundle: 5.2.*
- symfony/serializer: 5.2.*
- symfony/string: 5.2.*
- symfony/translation: 5.2.*
- symfony/twig-bundle: ^5.2
- symfony/validator: 5.2.*
- symfony/web-link: 5.2.*
- symfony/yaml: 5.2.*
- trikoder/oauth2-bundle: ^3.2
- twig/extra-bundle: ^2.12|^3.0
- twig/twig: ^2.12|^3.0
- webonyx/graphql-php: ^14.5
Requires (Dev)
- symfony/browser-kit: ^5.2
- symfony/css-selector: ^5.2
- symfony/debug-bundle: ^5.2
- symfony/maker-bundle: ^1.0
- symfony/phpunit-bridge: ^5.2
- symfony/stopwatch: ^5.2
- symfony/var-dumper: ^5.2
- symfony/web-profiler-bundle: ^5.2
Conflicts
Replaces
This package is auto-updated.
Last update: 2025-03-19 02:49:48 UTC
README
Api Farm is a low code platform based on Symfony and MongoDB. It support out of the box:
- Data management
- Rest API
- User management
- Oaut2 authentication (as standalone server, or JWT resource server)
- OpenID connect support
- Command line automation
- GrapQL with query and mutations
- Dynamic endpoint generation
Install options
The recommended deployments is to use the skeleton project, by the way you can add this bundle to your app or run this bundle directly.
Using the skeleton
# create a project COMPOSER_MEMORY_LIMIT=-1 composer create-project zeppaman/api-farm my-project cd my-project docker-compose up # configure the application docker-compose exec app ./vendor/bin/apifarm-install apifarm:config [--db-host DB-HOST] [--db-port DB-PORT] [--db-password DB-PASSWORD] [--db-user DB-USER] # install the database docker-compose exec app bin/console apifarm:install [--adminuser ADMINUSER] [--adminpassword ADMINPASSWORD] [--db-host DB-HOST] [--db-port DB-PORT] [--db-password DB-PASSWORD] [--db-user DB-USER]
Manual install
composer require zeppaman/api-farm
-
Enable the core bundles in bundles.php
ApiFarm\CoreBundle\CoreBundle::class => ['all' => true], ApiFarm\UiBundle\UiBundle::class => ['all' => true],
-
Configure the yaml files by running
./vendor/bin/apifarm-install apifarm:config [--db-host DB-HOST] [--db-port DB-PORT] [--db-password DB-PASSWORD] [--db-user DB-USER]
This command will create api-farm settings files and will replace the generated files from
lexik_jwt_authentication
trikoder_oauth2
. The file, if present are renamed.old
so that you could merge them manually. The command creates the connection string. Now ApiFarm is ready to go! -
Run
bin/console asset:install --symlink --relative public
for installing assets -
Run the installation process
bin/console apifarm:install [--adminuser ADMINUSER] [--adminpassword ADMINPASSWORD]
This command will:
- create an admin username
- generate a key pair used for JWT
- create the config.json file that contains the ui module registrations
- populate data with a sample collection schema
-
Configure the server for serving the app. The
/bundles/core/
routes have to be served from/bundles/core/index.html
. The following .htaccess have to be placed into yourpublic
folder (if you use apache!)RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^bundles/core/(.*)$ /bundles/core/index.html [NC,L,QSA]
Run this bundle.
This bundle is standalone for development and testing purpose.
Just clone and run it
git clone https://github.com/zeppaman/API-Farm.git .
docker-compose up
Then you can follow the installation steps using apifarm-install
# configure the application docker-compose exec app ./bundles/InstallBundle/bin/apifarm-install apifarm:config [--db-host DB-HOST] [--db-port DB-PORT] [--db-password DB-PASSWORD] [--db-user DB-USER] # install the database docker-compose exec app bin/console apifarm:install [--adminuser ADMINUSER] [--adminpassword ADMINPASSWORD] [--db-host DB-HOST] [--db-port DB-PORT] [--db-password DB-PASSWORD] [--db-user DB-USER]
API Usage
In this section we will see how to use API Farm.
Console commands
bin/console app:crud:upsert db collection {\"filed\":\"value\"} bin/console app:crud:find db collection {\"filed\":\"value\"} bin/console app:crud:delete db collection {\"filed\":\"value\"}
curl --location --request POST 'http://localhost/api/data/test/_schemas'
--header 'Content-Type: text/plain'
--data-raw
Api REST
It uses the resouce URI pattern.
Collection methods
- GET
http://localhost/api/{db}/{collection}
+ GET for list, - POST
http://localhost/api/{db}/{collection}
list,
item methods
- GET
http://localhost/api/{db}/{collection}/{id}
replace the object, - PUT
http://localhost/api/{db}/{collection}/{id}
replace the object, - PATCH
http://localhost/api/{db}/{collection}/{id}
pathc the object, - DELETE
http://localhost/api/{db}/{collection}/{id}
delete the object,
find
http://localhost/api/data/test/prova?skip=10&limit=20&query={%22title%22:%22value%22}
{"request":{"database":"test","collection":"test","skip":"10","limit":"20","query":"{}"},"data":[{"_id":"604335dcddfd8c484b4da692","title":"mytitle","body":"mybody"},{"_id":"604335ea05dcae70fe1ed752","title":"mytitle","body":"mybody"},{"_id":"604335f88288e669541ccb72","title":"mytitle","body":"mybody"},{"_id":"6043363cf9265b45a810f262","title":"mytitle","body":"mybody"},{"_id":"60433646825e954b41534232","title":"mytitle","body":"mybody"},{"_id":"6043368e22619b6cd151d852","title":"mytitle","body":"mybody"},{"_id":"6043369ca48c2a285d4682f2","title":"mytitle","body":"mybody"},{"_id":"604336f26e205328b82ddd32","title":"mytitle","body":"mybody"},{"_id":"6043370630658259257fd982","title":"mytitle","body":"mybody"},{"_id":"60433722f915fc6ba00f5292","title":"mytitle","body":"mybody"},{"_id":"6043387ef42a7a265a743c02","filed":"value"}],"metadata":[]}
GET
http://localhost/api/data/test/test/60428383bdb90439ec593df2
{"request":{"database":"test","collection":"test","id":"60428383bdb90439ec593df2"},"data":{"_id":"60428383bdb90439ec593df2","ddd":"ddd"},"metadata":[]}
OAUTH2
Generate a client
bin/console trikoder:oauth2:create-client -------- Identifier Secret ---------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- c0a71bf0379c66c46da3ed41a4f4aab2 e8f9855c30bb9915e61bc093656e75c7e8e3bc3b221eca2be796790af96e6f347b738a28c84ffb9db61617e812b21c51c8b29d9d8d1c92d2df9b386a2404c394 ---------------------------------- ----------------------------------------------------------------------------------------------------------------------------------
Update a client
bin/console trikoder:oauth2:update-client --grant-type client_credentials --grant-type password c0a71bf0379c66c46da3ed41a4f4aab2
List client
bin/console trikoder:oauth2:list-clients
Get token
Using a token with password protocol:
curl --location --request POST 'localhost/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=password' \ --data-urlencode 'username=bob' \ --data-urlencode 'password=xyz' \ --data-urlencode 'client_id=c0a71bf0379c66c46da3ed41a4f4aab2' \ --data-urlencode 'client_secret=e8f9855c30bb9915e61bc093656e75c7e8e3bc3b221eca2be796790af96e6f347b738a28c84ffb9db61617e812b21c51c8b29d9d8d1c92d2df9b386a2404c394'
Get User Into
Userinfo is availabel at localhost/userinfo
.
curl --location --request GET 'localhost/userinfo' --header 'Authorization: Bearer {token}' { "_id": "6043d6703e01b17faf118b53", "username": "bob", "nome": "Bobby" /* any data here*/ }
GraphQL
Endpoint is located at localhost/api/graph/{db}
query { entity1{ _id, title, amount } }
{ "data": { "entity1": [ { "_id": "6045038ae0c6cde18c3c93bf", "title": "test data", "amount": 1000 } ] } }
Code lambda
Endpoint is located at localhost/api/do/{db}/{action}/
curl --location --request GET 'localhost/api/do/{db}/{action}/' { "_id" : ObjectId("60452b54200a9b44267324e8"), "name" : "test2", "code" : "return $container['crud']->find('test','_mutations',[],1,10);" }
Setup & Testing
#create the client oauht2 docker-compose exec app bin/console trikoder:oauth2:create-client --grant-type password c0a71bf0379c66c46da3ed41a4f4aab2 docker-compose exec app bin/console app:crud:upsert test "_users" '{"username":"admin","newpassword":"password"}' #create an entity with fields title and amount docker-compose exec app bin/console app:crud:upsert test '_schemas' '{ "name" : "entity1","db" :"test","fields":{"title":{"type": "text", "name" : "title","label" : "Title"},"amount" : {"type" : "int", "name" : "amount","label" : "Amount"}}}' #get token curl --location --request POST 'localhost/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=password' \ --data-urlencode 'username=admin' \ --data-urlencode 'password=password' \ --data-urlencode 'client_id={replace}' \ --data-urlencode 'client_secret={replace}' # enter data docker-compose exec app bin/console app:crud:upsert test "entity1" '{"title":"title 1","amount":100}' docker-compose exec app bin/console app:crud:upsert test "entity1" '{"title":"title 2","amount":101}' docker-compose exec app bin/console app:crud:upsert test "entity1" '{"title":"title 3","amount":102}' docker-compose exec app bin/console app:crud:upsert test "entity1" '{"title":"title 4","amount":103}' #get data GraphQL curl --location --request GET 'localhost/api/graph/test' --header 'Content-Type: application/json' --data-raw '{"query":"query { \r\n entity1{\r\n _id,\r\n title,\r\n amount\r\n }\r\n}","variables":{}}' curl --location --request GET 'http://localhost/api/data/test/entity1' \ --header 'Authorization: Bearer {token}'