Vytváření uživatelských tabulek

Pomocí GraphQL lze přistupovat i do uživatelských databázových tabulek. Tyto tabulky může administrátor libovolně vytvářet a následně nad nimi může provádět dotazy pomocí GraphQL. Názvy do schématu se generují automaticky podle toho, jak jsou nastaveny v Sofa při publikaci tabulek. Pro příklad bude použita tabulka faktura, kterou lze vytvořit v databázi následovně:

CREATE TABLE [Faktury](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[id_zadatel] [nvarchar](max) NOT NULL,
	[jmeno_zadatel] [nvarchar](255) NOT NULL,
	[dosla_dne] [datetime] NOT NULL,
	[splatnost] [datetime] NOT NULL,
	[castka] [decimal](10, 2) NOT NULL,
	[mena] [nvarchar](255) NOT NULL,
	[variabilni_symbol] [nvarchar](255) NOT NULL,
	[dodavku_prevzal] [nvarchar](255) NULL,
	[zahranicni_subjekt] [nvarchar](max) NULL,
	[ico] [nvarchar](255) NULL,
	[spolecnost_nazev] [nvarchar](max) NOT NULL,
	[ulice] [nvarchar](max) NULL,
	[cp] [nvarchar](255) NULL,
	[co] [nvarchar](255) NULL,
	[obec] [nvarchar](255) NOT NULL,
	[psc] [nvarchar](255) NOT NULL,
	[stat] [nvarchar](255) NOT NULL,
	[zpusob_platby] [nvarchar](255) NOT NULL,
	[popis_agendy] [nvarchar](max) NOT NULL,
	[id_agendy] [uniqueidentifier] NOT NULL,
	[cislo_zadosti] [nvarchar](max) NULL,
	[schvalovatele] [nvarchar](max) NULL,
CONSTRAINT [PK_Faktury] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

Query pro vytažení všech záznamů

Slouží pro získání všech záznamů v dané tabulce.

Dotaz:

query findAllInvoices{
  fakturys{
    edges{
      node{
        id
        id_zadatel
        jmeno_zadatel
        dosla_dne
        splatnost
        castka
        mena
        variabilni_symbol
        dodavku_prevzal
        zahranicni_subjekt
        ico
        spolecnost_nazev
        ulice
        cp
        co
        obec
        psc
        stat
        zpusob_platby
        popis_agendy
        id_agendy{
          agendaName
        }
        cislo_zadosti
        schvalovatele
      }
    }
  }
}

Query pro vytažení konkrétního záznamu na základě id

Slouží pro získání konkrétního záznamu z tabulky na základě id. Pozor, lze hledat opravdu jen na základě id. Hledat na základě jiných podmínek je nutné přes prohledávání všech záznamů na základě podmínek (viz kapitola graphql_jednoduche_priklady.adoc#query-pro-ziskani-seznamu-agend).

Dotaz:

query findAllInvoices{
  fakturys{
    edges{
      node{
        id
        id_zadatel
        jmeno_zadatel
        dosla_dne
        splatnost
        castka
        mena
        variabilni_symbol
        dodavku_prevzal
        zahranicni_subjekt
        ico
        spolecnost_nazev
        ulice
        cp
        co
        obec
        psc
        stat
        zpusob_platby
        popis_agendy
        id_agendy{
          agendaName
        }
        cislo_zadosti
        schvalovatele
      }
    }
  }
}

Proměnné:

{
  "id": 59
}

Query pro vytažení všech záznamů odpovídajících zadaným podmínkám

V praxi je samozřejmě nutné hledat konkrétní záznamy na základě různých podmínek, nikoliv jen na základě id. K tomu slouží dotaz pro vytažení všech záznamů doplněný o WHERE podmínku. Například je tedy možné vytáhnout faktury zadané konkrétním uživatelem:

Dotaz:

query findAllInvoicesWhere($idZadatele:String!){
  fakturys(
    where:
    {
      eqString:
      {
      	left:
        {
        	col: ID_ZADATEL
      	},
      	right:
        {
        	const:$idZadatele
      	}
    	}
    }
  )
  {
    edges{
      node{
        id
        id_zadatel
        jmeno_zadatel
        dosla_dne
        splatnost
        castka
        mena
        variabilni_symbol
        dodavku_prevzal
        zahranicni_subjekt
        ico
        spolecnost_nazev
        ulice
        cp
        co
        obec
        psc
        stat
        zpusob_platby
        popis_agendy
        id_agendy{
          agendaName
        }
        cislo_zadosti
        schvalovatele
      }
    }
  }
}

Proměnné:

{
  "idZadatele": "6ff32e10-15df-48b9-8645-ac3ddde9a932"
}

Samozřejmě lze skládat i složitější podmínky. Pomocí AND/OR lze nakombinovat libovolné množství podmínek. Například vyhledat faktury, které zadal konkrétní uživatel a jsou zadané v rámci jednoho určitého měsíce. Na konci tohoto dotazu je ještě ukázáno, jakým způsobem lze zjistit počet odpovídajících záznamů.

Databázový count je velmi náročná operace, je proto lepší vyhodnotit si počet záznamů na základě vráceného JSONu přímo v PAJS.

Dotaz:

query findAllInvoicesWhere($idZadatele:String!, $zacatekMesice:DateTime!, $konecMesice:DateTime!){
  fakturys(
    where:
    {
      and:
      [
      	{
        eqString:
      		{
      		left:
        		{
        			col: ID_ZADATEL
      			},
      		right:
        		{
        			const:$idZadatele
      			}
      		}
        },
      	{
        gteDateTime:
      		{
      		left:
        		{
        			col: DOSLA_DNE
      			},
      		right:
        		{
        			const:$zacatekMesice
      			}
      		}
        },
      	{
        lteDateTime:
      		{
      		left:
        		{
        			col: DOSLA_DNE
      			},
      		right:
        		{
        			const:$konecMesice
      			}
      		}
      	}
      ]
    }
  )
  {
    edges{
      node{
        id
        id_zadatel
        jmeno_zadatel
        dosla_dne
        splatnost
        castka
        mena
        variabilni_symbol
        dodavku_prevzal
        zahranicni_subjekt
        ico
        spolecnost_nazev
        ulice
        cp
        co
        obec
        psc
        stat
        zpusob_platby
        popis_agendy
        id_agendy{
          agendaName
        }
        cislo_zadosti
        schvalovatele
      }
    }
    aggregate
    {
      #Získání počtu záznamů, používat opatrně
      count
    }
  }
}

Proměnné:

{
  "idZadatele": "6ff32e10-15df-48b9-8645-ac3ddde9a932",
  "zacatekMesice": "2021-09-01T00:00:00",
  "konecMesice": "2021-09-30T00:00:00"
}

Mutace pro vložení jednoho záznamu

Pro vložení jednoho záznamu do tabulky lze použít dotaz, který jako proměnnou dostane JSON s klíči, které odpovídají názvům proměnných použitých v dotazu. U mutací je vždy návratová hodnota – v tomto případě se vrací databázové id vytvořeného záznamu, ale lze samozřejmě vracet i hodnoty dalších sloupců. Pro další práci je ale nejčastěji potřeba právě databázoví id. Příklad pro vložení jedné faktury by tedy byl následující:

Dotaz:

mutation insertIntoDB
(
  $id_zadatel: String!,
  $jmeno_zadatel: String!,
  $dosla_dne: DateTime!,
  $splatnost: DateTime!,
  $castka: Decimal!,
  $mena: String!,
  $variabilni_symbol: String!,
  $dodavku_prevzal: String,
  $zahranicni_subjekt: String,
  $ico: String,
  $spolecnost_nazev: String!,
  $ulice: String,
  $cp: String,
  $co: String,
  $obec: String!,
  $psc: String!,
  $stat: String!,
  $zpusob_platby: String!,
  $popis_agendy: String!,
  $id_agendy: Guid!,
  $cislo_zadosti: String
)
{
  vysledek: insertFaktury
  (
    id_zadatel: $id_zadatel,
    jmeno_zadatel: $jmeno_zadatel,
    dosla_dne: $dosla_dne,
    splatnost: $splatnost,
    castka: $castka,
    mena: $mena,
    variabilni_symbol: $variabilni_symbol,
    dodavku_prevzal: $dodavku_prevzal,
    zahranicni_subjekt: $zahranicni_subjekt,
    ico: $ico,
    spolecnost_nazev: $spolecnost_nazev,
    ulice: $ulice,
    cp: $cp,
    co: $co,
    obec: $obec,
    psc: $psc,
    stat: $stat,
    zpusob_platby: $zpusob_platby,
    popis_agendy: $popis_agendy,
    id_agendy: $id_agendy,
    cislo_zadosti: $cislo_zadosti
  )
  {
    id
  }
}

Proměnné:

{
    "id_zadatel": "8732e257-0400-49de-bc37-4c9588a1751e",
    "jmeno_zadatel": "Technický Uživatel",
    "dosla_dne": "2021-09-06T22:00:00.000Z",
    "splatnost": "2021-09-06T22:00:00.000Z",
    "castka": 10000,
    "mena": "CZK",
    "variabilni_symbol": "123123123",
    "dodavku_prevzal": "Technický Uživatel",
    "zahranicni_subjekt": "Ne",
    "ico": "112233",
    "spolecnost_nazev": "test spol",
    "ulice": "ulice",
    "cp": "111",
    "co": "22",
    "obec": "obec",
    "psc": "12345",
    "stat": "Česká republika",
    "zpusob_platby": "Bankovním převodem",
    "popis_agendy": "123132132121",
    "id_agendy": "4f73b59b-1b2a-4c69-9667-8cda12ec51f9",
    "cislo_zadosti": "00021/2021"
}

Mutace pro hromadnou úpravu záznamů

Pro úpravu více záznamů lze použít mutaci pro hromadnou úpravu. Mutace je velmi jednoduchá, důležitý je JSON s proměnnými, který obsahuje akce, které se nad jednotlivými záznamy mají provádět. Vstupem je pole JSONů, přičemž u každého JSONu se do klíče "_action" musí nastavit, jaká operace se má provést. Lze provádět tři operace:

  • INSERT: vložení záznamu

  • UPDATE: úprava záznamu, je nutné uvést databázové id upravovaného záznamu do klíče id

  • DELETE: smazání záznamu, je nutné uvést databázové id záznamu ke smazání do klíče id

Dotaz:

mutation editMultipleInvoices($faktury: [FakturyMutation!]!)
{
  mutateFakturys(actions: $faktury)
  {
    id
  }
}

Vzorový obsah proměnných pracuje se čtyřmi záznamy – dochází k vložení dvou nových záznamů (1. a 2. JSON), úpravě záznamu s id 211 (3. JSON) a ke smazání záznamu s id 210 (4. JSON).

Proměnné:

{
   "faktury":[
      {
         "_action": "INSERT",
         "id_zadatel":"8732e257-0400-49de-bc37-4c9588a1751e",
         "jmeno_zadatel":"Technický Uživatel 1",
         "dosla_dne":"2021-09-06T22:00:00.000Z",
         "splatnost":"2021-09-06T22:00:00.000Z",
         "castka":11111,
         "mena":"CZK",
         "variabilni_symbol":"123123123",
         "dodavku_prevzal":"Technický Uživatel",
         "zahranicni_subjekt":"Ne",
         "ico":"112233",
         "spolecnost_nazev":"test spol",
         "ulice":"ulice",
         "cp":"111",
         "co":"22",
         "obec":"obec",
         "psc":"12345",
         "stat":"Česká republika",
         "zpusob_platby":"Bankovním převodem",
         "popis_agendy":"123132132121",
         "id_agendy":"4f73b59b-1b2a-4c69-9667-8cda12ec51f9",
         "cislo_zadosti":"00021/2021"
      },
      {
         "_action": "INSERT",
         "id_zadatel":"8732e257-0400-49de-bc37-4c9588a1751e",
         "jmeno_zadatel":"Technický Uživatel 2",
         "dosla_dne":"2021-09-06T22:00:00.000Z",
         "splatnost":"2021-09-06T22:00:00.000Z",
         "castka":22222,
         "mena":"CZK",
         "variabilni_symbol":"123123123",
         "dodavku_prevzal":"Technický Uživatel",
         "zahranicni_subjekt":"Ne",
         "ico":"112233",
         "spolecnost_nazev":"test spol",
         "ulice":"ulice",
         "cp":"111",
         "co":"22",
         "obec":"obec",
         "psc":"12345",
         "stat":"Česká republika",
         "zpusob_platby":"Bankovním převodem",
         "popis_agendy":"123132132121",
         "id_agendy":"4f73b59b-1b2a-4c69-9667-8cda12ec51f9",
         "cislo_zadosti":"00021/2021"
      },
      {
         "_action": "UPDATE",
         "id":211,
         "jmeno_zadatel":"Jiný uživatel"
      },
      {
         "_action": "DELETE",
         "id":210
      }
   ]
}