first issue
This commit is contained in:
parent
fe9b0be760
commit
cea33e9d36
|
@ -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)
|
||||
|
||||
}
|
|
@ -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(),
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package mutations
|
||||
|
||||
const (
|
||||
ADD_USER = `INSERT INTO users (firstname, lastname) VALUES ($1, $2)`
|
||||
)
|
|
@ -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
|
||||
},
|
||||
}
|
||||
}
|
|
@ -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()
|
||||
}
|
|
@ -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(),
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package queries
|
||||
|
||||
const (
|
||||
GET_USERS = `SELECT * FROM users`
|
||||
)
|
|
@ -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
|
||||
},
|
||||
}
|
||||
}
|
|
@ -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},
|
||||
},
|
||||
})
|
|
@ -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…
Reference in New Issue