Skip to content

OwlLaboratory/graphql_mongodb_golang_server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Simple GraphQL + MongoDB Golang server

Why this repo ?

Since a few months I was curious to discover two new concepts: Golang and GraphQL A few days ago, I started to create my own GraphQL Golang server with MongoDB as a database.

I'm pretty sure it will help some people understand how a Golang GraphQL server works.

Of course I have very little experience under these two technologies, so I do not guarantee anything.

Run server

    git clone https://github.com/OwlLaboratory/graphql_mongodb_golang_server $HOME/go/src/github.com/OwlLaboratory/graphql_mongodb_golang_server
    cd $HOME/go/src/github.com/OwlLaboratory/graphql_mongodb_golang_server/
    go get ./...
    go build server.go
    ./server

Then: open http://localhost:8080

Server + ODM

For the server part I based on the neelance server (he is the main creator of GopherJS)

For the ODM I based on mongodm (which I slightly modified)

MongoDB is configured on localhost:27017 by default (you can change config in mongo.go)

I try to follow some best practices and implement a CLEAR architecture for a module

I implemented a simple CRUD on a Mongo collection called "Channel" and defined like this:

{
  id: ObjectID,
  name: string,
  platform {
    name: string
  },
  created: MongoDate
  updated: MongoDate
}

Available queries:

		channel(id: String!): Channel
		channels(first: Int, offset: Int): [Channel]

Available mutations:

		createChannel(input: CreateChannelInput!): Channel
		updateChannel(input: UpdateChannelInput!): Channel
		deleteChannel(input: DeleteChannelInput!): Channel

Example of GraphQL requests:

mutation createChannel {
	createChannel(input: {channel: {name: "Channel 1", platform: {name: "Platform for channel 1"}}}) {
    id
 		name
    platform {
      name
    }
	}
}

mutation updateChannel {
	updateChannel(input: {id: "5a9b13a7e1382307023003d7", patch: {platform: {name: "Yolo"}}}) {
 		name
    platform {
      name
    }
	}
}

mutation deleteChannel {
	deleteChannel(input: {id: "5a9b13a7e1382307023003d7"}) {
 		name
	}
}

{
  channels(first: 1, offset: 1) {
    id
    name
  }
}


{
  channel(id: "5a9b13a7e1382307023003d7") {
    name
    platform {
      name
    }
  }
}

Architecture

I tried to implement a clear architecture rather than storing everything in a "models" package

Each collection is represented as an independent package containing all the resources needed for GraphQL Server.

Example for channel collection

module

Run server

    git clone https://github.com/OwlLaboratory/graphql_mongodb_golang_server $HOME/go/src/github.com/OwlLaboratory/graphql_mongodb_golang_server
    cd $HOME/go/src/github.com/OwlLaboratory/graphql_mongodb_golang_server/
    go get ./...
    go build server.go
    ./server

Then: open http://localhost:8080

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages