SlideShare a Scribd company logo
1 of 79
Download to read offline
GRAPHQL IN GO
MODERNWEB 2018
ABOUT ME
Open source contributor
1. Gitea
2. Drone
3. Gin
appleboy @ GitHub
appleboy @ twitter
appleboy @ slideshare
appleboy46 @ facebook
2
AGENDA
▸ Why we moving API from REST to Graphql?
▸ What is Graphql?
▸ Graphql in Golang (Why we choose Golang)
▸ How to testing Graphql in Golang
▸ Deploy Graphql application
MOVING REST TO GRAPHQL
icon from https://bit.ly/2LhOpZA
1. LARGE REQUEST IN SINGLE PAGE
https://bit.ly/2NpS4Fu
1. LARGE REQUEST IN SINGLE PAGE
CUSTOM FIELDS
/api/scene/1?field=name,description,created_at
CUSTOMENDPOINT
/api/scene/1/mobile?field=name,description
/api/scene/1/web?field=name,description
DOCUMENTATION?
HOW TO GENERATE DOCUMENT AUTOMATICALLY?
API DOC
Swagger
UPDATE API
GENERATE DOC
BACKEND
FRONTEND MOBILETESTING
/**
* @api {get} /scene/:id Request Scene information
* @apiName GetScene
* @apiGroup Scene
*
* @apiParam {Number} id Scenes unique ID.
*
* @apiSuccess {String} title Title of the Scene.
* @apiSuccess {String} desc Description of the Scene.
*/
GRAPHQL
WHATISGRAPHQL?
IT IS A QUERY LANGUAGE
{
myScene {
name
description
}
}
LEXED
PARSED
VALIDATED
EXECUTED
{
scene(id: 1) {
name
description
}
}
LEXED
PARSED
VALIDATED
EXECUTED
{
scene(id: 1) {
name
description
items(type: DEVICE) {
id
name
url
}
}
}
Graphql Request
{
"scene": {
"name": "foo",
"description": “bar",
"items": [{
"id": 1,
"name": "test_1",
"url": "http://foo.com"
}, {
"id": 2,
"name": "test_2",
"url": "http://bar.com"
}]
}
}
JSON Response
/api/scene/1
/api/scene/1/item
/api/scene/1/all
TYPE SYSTEM
GRAPHQL LANGUAGE
{
myScene {
name
description
}
}
{
scene(id: 1) {
name
description
items(type: DEVICE) {
id
name
url
}
}
}
type QueryRoot {
myScene: Scene
scene(id: ID!): Scene
}
{
scene(id: 1) {
name
description
items(type: DEVICE) {
id
name
url
}
}
}
Graphql Request
type Scene {
name: String!
description: String
items(type: ItemEnum): [Item]
}
enum ItemEnum {
DEVICE,
TEST_DEVICE,
URL
}
{
scene(id: 1) {
name
description
items(type: DEVICE) {
id
name
url
}
}
}
Graphql Request
type Item {
id: ID!
name: String!
url: String
}
INTROSPECTION
GRAPHQL LANGUAGE
{
__schema {
queryType {
name
}
}
}
{
"data": {
"__schema": {
"queryType": {
"name": "Query"
}
}
}
}
WHY NEED THE INTROSPECTION
▸code generation
▸auto documentation
▸static validation
▸IDE Integration
https://github.com/prismagraphql/graphql-playground
https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d/
RESOLVINGFIELDS
GRAPHQL LANGUAGE
type Item {
id: ID
type: sceneEnum
name: String
}
    "id": &graphql.Field{
      Type: graphql.Int,
    },
INT FLOAT STRING BOOLEAN ID
type Item {
id: ID
type: sceneEnum
name: String
}
    "TEST_DEVICE": &graphql.EnumValueConfig{
      Value: int(model.TypeTestDevice),
      Description: "test device.",
    },
    "DEVICE": &graphql.EnumValueConfig{
      Value: int(model.TypeDevice),
      Description: "device.",
    },
    "URL": &graphql.EnumValueConfig{
      Value: int(model.TypeURL),
      Description: "url.",
    },
