-
Запустить выполнение скрипта для создания схемы таблицы (файл
scripts/sql/clients.sql
) -
Установить переменную окружения DB_CONN в креденшлы БД, напр.
postgres://postgres:postgres@127.0.0.1:5432/test_db?sslmode=disable
-
Запустить модуль в папке cmd/graph_sql_api_test_serviced:
go run .
-
В Postman создать POST запрос на
http://localhost:2121/client
4.1) Листинг всех записей (c возможностью фильтрации по имени по частичному вхождению поискового запроса):
query GetClients ($client_name: String, $first: Int, $offset: Int)
{
totalCount
clients (client_name: $client_name, first: $first, offset: $offset){
id
client_name
ur_adr
}
}
Все поля - необязательные
{
"client_name": "ООО",
"first": 5,
"offset": 0
}
query GetClientByID ($id: Int!){
client (id: $id) {
id
client_name
ur_adr
}
}
id - обязательное поле
{
"id": 155
}
{
client151: client(id: 151) {
client_name
}
client154: client(id: 154) {
client_name
}
}
{
client151: client(id: 151) {
...fields
}
client154: client(id: 154) {
...fields
}
}
fragment fields on Client {
client_name
ur_adr
}
query GetClient($id: Int!, $withUrAdr: Boolean!)
{
client(id: $id){
id
client_name
ur_adr @include (if: $withUrAdr)
}
}
{
"id": 154,
"withUrAdr": true
}
{
client(id: 153){
__typename
client_name
... on Client{
ur_adr
}
}
}
{
client(id: 153){
__typename
client_name
}
}
mutation CreateClientObj($clientName: String!, $urAdr: String! ) {
createClient(client_name: $clientName, ur_adr: $urAdr) {
id,
client_name,
ur_adr
}
}
{
"clientName": "Ksenia R.",
"urAdr": "Moscow, Kievskaya, 23"
}
mutation UpdateClientObj($id: Int!, $clientName: String, $urAdr: String) {
updateClient(id: $id, client_name: $clientName, ur_adr: $urAdr) {
id,
client_name,
ur_adr
}
}
{
"id": 1,
"clientName": "Petr Ivanov",
"urAdr": ""
}
mutation Update2Clients($id: Int!, $clientName: String, $urAdr: String) {
firstUpd: updateClient(id: $id, client_name: $clientName, ur_adr: $urAdr) {
... ClientFields
}
secUpd: updateClient(id: 2, client_name: "Second client", ur_adr: "Praha, Zlata 45") {
... ClientFields
}
}
fragment ClientFields on Client {
id,
client_name,
ur_adr
}
{
"id": 1,
"clientName": "Kosta Z.",
"urAdr": "Piterburg"
}
mutation DeleteClientObj($id: Int!) {
deleteClient(id: $id) {
id,
client_name,
ur_adr
}
}
{
"id": 4
}
mutation DeleteFewClientsObj {
rem1: deleteClient(id: 1) {
id
}
rem2: deleteClient(id: 2) {
id
}
rem3: deleteClient(id: 3) {
id
}
}
Лайвхак - чтобы в graphQL бекэнде сделать какой то аргумент необязательным (nullable), нужно указать
DefaultValue: ""
, напр.:
"updateClient": &graphql.Field{
Type: modelType,
Args: graphql.FieldConfigArgument{
"id": &graphql.ArgumentConfig{
Description: "Client ID",
Type: graphql.NewNonNull(graphql.Int),
},
"client_name": &graphql.ArgumentConfig{
Description: "Client name",
Type: graphql.String,
DefaultValue: "",
},
"ur_adr": &graphql.ArgumentConfig{
Description: "Client juridical address",
Type: graphql.String,
DefaultValue: "",
},
},
...
}