Browse Source

first issue

develop
Matthieu Lamalle 11 months ago
commit
af2391cf28
11 changed files with 241 additions and 0 deletions
  1. BIN
      graphql
  2. +45
    -0
      main.go
  3. +12
    -0
      mutations/mutations.go
  4. +5
    -0
      mutations/requests.go
  5. +35
    -0
      mutations/user.go
  6. +37
    -0
      postgres/postgres.go
  7. +12
    -0
      queries/queries.go
  8. +5
    -0
      queries/requests.go
  9. +37
    -0
      queries/user.go
  10. +20
    -0
      types/role.go
  11. +33
    -0
      types/user.go

BIN
graphql View File


+ 45
- 0
main.go View File

@@ -0,0 +1,45 @@
package main

import (
"cadoles/graphql/mutations"
"cadoles/graphql/postgres"
"cadoles/graphql/queries"
"log"
"net/http"

"github.com/graphql-go/graphql"
"github.com/graphql-go/handler"
)

func main() {

schemaConfig := graphql.SchemaConfig{
Query: graphql.NewObject(graphql.ObjectConfig{
Name: "RootQuery",
Fields: queries.GetRootFields(),
}),
Mutation: graphql.NewObject(graphql.ObjectConfig{
Name: "RootMutation",
Fields: mutations.GetRootFields(),
}),
}

schema, err := graphql.NewSchema(schemaConfig)

if err != nil {
log.Fatalf("Failed to create new schema, error: %v", err)
}

httpHandler := handler.New(&handler.Config{
Schema: &schema,
})

postgres.DBConnect()
defer postgres.DBClose()

http.Handle("/", httpHandler)
log.Print("ready: listening...\n")

http.ListenAndServe(":8383", nil)

}

+ 12
- 0
mutations/mutations.go View File

@@ -0,0 +1,12 @@
package mutations

import (
"github.com/graphql-go/graphql"
)

// GetRootFields returns all the available mutations.
func GetRootFields() graphql.Fields {
return graphql.Fields{
"createUser": GetCreateUserMutation(),
}
}

+ 5
- 0
mutations/requests.go View File

@@ -0,0 +1,5 @@
package mutations

const (
ADD_USER = `INSERT INTO users (firstname, lastname) VALUES ($1, $2)`
)

+ 35
- 0
mutations/user.go View File

@@ -0,0 +1,35 @@
package mutations

import (
"cadoles/graphql/postgres"
"cadoles/graphql/types"

"github.com/graphql-go/graphql"
)

// GetCreateUserMutation creates a new user and returns it.
func GetCreateUserMutation() *graphql.Field {
return &graphql.Field{
Type: types.UserType,
Args: graphql.FieldConfigArgument{
"firstname": &graphql.ArgumentConfig{
Type: graphql.NewNonNull(graphql.String),
},
"lastname": &graphql.ArgumentConfig{
Type: graphql.NewNonNull(graphql.String),
},
},
Resolve: func(params graphql.ResolveParams) (interface{}, error) {
user := &types.User{
Firstname: params.Args["firstname"].(string),
Lastname: params.Args["lastname"].(string),
}

_, err := postgres.DB.Exec(ADD_USER, user.Firstname, user.Lastname)
if err != nil {
panic(err)
}
return user, nil
},
}
}

+ 37
- 0
postgres/postgres.go View File

@@ -0,0 +1,37 @@
package postgres

import (
"database/sql"
"fmt"

_ "github.com/lib/pq"
)

const (
DB_HOST = "localhost"
DB_PORT = "5432"
DB_USER = "graphql"
DB_PASSWORD = "graphql"
DB_NAME = "graphql"
)

var (
DB *sql.DB
)

func checkErr(err error, DB *sql.DB) {
if err != nil {
panic(err)
}
}

func DBConnect() {
dbinfo := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME)
var err error
DB, err = sql.Open("postgres", dbinfo)
checkErr(err, DB)
}
func DBClose() {
DB.Close()
}

+ 12
- 0
queries/queries.go View File

@@ -0,0 +1,12 @@
package queries

import (
"github.com/graphql-go/graphql"
)

// GetRootFields returns all the available queries.
func GetRootFields() graphql.Fields {
return graphql.Fields{
"user": GetUserQuery(),
}
}

+ 5
- 0
queries/requests.go View File

@@ -0,0 +1,5 @@
package queries

const (
GET_USERS = `SELECT * FROM users`
)

+ 37
- 0
queries/user.go View File

@@ -0,0 +1,37 @@
package queries

import (
"cadoles/graphql/postgres"
"cadoles/graphql/types"
"log"

"github.com/graphql-go/graphql"
)

// GetUserQuery returns the queries available against user type.
func GetUserQuery() *graphql.Field {
log.Print("GetUserQuery")
return &graphql.Field{
Type: graphql.NewList(types.UserType),
Resolve: func(params graphql.ResolveParams) (interface{}, error) {
var user types.User
users := []types.User{}

sqlStatement := GET_USERS
rows, err := postgres.DB.Query(sqlStatement)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {

err := rows.Scan(&user.ID, &user.Firstname, &user.Lastname)
users = append(users, user)
if err != nil {
log.Fatalln(err)
}
}
return users, nil
},
}
}

+ 20
- 0
types/role.go View File

@@ -0,0 +1,20 @@
package types

import (
"github.com/graphql-go/graphql"
)

// Role type definition.
type Role struct {
ID int `db:"id" json:"id"`
Name string `db:"name" json:"name"`
}

// RoleType is the GraphQL schema for the user type.
var RoleType = graphql.NewObject(graphql.ObjectConfig{
Name: "Role",
Fields: graphql.Fields{
"id": &graphql.Field{Type: graphql.Int},
"name": &graphql.Field{Type: graphql.String},
},
})

+ 33
- 0
types/user.go View File

@@ -0,0 +1,33 @@
package types

import (
"github.com/graphql-go/graphql"
)

// User type definition.
type User struct {
ID int `db:"id" json:"id"`
Firstname string `db:"firstname" json:"firstname"`
Lastname string `db:"lastname" json:"lastname"`
}

// UserType is the GraphQL schema for the user type.
var UserType = graphql.NewObject(graphql.ObjectConfig{
Name: "User",
Fields: graphql.Fields{
"id": &graphql.Field{Type: graphql.Int},
"firstname": &graphql.Field{Type: graphql.String},
"lastname": &graphql.Field{Type: graphql.String},
"roles": &graphql.Field{
Type: graphql.NewList(RoleType),
Resolve: func(params graphql.ResolveParams) (interface{}, error) {
var roles []Role

// userID := params.Source.(User).ID
// Implement logic to retrieve user associated roles from user id here.

return roles, nil
},
},
},
})

Loading…
Cancel
Save