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 PMiamclaytonray
11/23/2017, 12:25 PM{
allUsers(filter: { username: "some-username" }) {
companies {
id
companyName
# etc
}
}
}
daniele
11/23/2017, 12:26 PMdaniele
11/23/2017, 12:26 PMiamclaytonray
11/23/2017, 12:26 PMallUsers
or even just a User
, filter the User and just query the companiesiamclaytonray
11/23/2017, 12:27 PMdaniele
11/23/2017, 12:27 PMdaniele
11/23/2017, 12:27 PMdaniele
11/23/2017, 12:28 PMiamclaytonray
11/23/2017, 12:28 PMiamclaytonray
11/23/2017, 12:28 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 PMiamclaytonray
11/23/2017, 12:30 PMUserOnCompany
shouldn’t work, if you don’t have a User typedaniele
11/23/2017, 12:49 PMdaniele
11/23/2017, 12:49 PMdaniele
11/23/2017, 12:53 PMdaniele
11/23/2017, 12:53 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 AMiamclaytonray
11/24/2017, 9:19 AMiamclaytonray
11/24/2017, 9:19 AM{
allOrganizations {
id
name
companies {
id
name
}
}
}
query looks like this:iamclaytonray
11/24/2017, 9:20 AM{
"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"
}
]
}
]
}
}
iamclaytonray
11/24/2017, 9:20 AMiamclaytonray
11/24/2017, 9:23 AM{
User(email: "<mailto:john@gmail.com|john@gmail.com>") {
name
company {
name
organization {
name
}
}
}
}
iamclaytonray
11/24/2017, 9:23 AMiamclaytonray
11/24/2017, 9:24 AM{
"data": {
"User": {
"name": "John Doe",
"company": {
"name": "Company 1",
"organization": {
"name": "Org 1"
}
}
}
}
}
iamclaytonray
11/24/2017, 9:24 AMiamclaytonray
11/24/2017, 9:24 AMcurrentUser
iamclaytonray
11/24/2017, 9:27 AM<mailto:john@gmail.com|john@gmail.com>
) account and other relevant dataiamclaytonray
11/24/2017, 9:29 AMallUsers
iamclaytonray
11/24/2017, 9:30 AMiamclaytonray
11/24/2017, 9:31 AM{
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"
}
}
}
]
}
}
iamclaytonray
11/24/2017, 9:33 AMdaniele
11/24/2017, 2:16 PMdaniele
11/24/2017, 2:16 PM- operation: 'Company.read'
authenticated: true
query: src/permissions/Company.graphql:RetrieveCompanyData
daniele
11/24/2017, 2:16 PMdaniele
11/24/2017, 2:17 PMdaniele
11/24/2017, 2:17 PMdaniele
11/24/2017, 2:17 PMAuthorization
token?iamclaytonray
11/24/2017, 2:26 PMiamclaytonray
11/24/2017, 2:26 PMiamclaytonray
11/24/2017, 3:00 PMiamclaytonray
11/24/2017, 3:00 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 PMdaniele
11/24/2017, 6:02 PMiamclaytonray
11/24/2017, 6:02 PMiamclaytonray
11/24/2017, 6:02 PMdaniele
11/24/2017, 6:02 PMdaniele
11/24/2017, 6:03 PMdaniele
11/24/2017, 6:03 PMiamclaytonray
11/24/2017, 6:07 PMiamclaytonray
11/24/2017, 6:07 PMdaniele
11/24/2017, 6:19 PMdaniele
11/25/2017, 10:43 AMiamclaytonray
11/25/2017, 11:33 AMiamclaytonray
11/25/2017, 11:33 AMiamclaytonray
11/25/2017, 11:33 AMdaniele
11/25/2017, 1:57 PMdaniele
11/25/2017, 1:57 PM{
allUsers(filter: { company: { users_every: { email: "<mailto:john@gmail.com|john@gmail.com>" } } }) {
id
company {
name
organization {
name
}
}
}
}
daniele
11/25/2017, 1:57 PMAuthorization token
iamclaytonray
11/25/2017, 1:58 PMdaniele
11/25/2017, 1:59 PMdaniele
11/25/2017, 2:00 PMdaniele
11/25/2017, 2:00 PM- operation: 'Company.read'
authenticated: true
query: src/permissions/Company.graphql:RetrieveCompanyData
daniele
11/25/2017, 2:00 PMsrc/permissions/Company.graphql:RetrieveCompanyData
iamclaytonray
11/25/2017, 2:05 PMquery
with:
handler:
code: src/RetrieveCompanyData.ts
iamclaytonray
11/25/2017, 2:05 PMdaniele
11/25/2017, 2:05 PMdaniele
11/25/2017, 2:06 PMiamclaytonray
11/25/2017, 2:06 PMiamclaytonray
11/25/2017, 2:06 PMiamclaytonray
11/25/2017, 2:08 PM:RetrieveCompanyData
from your query
iamclaytonray
11/25/2017, 2:08 PMiamclaytonray
11/25/2017, 2:08 PMdaniele
11/25/2017, 2:08 PMiamclaytonray
11/25/2017, 2:09 PMgraphcool.yml
😕iamclaytonray
11/25/2017, 2:09 PMdaniele
11/25/2017, 2:09 PMiamclaytonray
11/25/2017, 2:09 PMiamclaytonray
11/25/2017, 2:10 PMdaniele
11/25/2017, 2:13 PMdaniele
11/25/2017, 2:22 PM<https://www.graph.cool/forum/t/filter-companies-by-organizations/1713>
daniele
11/25/2017, 2:22 PMiamclaytonray
11/25/2017, 2:39 PMagartha
11/25/2017, 2:43 PMagartha
11/25/2017, 2:44 PMagartha
11/25/2017, 2:45 PMdaniele
11/25/2017, 2:50 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")
}
daniele
11/25/2017, 2:51 PMagartha
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 } } } })
agartha
11/25/2017, 3:00 PMdaniele
11/25/2017, 3:01 PMdaniele
11/25/2017, 3:01 PMdaniele
11/25/2017, 3:01 PMagartha
11/25/2017, 3:02 PMagartha
11/25/2017, 3:02 PM$user_id
, which is the user id from the Authorization tokendaniele
11/25/2017, 3:02 PMdaniele
11/25/2017, 3:02 PMagartha
11/25/2017, 3:03 PMagartha
11/25/2017, 3:03 PMdaniele
11/25/2017, 3:03 PMdaniele
11/25/2017, 3:03 PM- operation: 'Company.read'
authenticated: true
query: src/permissions/Company.graphql:RetrieveCompanyData
daniele
11/25/2017, 3:04 PMRetrieveCompanyData
is:daniele
11/25/2017, 3:04 PMRetrieveCompanyData(filter: { organization: { companies_some: { users_some: { id: $user_id } } } })
daniele
11/25/2017, 3:04 PMagartha
11/25/2017, 3:05 PMquery RetrieveCompanyData($user_id: ID!) {
SomeCompanyExists(filter: { organization: { companies_some: { users_some: { id: $user_id } } } })
}
agartha
11/25/2017, 3:05 PMagartha
11/25/2017, 3:05 PMdaniele
11/25/2017, 3:06 PMdaniele
11/25/2017, 3:07 PMallCompanies { id , name}
and that's alldaniele
11/25/2017, 3:07 PMagartha
11/25/2017, 3:07 PMagartha
11/25/2017, 3:08 PMagartha
11/25/2017, 3:08 PMdaniele
11/25/2017, 3:09 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
daniele
11/25/2017, 3:13 PMagartha
11/25/2017, 3:13 PMdaniele
11/25/2017, 3:14 PMdaniele
11/25/2017, 3:30 PMdaniele
11/25/2017, 3:30 PMdaniele
11/25/2017, 3:30 PMprivate getAirlines = gql`{
allCompanies {
id
name
color
}
}`;
daniele
11/25/2017, 3:31 PMdaniele
11/25/2017, 3:31 PMdaniele
11/25/2017, 3:31 PMdaniele
11/25/2017, 3:32 PMdaniele
11/25/2017, 3:32 PM{
"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"
}
}
]
}
}
daniele
11/25/2017, 3:32 PM<mailto:GateAdmin@admin.com|GateAdmin@admin.com>
daniele
11/25/2017, 3:32 PMdaniele
11/25/2017, 3:33 PM{
"data": {
"allCompanies": [
{
"id": "cja5f6uh400vc0148jowhza3i",
"name": "Iberia",
"color": "#fd272f",
"__typename": "Company"
},
{
"id": "cja5pfodm00ow01489pvn2gwn",
"name": "Air Canada",
"color": "#ee2c30",
"__typename": "Company"
}
]
}
}
daniele
11/25/2017, 3:33 PMagartha
11/25/2017, 3:33 PMdaniele
11/25/2017, 3:33 PMdaniele
11/25/2017, 3:34 PM{
"data": {
"allOrganizations": [
{
"id": "cja5f3h1j00v001489mtj7s81",
"name": "IAG"
},
{
"id": "cja5f3pl300v40148fu0xb1n1",
"name": "Gate Gourmet"
}
]
}
}
daniele
11/25/2017, 3:35 PM{
"data": {
"allCompanies": [
{
"name": "Iberia",
"organization": {
"name": "IAG"
}
},
{
"name": "Air Canada",
"organization": {
"name": "Gate Gourmet"
}
}
]
}
}
daniele
11/25/2017, 3:35 PM{
"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"
}
}
]
}
}
daniele
11/25/2017, 3:35 PMdaniele
11/25/2017, 3:36 PMagartha
11/25/2017, 3:36 PMdaniele
11/25/2017, 3:36 PMdaniele
11/25/2017, 3:37 PMpermissions:
- operation: 'Company.read'
authenticated: true
query: src/permissions/Company.graphql:RetrieveCompanyData
daniele
11/25/2017, 3:37 PMquery RetrieveCompanyData($user_id: ID!) {
SomeCompanyExists(filter:
{
organization: {
companies_some: {
users_some: {
id: $user_id
}
}
}
}
)
}
daniele
11/25/2017, 3:37 PMPermissions
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 PMagartha
11/25/2017, 3:41 PMagartha
11/25/2017, 3:41 PMquery RetrieveCompanyData($user_id: ID!, $node_id: ID!) {
SomeCompanyExists(filter:
{
id: $node_id
organization: {
companies_some: {
users_some: {
id: $user_id
}
}
}
}
)
}
agartha
11/25/2017, 3:42 PMdaniele
11/25/2017, 3:47 PMdaniele
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"
}
]
}
daniele
11/25/2017, 3:54 PMdaniele
11/25/2017, 4:00 PMdaniele
11/25/2017, 4:12 PMagartha
11/25/2017, 4:13 PMdaniele
11/25/2017, 4:16 PMdaniele
11/25/2017, 4:30 PM- operation: 'Organization.read'
authenticated: true
daniele
11/25/2017, 4:30 PMdaniele
11/25/2017, 4:30 PMdaniele
11/27/2017, 12:21 PM