Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/zeppaman/api-farm
A PHP Symfony based extensible low-code platform
https://github.com/zeppaman/api-farm
api-platform graphql mongodb php symfony
Last synced: about 1 month ago
JSON representation
A PHP Symfony based extensible low-code platform
- Host: GitHub
- URL: https://github.com/zeppaman/api-farm
- Owner: zeppaman
- Created: 2021-03-06T09:06:04.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2021-03-18T17:50:17.000Z (almost 4 years ago)
- Last Synced: 2024-11-18T04:42:27.925Z (about 2 months ago)
- Topics: api-platform, graphql, mongodb, php, symfony
- Language: PHP
- Homepage:
- Size: 757 KB
- Stars: 4
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# API FARM
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
```bash
# create a project
COMPOSER_MEMORY_LIMIT=-1 composer create-project zeppaman/api-farm my-projectcd 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
```bash
composer require zeppaman/api-farm
```1. Enable the core bundles in bundles.php
```bash
ApiFarm\CoreBundle\CoreBundle::class => ['all' => true],
ApiFarm\UiBundle\UiBundle::class => ['all' => true],```
2. Configure the yaml files by running```bash
./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!
3. Run `bin/console asset:install --symlink --relative public` for installing assets
4. Run the installation process
```bash
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
5. 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 your `public` folder (if you use apache!)```bash
RewriteEngine onRewriteCond %{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
```bashgit clone https://github.com/zeppaman/API-Farm.git .
docker-compose up```
Then you can follow the installation steps using `apifarm-install````bash
# 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
```bash
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
```bash
bin/console trikoder:oauth2:create-client--------
Identifier Secret
---------------------------------- ----------------------------------------------------------------------------------------------------------------------------------
c0a71bf0379c66c46da3ed41a4f4aab2 e8f9855c30bb9915e61bc093656e75c7e8e3bc3b221eca2be796790af96e6f347b738a28c84ffb9db61617e812b21c51c8b29d9d8d1c92d2df9b386a2404c394
---------------------------------- ----------------------------------------------------------------------------------------------------------------------------------
```## Update a client
```bashbin/console trikoder:oauth2:update-client --grant-type client_credentials --grant-type password c0a71bf0379c66c46da3ed41a4f4aab2
```## List client
```bash
bin/console trikoder:oauth2:list-clients
```## Get token
Using a token with password protocol:```bash
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`.
```bash
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}`
```bash
query {
entity1{
_id,
title,
amount
}
}
``````json
{
"data": {
"entity1": [
{
"_id": "6045038ae0c6cde18c3c93bf",
"title": "test data",
"amount": 1000
}
]
}
}
```# Code lambda
Endpoint is located at `localhost/api/do/{db}/{action}/`
```bash
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
```bash
#create the client oauht2
docker-compose exec app bin/console trikoder:oauth2:create-client --grant-type password c0a71bf0379c66c46da3ed41a4f4aab2docker-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}'```