"name": &graphql.Field{
Type: graphql.String,
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
o, _ := p.Source.(*model.Scene)
return "Hello, " + o.Name, nil
},
},
Return Custom Value
MUTATION
GRAPHQL LANGUAGE
mutation {
createScene(
title: "foo",
description: "bar"
) {
id
title
description
url
}
}
// Schema is the GraphQL schema served by the server.
var Schema, _ = graphql.NewSchema(graphql.SchemaConfig{
  Query: rootQuery,
  Mutation: rootMutation,
  Types: types,
})
Query and Mutation
SINGLE ENDPOINT
POST /graphql
GRAPHQL IN GOLANG
WHY WE CHOOSE GOLANG?
WHY WE CHOOSE GOLANG?
▸Compiles Into Single Binary
▸Static Type System
▸Performance
▸Easy to Deploy
▸Learning Curve
BENCHMARKOFGRAPHQLFRAMEWORKINGOLANG
▸graphql-go/graphql
▸playlyfe/go-graphql
▸graph-gophers/graphql-go
▸samsarahq/thunder
https://github.com/appleboy/golang-graphql-benchmark
$	go	test	-v	-bench=.	-benchmem
VEKTAH/GQLGEN
GO GENERATE BASED GRAPHQL SERVER
LIBRARY
https://github.com/vektah/gqlgenhttps://youtu.be/3dpqYMqyiOg
API SERVER
API SERVER
GRAPHQLSERVER
GRAPHQL GATEWAY
GRAPHQLINGOLANG
PACKAGE IN GOLANG
FRAMEWORKINGO
func Handler() gin.HandlerFunc {
  h := handler.New(&handler.Config{
    Schema: &schema.Schema,
    Pretty: true,
  })
  return func(c *gin.Context) {
    h.ServeHTTP(c.Writer, c.Request)
  }
}
graphql schema
JWT TOKEN
SERVER
GRAPHQL
SERVER
func Check() gin.HandlerFunc {
  return func(c *gin.Context) {
    token := c.GetHeader("Authorization")
    user, err := authUser(token)
    if token != "" && err != nil {
      logrus.Errorf("authUser error: %s", err.Error())
    }
    if user != nil && user.Email != "" {
      c.Set("email", user.Email)
      c.Set("user_id", user.UserID)
    }
    ctx := context.WithValue(
      c.Request.Context(),
      config.ContextKeyUser,
      user,
    )
    c.Request = c.Request.WithContext(ctx)
  }
}
store user data
var Schema, _ = graphql.NewSchema(graphql.SchemaConfig{
  Query: rootQuery,
  Mutation: rootMutation,
})
var rootMutation = graphql.NewObject(
  graphql.ObjectConfig{
    Name: "RootMutation",
    Description: "Root Mutation",
    Fields: graphql.Fields{
      "updateUser": &updateUser,
      "createScene": &createScene,
      "updateScene": &updateScene,
      "deleteScene": &deleteScene,
    },
  })
var rootQuery = graphql.NewObject(
  graphql.ObjectConfig{
    Name: "RootQuery",
    Description: "Root Query",
    Fields: graphql.Fields{
      "queryUser": &queryUser,
      "searchUser": &searchUser,
      "queryScene": &queryScene,
    },
  })
