daniele
11/23/2017, 10:48 AMgiven the authenticated user (token) I would like to retrieve all the companies related to his organization
. I know that I can write a filter on apollo-client but I would like to do that on the graphcool. The question is I have to do a query or a handler function?iamclaytonray
11/23/2017, 12:25 PM{
allUsers(filter: { username: "some-username" }) {
companies {
id
companyName
# etc
}
}
}
daniele
11/23/2017, 12:26 PMiamclaytonray
11/23/2017, 12:26 PMallUsers
or even just a User
, filter the User and just query the companiesdaniele
11/23/2017, 12:27 PMiamclaytonray
11/23/2017, 12:28 PMdaniele
11/23/2017, 12:29 PMtype Organization @model {
id: ID! @isUnique
name: String!
companies: [Company!]! @relation(name: "CompanyOnOrganization")
}
type Company @model {
id: ID! @isUnique
name: String!
color: String
logo: String
organization: Organization @relation(name: "CompanyOnOrganization")
users: [User!]! @relation(name: "UserOnCompany")
}
iamclaytonray
11/23/2017, 12:29 PMUserOnCompany
shouldn’t work, if you don’t have a User typedaniele
11/23/2017, 12:49 PMtype Organization @model {
id: ID! @isUnique
name: String!
companies: [Company!]! @relation(name: "CompanyOnOrganization")
}
type Company @model {
id: ID! @isUnique
name: String!
color: String
logo: String
organization: Organization @relation(name: "CompanyOnOrganization")
users: [User!]! @relation(name: "UserOnCompany")
}
type User @model {
id: ID! @isUnique
createdAt: DateTime!
updatedAt: DateTime!
email: String! @isUnique
password: String!
name: String!
surname: String!
company: Company @relation(name: "UserOnCompany")
}
iamclaytonray
11/23/2017, 1:02 PMdaniele
11/23/2017, 1:04 PMiamclaytonray
11/23/2017, 2:22 PMdaniele
11/23/2017, 3:00 PMlouis
11/24/2017, 8:58 AMiamclaytonray
11/24/2017, 8:59 AM{
allOrganizations {
id
name
companies {
id
name
}
}
}
query looks like this:{
"data": {
"allOrganizations": [
{
"id": "cjachl8h83x490109479olvfh",
"name": "Org 1",
"companies": [
{
"id": "cjachk82xdvhs0173qw3cjdah",
"name": "Company 1"
},
{
"id": "cjachkbjqdvig01732ymepajy",
"name": "Company 2"
}
]
},
{
"id": "cjachlbtu3x4s0109rbmd5pkr",
"name": "Org 2",
"companies": [
{
"id": "cjacjejpudm8e0112px5j3a06",
"name": "Company 3"
},
{
"id": "cjacjelebdm8k0112anbcbh2d",
"name": "Company 4"
}
]
}
]
}
}
{
User(email: "<mailto:john@gmail.com|john@gmail.com>") {
name
company {
name
organization {
name
}
}
}
}
{
"data": {
"User": {
"name": "John Doe",
"company": {
"name": "Company 1",
"organization": {
"name": "Org 1"
}
}
}
}
}
currentUser
<mailto:john@gmail.com|john@gmail.com>
) account and other relevant dataallUsers
{
allUsers(filter: { company: { users_every: { email: "<mailto:john@gmail.com|john@gmail.com>" } } }) {
id
company {
name
organization {
name
}
}
}
}
would return:
{
"data": {
"allUsers": [
{
"id": "cja0zkue9mo540143kcvmbvdq",
"company": {
"name": "Company 1",
"organization": {
"name": "Org 1"
}
}
}
]
}
}
daniele
11/24/2017, 2:16 PM- operation: 'Company.read'
authenticated: true
query: src/permissions/Company.graphql:RetrieveCompanyData
Authorization
token?iamclaytonray
11/24/2017, 2:26 PMdaniele
11/24/2017, 3:00 PMiamclaytonray
11/24/2017, 3:01 PMdaniele
11/24/2017, 6:01 PMiamclaytonray
11/24/2017, 6:02 PMdaniele
11/24/2017, 6:02 PMiamclaytonray
11/24/2017, 6:02 PMdaniele
11/24/2017, 6:02 PMiamclaytonray
11/24/2017, 6:07 PMdaniele
11/24/2017, 6:19 PMiamclaytonray
11/25/2017, 11:33 AMdaniele
11/25/2017, 1:57 PM{
allUsers(filter: { company: { users_every: { email: "<mailto:john@gmail.com|john@gmail.com>" } } }) {
id
company {
name
organization {
name
}
}
}
}
Authorization token
iamclaytonray
11/25/2017, 1:58 PMdaniele
11/25/2017, 1:59 PM- operation: 'Company.read'
authenticated: true
query: src/permissions/Company.graphql:RetrieveCompanyData
src/permissions/Company.graphql:RetrieveCompanyData
iamclaytonray
11/25/2017, 2:05 PMquery
with:
handler:
code: src/RetrieveCompanyData.ts
daniele
11/25/2017, 2:05 PMiamclaytonray
11/25/2017, 2:06 PM:RetrieveCompanyData
from your query
daniele
11/25/2017, 2:08 PMiamclaytonray
11/25/2017, 2:09 PMgraphcool.yml
😕daniele
11/25/2017, 2:09 PMiamclaytonray
11/25/2017, 2:09 PMdaniele
11/25/2017, 2:13 PM<https://www.graph.cool/forum/t/filter-companies-by-organizations/1713>
iamclaytonray
11/25/2017, 2:39 PMagartha
11/25/2017, 2:43 PMdaniele
11/25/2017, 2:50 PMtype Organization @model {
id: ID! @isUnique
name: String!
companies: [Company!]! @relation(name: "CompanyOnOrganization")
}
type Company @model {
id: ID! @isUnique
name: String!
color: String
logo: String
organization: Organization @relation(name: "CompanyOnOrganization")
users: [User!]! @relation(name: "UserOnCompany")
}
type User @model {
id: ID! @isUnique
createdAt: DateTime!
updatedAt: DateTime!
email: String! @isUnique
password: String!
name: String!
surname: String!
company: Company @relation(name: "UserOnCompany")
}
agartha
11/25/2017, 2:53 PMdaniele
11/25/2017, 2:54 PMagartha
11/25/2017, 2:57 PMCompany.read
should be something like:
SomeCompanyExists(filter: { organization: { companies_some: { users_some: { id: $user_id } } } })
daniele
11/25/2017, 3:01 PMagartha
11/25/2017, 3:02 PM$user_id
, which is the user id from the Authorization tokendaniele
11/25/2017, 3:02 PMagartha
11/25/2017, 3:03 PMdaniele
11/25/2017, 3:03 PM- operation: 'Company.read'
authenticated: true
query: src/permissions/Company.graphql:RetrieveCompanyData
RetrieveCompanyData
is:RetrieveCompanyData(filter: { organization: { companies_some: { users_some: { id: $user_id } } } })
agartha
11/25/2017, 3:05 PMquery RetrieveCompanyData($user_id: ID!) {
SomeCompanyExists(filter: { organization: { companies_some: { users_some: { id: $user_id } } } })
}
daniele
11/25/2017, 3:06 PMallCompanies { id , name}
and that's allagartha
11/25/2017, 3:07 PMdaniele
11/25/2017, 3:09 PMagartha
11/25/2017, 3:11 PMdaniele
11/25/2017, 3:12 PMagartha
11/25/2017, 3:12 PMdaniele
11/25/2017, 3:13 PMhandler:
code: src/RetrieveCompanyData.ts
agartha
11/25/2017, 3:13 PMdaniele
11/25/2017, 3:14 PMprivate getAirlines = gql`{
allCompanies {
id
name
color
}
}`;
{
"data": {
"allUsers": [
{
"id": "cja5p7jqj00n401489881zjsh",
"name": "Daniele",
"email": "<mailto:superAdmin@admin.com|superAdmin@admin.com>",
"company": null
},
{
"id": "cja5pc1eb00oa0148jt5c8ehv",
"name": "Daniele",
"email": "<mailto:IAGAdmin@admin.com|IAGAdmin@admin.com>",
"company": {
"name": "Iberia",
"id": "cja5f6uh400vc0148jowhza3i"
}
},
{
"id": "cja5pc9a600ok0148nhtalk42",
"name": "Daniele",
"email": "<mailto:GateAdmin@admin.com|GateAdmin@admin.com>",
"company": {
"name": "Air Canada",
"id": "cja5pfodm00ow01489pvn2gwn"
}
}
]
}
}
<mailto:GateAdmin@admin.com|GateAdmin@admin.com>
{
"data": {
"allCompanies": [
{
"id": "cja5f6uh400vc0148jowhza3i",
"name": "Iberia",
"color": "#fd272f",
"__typename": "Company"
},
{
"id": "cja5pfodm00ow01489pvn2gwn",
"name": "Air Canada",
"color": "#ee2c30",
"__typename": "Company"
}
]
}
}
agartha
11/25/2017, 3:33 PMdaniele
11/25/2017, 3:33 PM{
"data": {
"allOrganizations": [
{
"id": "cja5f3h1j00v001489mtj7s81",
"name": "IAG"
},
{
"id": "cja5f3pl300v40148fu0xb1n1",
"name": "Gate Gourmet"
}
]
}
}
{
"data": {
"allCompanies": [
{
"name": "Iberia",
"organization": {
"name": "IAG"
}
},
{
"name": "Air Canada",
"organization": {
"name": "Gate Gourmet"
}
}
]
}
}
{
"data": {
"allUsers": [
{
"id": "cja5p7jqj00n401489881zjsh",
"name": "Daniele",
"email": "<mailto:superAdmin@admin.com|superAdmin@admin.com>",
"company": null
},
{
"id": "cja5pc1eb00oa0148jt5c8ehv",
"name": "Daniele",
"email": "<mailto:IAGAdmin@admin.com|IAGAdmin@admin.com>",
"company": {
"name": "Iberia",
"id": "cja5f6uh400vc0148jowhza3i"
}
},
{
"id": "cja5pc9a600ok0148nhtalk42",
"name": "Daniele",
"email": "<mailto:GateAdmin@admin.com|GateAdmin@admin.com>",
"company": {
"name": "Air Canada",
"id": "cja5pfodm00ow01489pvn2gwn"
}
}
]
}
}
agartha
11/25/2017, 3:36 PMdaniele
11/25/2017, 3:36 PMpermissions:
- operation: 'Company.read'
authenticated: true
query: src/permissions/Company.graphql:RetrieveCompanyData
query RetrieveCompanyData($user_id: ID!) {
SomeCompanyExists(filter:
{
organization: {
companies_some: {
users_some: {
id: $user_id
}
}
}
}
)
}
Permissions
Wildcard Permission
- The wildcard permission for all types is removed.
Here are your GraphQL Endpoints:
Simple API: <http://localhost:60000/simple/v1/cj9n8k2ua00040148cpfxjp6p>
Relay API: <http://localhost:60000/relay/v1/cj9n8k2ua00040148cpfxjp6p>
Subscriptions API: <ws://localhost:60000/subscriptions/v1/cj9n8k2ua00040148cpfxjp6p>
agartha
11/25/2017, 3:40 PMquery RetrieveCompanyData($user_id: ID!, $node_id: ID!) {
SomeCompanyExists(filter:
{
id: $node_id
organization: {
companies_some: {
users_some: {
id: $user_id
}
}
}
}
)
}
daniele
11/25/2017, 3:47 PM{
"data": null,
"errors": [
{
"locations": [
{
"line": 3,
"column": 5
}
],
"path": [
"allCompanies",
1,
"id"
],
"code": 3008,
"message": "Insufficient Permissions",
"requestId": "eu-west-1:simple:cjafidkc201vo0148gbdjp84z"
},
{
"locations": [
{
"line": 4,
"column": 5
}
],
"path": [
"allCompanies",
1,
"name"
],
"code": 3008,
"message": "Insufficient Permissions",
"requestId": "eu-west-1:simple:cjafidkc201vo0148gbdjp84z"
},
{
"locations": [
{
"line": 5,
"column": 5
}
],
"path": [
"allCompanies",
1,
"color"
],
"code": 3008,
"message": "Insufficient Permissions",
"requestId": "eu-west-1:simple:cjafidkc201vo0148gbdjp84z"
}
]
}
agartha
11/25/2017, 4:13 PMdaniele
11/25/2017, 4:16 PM- operation: 'Organization.read'
authenticated: true