query
mutation
GRAPHQL ERROR
BETTER ERROR HANDLING
{	
		"data":	{	
				"post":	null	
		},	
		"errors":	[	
				{	
						"message":	"Internal	Error:	404	not	found",	
						"locations":	[	
								{	
										"line":	2,	
										"column":	3	
								}	
						],	
						"path":	[	
								"post"	
						]	
				}	
		]	
}	
single message
error location
func (g FormattedError) MarshalJSON() ([]byte, error)
{
  m := map[string]interface{}{}
  for k, v := range g.Extensions {
    m[k] = v
  }
  m["message"] = g.Message
  m["locations"] = g.Locations
  return json.Marshal(m)
}
Marshal JSON
custom key value
func FormatError(err error, arg ...interface{}) gqlerrors.FormattedError
{
  switch err := err.(type) {
  case gqlerrors.FormattedError:
    return err
  case *Error:
    return gqlerrors.FormattedError{
      Message: fmt.Sprintf(err.Error(), arg...),
      Extensions: gqlerrors.ErrorExtensions{
        "code": err.Type.Code(),
        "type": err.Type,
      },
    }
} custom error
original error
GRAPHQL N+1
DATA LOADER
1. LARGE REQUEST IN SINGLE PAGE
{
myScene(id: 1) {
name
description
role {
id
user {
email
}
model
}
}
}
ORM IN GOLANG
GOORM VS XORM
type Scene struct {
  ID int64 `xorm:"pk autoincr" json:"id"`
  Image string `json:"image,omitempty"`
  CreatedAt time.Time `json:"createdAt,omitempty"`
  UpdatedAt time.Time `json:"updatedAt,omitempty"`
  DeletedAt time.Time `xorm:"deleted"`
  // reference
  Items []*SceneItem `xorm:"-" json:"items,omitempty"`
  User *User `xorm:"-" json:"user,omitempty"`
  Role *SceneAccess `xorm:"-" json:"role,omitempty"`
}
Data Model
user role permission
 "user": &graphql.Field{
   Type: userType,
   Resolve: func(p graphql.ResolveParams) (interface{}, error) {
     o, ok := p.Source.(*model.Shorten)
     if !ok {
       return nil, errMissingSource
     }
     if o.User != nil {
       return o.User, nil
     }
     return getUserFromLoader(p.Context, o.UserID)
   },
 },
exist in model?
fetch from loader
GET DATA FROM DATABASE IF NOT EXIST
func userBatch(ctx context.Context, keys dataloader.Keys) []*dataloader.Result {
  var results []*dataloader.Result
  id, _ := helper.GetCacheID(keys[0].String())
  user, err := model.GetUserByID(id.(int64))
  results = append(results, &dataloader.Result{
    Data: user,
    Error: err,
  })
  return results
}
fetch from DB
GRAPHQLDATALOADER
ONLY SUPPORT MEMORY, LRU OR TTL
CACHE
INTEGRATE WITH REDIS SERVICE
GRAPHQLDATALOADER
func	batchFunc(_	context.Context,	keys	dataloader.Keys)	[]*dataloader.Result	
{	
		results	:=	make([]*dataloader.Result,	len(keys))		
		//	get	what	you	can	from	redis	
		values,	_	:=	redisClient.MGet(...keys.Keys()).Result()	
		//	make	a	list	of	everything	that	was	not	found	in	redis	
		var	cacheMisses	map[int]string	
		for	i	:=	range	keys	{	
				if	values[i]	==	redis.Nil	{	
						cacheMisses[i]	=	keys[i].String()	
				}	else	{	
						results[i]	=	&dataloader.Result{values[i],	nil}	
				}	
		}	
		//	get	the	missing	items	from	more	expensive	location	(like	DB)	
		for	idx,	key	:=	range	cacheMisses	{	
				value,	err	:=	db.GetValues(key)	//	Pseudo	code!	
				redisClient.Set(key,	value)	
				results[idx]	=	&dataloader.Result{value,	err}	
		}	
		return	results	
}	
miss from redis
fetch from DB
HOW TO TEST GRAPHQL SCHEMA?
GRAPHQL TESTING
https://code.likeagirl.io/the-7-steps-to-a-complete-code-review-abdfd39e75f1
RAILS-LIKE TEST FIXTURES FOR GO
GO TEST FIXTURES
https://github.com/go-testfixtures/testfixtures
-
id: 1
email: foo@gmail.com
full_name: foo
avatar: http://foo.com
avatar_email: foo@gmail.com
-
id: 2
email: bar@gmail.com
full_name: bar
avatar: http://bar.com
avatar_email: bar@gmail.com
real data in DB
    test := T{
      Query: `
query QueryShortenURL (
$slug: String!
) {
QueryShortenURL(slug: $slug) {
url
}
}
   `,
      Schema: Schema,
      Expected: &graphql.Result{
        Data: map[string]interface{}{
          "QueryShortenURL": map[string]interface{}{
            "url": "http://example.com",
          },
        },
      },
    }
graphql query
expect data
  params := graphql.Params{
    Schema: test.Schema,
    RequestString: test.Query,
    Context: ctx,
    VariableValues: map[string]interface{}{
      "slug": "abcdef",
    },
  }
  testGraphql(test, params, t)
ctx := newContextWithUser(context.TODO(), user)
user data in context
graphql variable
all pass
testing in sqlite
GRAPHQLDEPLOYMENT
HOW TO DEPLOY GOLANG APP?
GO-GGZ/GGZ
AN URL SHORTENER SERVICE WRITTEN IN GO
https://github.com/go-ggz/ggz
Thanks

More Related Content

What's hot

What's hot (20)

Angular and The Case for RxJS
Angular and The Case for RxJSAngular and The Case for RxJS
Angular and The Case for RxJS
 
Github in Action
Github in ActionGithub in Action
Github in Action
 
Job Queue in Golang
Job Queue in GolangJob Queue in Golang
Job Queue in Golang
 
Typescript Fundamentals
Typescript FundamentalsTypescript Fundamentals
Typescript Fundamentals
 
Introducing type script
Introducing type scriptIntroducing type script
Introducing type script
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
Angular Avancé
Angular AvancéAngular Avancé
Angular Avancé
 
React & GraphQL
React & GraphQLReact & GraphQL
React & GraphQL
 
Clean code
Clean codeClean code
Clean code
 
TypeScript Best Practices
TypeScript Best PracticesTypeScript Best Practices
TypeScript Best Practices
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
Clean Architecture Essentials - Stockholm Software Craftsmanship
Clean Architecture Essentials - Stockholm Software CraftsmanshipClean Architecture Essentials - Stockholm Software Craftsmanship
Clean Architecture Essentials - Stockholm Software Craftsmanship
 
C# Async Await
C# Async AwaitC# Async Await
C# Async Await
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golang
 
Getting started with typescript
Getting started with typescriptGetting started with typescript
Getting started with typescript
 
Technologies sur angular.pptx
Technologies sur angular.pptxTechnologies sur angular.pptx
Technologies sur angular.pptx
 
Modern Java web applications with Spring Boot and Thymeleaf
Modern Java web applications with Spring Boot and ThymeleafModern Java web applications with Spring Boot and Thymeleaf
Modern Java web applications with Spring Boot and Thymeleaf
 
Intro to Git and GitHub
Intro to Git and GitHubIntro to Git and GitHub
Intro to Git and GitHub
 
Angular directives and pipes
Angular directives and pipesAngular directives and pipes
Angular directives and pipes
 
CI-CD WITH GITLAB WORKFLOW
CI-CD WITH GITLAB WORKFLOWCI-CD WITH GITLAB WORKFLOW
CI-CD WITH GITLAB WORKFLOW
 

Similar to GraphQL IN Golang

Functional programming using underscorejs
Functional programming using underscorejsFunctional programming using underscorejs
Functional programming using underscorejs
偉格 高
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best Practices
Yekmer Simsek
 

Similar to GraphQL IN Golang (20)

All things that are not code
All things that are not codeAll things that are not code
All things that are not code
 
Future of Web Apps: Google Gears
Future of Web Apps: Google GearsFuture of Web Apps: Google Gears
Future of Web Apps: Google Gears
 
Go react codelab
Go react codelabGo react codelab
Go react codelab
 
Angular Restmod (english version)
Angular Restmod (english version)Angular Restmod (english version)
Angular Restmod (english version)
 
HashiCorp Vault Plugin Infrastructure
HashiCorp Vault Plugin InfrastructureHashiCorp Vault Plugin Infrastructure
HashiCorp Vault Plugin Infrastructure
 
JavaScript Core
JavaScript CoreJavaScript Core
JavaScript Core
 
Google Cloud Endpoints: Building Third-Party APIs on Google AppEngine
Google Cloud Endpoints: Building Third-Party APIs on Google AppEngineGoogle Cloud Endpoints: Building Third-Party APIs on Google AppEngine
Google Cloud Endpoints: Building Third-Party APIs on Google AppEngine
 
Session 40 : SAGA Overview and Introduction
Session 40 : SAGA Overview and Introduction Session 40 : SAGA Overview and Introduction
Session 40 : SAGA Overview and Introduction
 
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
 
GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learned
 
Building an api using golang and postgre sql v1.0
Building an api using golang and postgre sql v1.0Building an api using golang and postgre sql v1.0
Building an api using golang and postgre sql v1.0
 
Tutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHPTutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHP
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScript
 
JavaScript - i och utanför webbläsaren (2010-03-03)
JavaScript - i och utanför webbläsaren (2010-03-03)JavaScript - i och utanför webbläsaren (2010-03-03)
JavaScript - i och utanför webbläsaren (2010-03-03)
 
Managing GraphQL servers with AWS Fargate & Prisma Cloud
Managing GraphQL servers  with AWS Fargate & Prisma CloudManaging GraphQL servers  with AWS Fargate & Prisma Cloud
Managing GraphQL servers with AWS Fargate & Prisma Cloud
 
Oleksandr Tarasenko "ORM vs GraphQL"
Oleksandr Tarasenko "ORM vs GraphQL"Oleksandr Tarasenko "ORM vs GraphQL"
Oleksandr Tarasenko "ORM vs GraphQL"
 
ORM vs GraphQL - Python fwdays 2019
ORM vs GraphQL - Python fwdays 2019ORM vs GraphQL - Python fwdays 2019
ORM vs GraphQL - Python fwdays 2019
 
Functional programming using underscorejs
Functional programming using underscorejsFunctional programming using underscorejs
Functional programming using underscorejs
 
GraphQL & Prisma from Scratch
GraphQL & Prisma from ScratchGraphQL & Prisma from Scratch
GraphQL & Prisma from Scratch
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best Practices
 

More from Bo-Yi Wu

More from Bo-Yi Wu (20)

Drone CI/CD 自動化測試及部署
Drone CI/CD 自動化測試及部署Drone CI/CD 自動化測試及部署
Drone CI/CD 自動化測試及部署
 
用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構
 
Golang Project Layout and Practice
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and Practice
 
Introduction to GitHub Actions
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub Actions
 
Drone 1.0 Feature
Drone 1.0 FeatureDrone 1.0 Feature
Drone 1.0 Feature
 
Drone CI/CD Platform
Drone CI/CD PlatformDrone CI/CD Platform
Drone CI/CD Platform
 
Go 語言基礎簡介
Go 語言基礎簡介Go 語言基礎簡介
Go 語言基礎簡介
 
drone continuous Integration
drone continuous Integrationdrone continuous Integration
drone continuous Integration
 
Gorush: A push notification server written in Go
Gorush: A push notification server written in GoGorush: A push notification server written in Go
Gorush: A push notification server written in Go
 
用 Drone 打造 輕量級容器持續交付平台
用 Drone 打造輕量級容器持續交付平台用 Drone 打造輕量級容器持續交付平台
用 Drone 打造 輕量級容器持續交付平台
 
用 Go 語言 打造微服務架構
用 Go 語言打造微服務架構用 Go 語言打造微服務架構
用 Go 語言 打造微服務架構
 
Introduction to Gitea with Drone
Introduction to Gitea with DroneIntroduction to Gitea with Drone
Introduction to Gitea with Drone
 
運用 Docker 整合 Laravel 提升團隊開發效率
運用 Docker 整合 Laravel 提升團隊開發效率運用 Docker 整合 Laravel 提升團隊開發效率
運用 Docker 整合 Laravel 提升團隊開發效率
 
用 Go 語言實戰 Push Notification 服務
用 Go 語言實戰 Push Notification 服務用 Go 語言實戰 Push Notification 服務
用 Go 語言實戰 Push Notification 服務
 
用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot
 
A painless self-hosted Git service: Gitea
A painless self-hosted Git service: GiteaA painless self-hosted Git service: Gitea
A painless self-hosted Git service: Gitea
 
用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式
 
Git flow 與團隊合作
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作
 
PHP & JavaScript & CSS Coding style
PHP & JavaScript & CSS Coding stylePHP & JavaScript & CSS Coding style
PHP & JavaScript & CSS Coding style
 
Docker 基礎介紹與實戰
Docker 基礎介紹與實戰Docker 基礎介紹與實戰
Docker 基礎介紹與實戰
 

Recently uploaded

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Recently uploaded (20)

The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 

GraphQL IN Golang