├── server ├── routes │ ├── routes_test.go │ └── routes.go ├── api │ └── todo │ │ ├── route │ │ ├── todoroute_test.go │ │ └── todoroute.go │ │ ├── controller │ │ ├── todocontroller_test.go │ │ └── todocontroller.go │ │ ├── model │ │ ├── todomodel.go │ │ └── todomodel_test.go │ │ └── dao │ │ ├── tododao.go │ │ └── tododao_test.go ├── main.go ├── config │ ├── dbconfig.go │ └── dbconfig_test.go ├── cert │ ├── ca.csr │ ├── server.csr │ ├── server.key │ ├── ca.crt │ ├── server.crt │ └── ca.key └── README.md └── README.md /server/routes/routes_test.go: -------------------------------------------------------------------------------- 1 | package routes 2 | -------------------------------------------------------------------------------- /server/api/todo/route/todoroute_test.go: -------------------------------------------------------------------------------- 1 | package todoroute 2 | -------------------------------------------------------------------------------- /server/api/todo/controller/todocontroller_test.go: -------------------------------------------------------------------------------- 1 | package todocontroller 2 | -------------------------------------------------------------------------------- /server/routes/routes.go: -------------------------------------------------------------------------------- 1 | package routes 2 | 3 | import ( 4 | "ccgolang/server/api/todo/route" 5 | 6 | "github.com/labstack/echo" 7 | "github.com/labstack/echo/middleware" 8 | ) 9 | 10 | func Init(e *echo.Echo) { 11 | e.Pre(middleware.RemoveTrailingSlash()) 12 | 13 | todoroute.Init(e) 14 | } 15 | -------------------------------------------------------------------------------- /server/api/todo/route/todoroute.go: -------------------------------------------------------------------------------- 1 | package todoroute 2 | 3 | import ( 4 | "ccgolang/server/api/todo/controller" 5 | "github.com/labstack/echo" 6 | ) 7 | 8 | func Init(e *echo.Echo) { 9 | e.GET("/api/todos", todocontroller.GetAll) 10 | e.GET("/api/todos/:id", todocontroller.GetById) 11 | e.POST("/api/todos", todocontroller.NewTodo) 12 | e.DELETE("/api/todos/:id", todocontroller.RemoveTodo) 13 | } 14 | -------------------------------------------------------------------------------- /server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "ccgolang/server/routes" 6 | "github.com/labstack/echo" 7 | "github.com/labstack/echo/engine/standard" 8 | ) 9 | 10 | const port string = ":3333" 11 | 12 | func main() { 13 | 14 | fmt.Printf("Running at %v\n", port) 15 | 16 | e := echo.New() 17 | 18 | routes.Init(e) 19 | 20 | // e.Run(standard.WithTLS(port, "server/cert/server.crt", "server/cert/server.key")) 21 | e.Run(standard.New(port)) 22 | } 23 | -------------------------------------------------------------------------------- /server/config/dbconfig.go: -------------------------------------------------------------------------------- 1 | package dbconfig 2 | 3 | import ( 4 | "os" 5 | 6 | "gopkg.in/mgo.v2" 7 | ) 8 | 9 | type DB struct { 10 | Session *mgo.Session 11 | } 12 | 13 | func (db *DB) DoDial() (s *mgo.Session, err error) { 14 | return mgo.Dial(DBUrl()) 15 | } 16 | 17 | func (db *DB) Name() string { 18 | return "ccgolang" 19 | } 20 | 21 | func DBUrl() string { 22 | dburl := os.Getenv("MONGOHQ_URL") 23 | 24 | if dburl == "" { 25 | dburl = "localhost" 26 | } 27 | 28 | return dburl 29 | } 30 | -------------------------------------------------------------------------------- /server/api/todo/model/todomodel.go: -------------------------------------------------------------------------------- 1 | package todomodel 2 | 3 | import ( 4 | "time" 5 | 6 | "gopkg.in/mgo.v2/bson" 7 | ) 8 | 9 | type Todo struct { 10 | Id bson.ObjectId `json:"_id,omitempty" bson:"_id,omitempty"` 11 | TodoMessage string `json:"todoMessage,omitempty" bson:"todoMessage"` 12 | CreatedAt time.Time `json:"createdAt,omitempty" bson:"createdAt"` 13 | } 14 | 15 | func (t Todo) IsValid() bool { 16 | if l := len(t.TodoMessage); l > 4 { 17 | return true 18 | } 19 | 20 | return false 21 | } 22 | 23 | type Todos []Todo 24 | -------------------------------------------------------------------------------- /server/config/dbconfig_test.go: -------------------------------------------------------------------------------- 1 | package dbconfig 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | ) 9 | 10 | var db DB = DB{} 11 | 12 | func cleanEnv() { 13 | os.Setenv("MONGOHQ_URL", "") 14 | } 15 | 16 | func TestGetDbUrl(t *testing.T) { 17 | 18 | assert.Equal(t, "localhost", DBUrl()) 19 | 20 | os.Setenv("MONGOHQ_URL", "abc") 21 | 22 | assert.Equal(t, "abc", DBUrl()) 23 | 24 | cleanEnv() 25 | } 26 | 27 | func TestDBName(t *testing.T) { 28 | assert.Equal(t, "ccgolang", db.Name()) 29 | } 30 | 31 | func BenchmarkDoDial(b *testing.B) { 32 | for i := 0; i < b.N; i++ { 33 | db.DoDial() 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /server/cert/ca.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIB9DCCAV0CAQAwgYQxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRl 3 | MQ0wCwYDVQQHDARDaXR5MQ4wDAYDVQQKDAVBbGl2ITEQMA4GA1UECwwHMC4wLjAu 4 | MDEQMA4GA1UEAwwHMC4wLjAuMDEdMBsGCSqGSIb3DQEJARYOeW91ckBlbWFpbC5j 5 | b20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALfMFASyTkUUzzZnDmWp8zhO 6 | 6yeRBHi5dQ0XufltDNUpEbiO0Bk7qkfhAVW01lnwyZ1uDENPh7W+mc0fYMK4gW76 7 | J6bbu4yncU8Ry+vc/gEkzvXwLbhMd4rcH1dcVjcDXqXDkBaRk3M17DrErRGK7G// 8 | 7TP6UupC9KMQ/iEPld1ZAgMBAAGgLzAUBgkqhkiG9w0BCQIxBwwFQWxpdiEwFwYJ 9 | KoZIhvcNAQkHMQoMCEl0c0FsaXZlMA0GCSqGSIb3DQEBCwUAA4GBAFFaMn2vvrp+ 10 | zRYpcv4W+KRbZvQwBbSdpw7FcCDK0Hh0D/AYwQWLOn66pR+DfczdHSOKd4W9vwkC 11 | eanyRBFbKDYv3o3JG+rvRM6+rVrh122qDLabtUzsvuZI667twfoIYB9g93sjT0Zx 12 | PvezS863TzA9aSGr78PxAdj3i1do8Vcg 13 | -----END CERTIFICATE REQUEST----- 14 | -------------------------------------------------------------------------------- /server/cert/server.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIB9DCCAV0CAQAwgYQxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRl 3 | MQ0wCwYDVQQHDARDaXR5MQ4wDAYDVQQKDAVBbGl2ITEQMA4GA1UECwwHMC4wLjAu 4 | MDEQMA4GA1UEAwwHMC4wLjAuMDEdMBsGCSqGSIb3DQEJARYOeW91ckBlbWFpbC5j 5 | b20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANtfD3IBbEn/x4WNqbJ31Q/3 6 | mncq7YM14xGmi44Zyd4VOJUl518Vob9o6EvyJmuv3q+FKx1IKTUkwJ2ZjcKMqvpc 7 | NEOS1/sc6OtjPL4DRKR8hSyKlluggrJkUixvydgq4v7dFbzK55NDCbv4JOxSh50w 8 | 3CzkUjgzw+8KVqGXBy8nAgMBAAGgLzAUBgkqhkiG9w0BCQIxBwwFQWxpdiEwFwYJ 9 | KoZIhvcNAQkHMQoMCEl0c0FsaXZlMA0GCSqGSIb3DQEBCwUAA4GBAIAJdL9+zBIQ 10 | CWk71pW/U71qFkSRK3sQTT6phDHmqvkrS742VOLgSWcRS0bNcRFqmImNzkjQk+mV 11 | 34jpnxBG0dW8WnNnb9HrrcLvLdYPKOwuDwsBuE1v527l4V4+uSp3/pEn92Z1Dgdu 12 | 5Zau1Ru7LG5ZrvgR53PTuy1qwz8e8Gz+ 13 | -----END CERTIFICATE REQUEST----- 14 | -------------------------------------------------------------------------------- /server/api/todo/controller/todocontroller.go: -------------------------------------------------------------------------------- 1 | package todocontroller 2 | 3 | import ( 4 | "ccgolang/server/api/todo/dao" 5 | todo "ccgolang/server/api/todo/model" 6 | "github.com/labstack/echo" 7 | "net/http" 8 | ) 9 | 10 | func GetAll(c echo.Context) error { 11 | ts, _ := tododao.All() 12 | 13 | return c.JSON(http.StatusOK, ts) 14 | } 15 | 16 | func GetById(c echo.Context) error { 17 | id := c.Param("id") 18 | 19 | nt, _ := tododao.GetById(id) 20 | 21 | return c.JSON(http.StatusOK, nt) 22 | } 23 | 24 | func NewTodo(c echo.Context) error { 25 | t := new(todo.Todo) 26 | 27 | c.Bind(t) 28 | 29 | nt, _ := tododao.NewTodo(*t) 30 | 31 | return c.JSON(http.StatusOK, nt) 32 | } 33 | 34 | func RemoveTodo(c echo.Context) error { 35 | id := c.Param("id") 36 | 37 | tododao.DeleteTodo(id) 38 | 39 | return c.String(http.StatusOK, "") 40 | } 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GolangMgoRestServer 2 | 3 | 4 | ####0. go get pkg 5 | ``` 6 | echo is Fast and unfancy HTTP server framework for Go (Golang). Up to 10x faster than the rest. 7 | go get -u github.com/labstack/echo 8 | 9 | mgo is mongodb driver golang 10 | ex) Firebase 11 | go get gopkg.in/mgo.v2 12 | ``` 13 | 14 | 15 | ####1. run local mongodb and run golang server 16 | ``` 17 | go run main.go 18 | //You can see this message. 19 | => Running at :3333 20 | ``` 21 | 22 | ####2. rest api 23 | ``` 24 | http://localhost:3333/api/todos/ 25 | 26 | ex) POST body 27 | { 28 | "TodoMessage": "foo bar" 29 | } 30 | ``` 31 | 32 | ####3. http://localhost:3333/api/todos/ 33 | ``` 34 | func Init(e *echo.Echo) { 35 | e.GET("/api/todos", todocontroller.GetAll) 36 | e.GET("/api/todos/:id", todocontroller.GetById) 37 | e.POST("/api/todos", todocontroller.NewTodo) 38 | e.DELETE("/api/todos/:id", todocontroller.RemoveTodo) 39 | } 40 | ``` 41 | -------------------------------------------------------------------------------- /server/README.md: -------------------------------------------------------------------------------- 1 | # GolangMgoRestServer 2 | 3 | 4 | ####0. go get pkg 5 | ``` 6 | echo is Fast and unfancy HTTP server framework for Go (Golang). Up to 10x faster than the rest. 7 | go get -u github.com/labstack/echo 8 | 9 | mgo is mongodb driver golang 10 | ex) Firebase 11 | go get gopkg.in/mgo.v2 12 | ``` 13 | 14 | 15 | ####1. run local mongodb and run golang server 16 | ``` 17 | go run main.go 18 | //You can see this message. 19 | => Running at :3333 20 | ``` 21 | 22 | ####2. rest api 23 | ``` 24 | http://localhost:3333/api/todos/ 25 | 26 | ex) POST body 27 | { 28 | "TodoMessage": "foo bar" 29 | } 30 | ``` 31 | 32 | ####3. http://localhost:3333/api/todos/ 33 | ``` 34 | func Init(e *echo.Echo) { 35 | e.GET("/api/todos", todocontroller.GetAll) 36 | e.GET("/api/todos/:id", todocontroller.GetById) 37 | e.POST("/api/todos", todocontroller.NewTodo) 38 | e.DELETE("/api/todos/:id", todocontroller.RemoveTodo) 39 | } 40 | ``` 41 | -------------------------------------------------------------------------------- /server/cert/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIICWwIBAAKBgQDbXw9yAWxJ/8eFjamyd9UP95p3Ku2DNeMRpouOGcneFTiVJedf 3 | FaG/aOhL8iZrr96vhSsdSCk1JMCdmY3CjKr6XDRDktf7HOjrYzy+A0SkfIUsipZb 4 | oIKyZFIsb8nYKuL+3RW8yueTQwm7+CTsUoedMNws5FI4M8PvClahlwcvJwIDAQAB 5 | AoGAKqJp/Q07v5H/c/xZS78wYH8NvTVRndueOvL0UnS+n/Pd4FbShc9NdUbtRr1U 6 | LD+s9s3Z2EILCDIRYU/TlkkCfXOtx6mNJFGqbMDWaV2Lsa7PNzu8dIYyPF47uB+5 7 | 6O49IQNhnfIhlEcELzScHzhrVUBoNMOVQ3Xxx23kMK3pGbkCQQD5B/sX2WIV9W0N 8 | TvjA+dyF9EHZVxpni5W37Hkpkt17DnWJd0rUR2a6oiCM1pmLjBi4YmUXH/IYy2DE 9 | VL2sdLw9AkEA4YKZ5QAMKFxXVqYnbEcO5viqo1hK9RiV4W/DPnS1vpoLIqUxG/V8 10 | VWywC3e7BP8kUpR9DtGeA40E3R5mMgxbMwJABkIkFkpZQ7ICRpZYfAkLeLZVvU+K 11 | E1YXsiKYPOo69K+9VnIQCFuvAju207NE8pPXvzKB1d3wqJzb1rNGfQIGBQJAeHbs 12 | wMDqvbC+UyJFEvlOg6G4fbOPrygoAJpUYQu1fpEJe8Nk3XugpH1/+VBHTl8BRz/d 13 | Ikplr53oSDqR+xBQswJAbqE5/cMYBBO5ttuutryHs6Xc/WKJ2jkC1r5GMStmNE+p 14 | ZjsdgOoAMEKB97/foVrXEhDy67bc1htugN2j17Ls5w== 15 | -----END RSA PRIVATE KEY----- 16 | -------------------------------------------------------------------------------- /server/cert/ca.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICgTCCAeoCCQCbu4YUckO4EjANBgkqhkiG9w0BAQsFADCBhDELMAkGA1UEBhMC 3 | QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxDTALBgNVBAcMBENpdHkxDjAMBgNVBAoM 4 | BUFsaXYhMRAwDgYDVQQLDAcwLjAuMC4wMRAwDgYDVQQDDAcwLjAuMC4wMR0wGwYJ 5 | KoZIhvcNAQkBFg55b3VyQGVtYWlsLmNvbTAeFw0xNjAzMTQxNDU3NDlaFw0yNjAz 6 | MTIxNDU3NDlaMIGEMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEN 7 | MAsGA1UEBwwEQ2l0eTEOMAwGA1UECgwFQWxpdiExEDAOBgNVBAsMBzAuMC4wLjAx 8 | EDAOBgNVBAMMBzAuMC4wLjAxHTAbBgkqhkiG9w0BCQEWDnlvdXJAZW1haWwuY29t 9 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3zBQEsk5FFM82Zw5lqfM4Tusn 10 | kQR4uXUNF7n5bQzVKRG4jtAZO6pH4QFVtNZZ8MmdbgxDT4e1vpnNH2DCuIFu+iem 11 | 27uMp3FPEcvr3P4BJM718C24THeK3B9XXFY3A16lw5AWkZNzNew6xK0Riuxv/+0z 12 | +lLqQvSjEP4hD5XdWQIDAQABMA0GCSqGSIb3DQEBCwUAA4GBALbWUrdducmvByt7 13 | 4B9aArwJpTpeNejP03vHOLKmGGk1RGQv+3/GwTuBSQL0VhpPHzsNeYBTGuGCNGVW 14 | d68qxBblXN6xxjgPWC7bIKSIvWZ7UVrNn3ALXnADTMVpo2GM/jBbyrswl8Nd4DOm 15 | m7xL0momhmWDCsbkCd4OXNnArMPf 16 | -----END CERTIFICATE----- 17 | -------------------------------------------------------------------------------- /server/cert/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICgTCCAeoCCQDSnca52HRzHzANBgkqhkiG9w0BAQsFADCBhDELMAkGA1UEBhMC 3 | QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxDTALBgNVBAcMBENpdHkxDjAMBgNVBAoM 4 | BUFsaXYhMRAwDgYDVQQLDAcwLjAuMC4wMRAwDgYDVQQDDAcwLjAuMC4wMR0wGwYJ 5 | KoZIhvcNAQkBFg55b3VyQGVtYWlsLmNvbTAeFw0xNjAzMTQxNTAxMDhaFw0yNjAz 6 | MTIxNTAxMDhaMIGEMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEN 7 | MAsGA1UEBwwEQ2l0eTEOMAwGA1UECgwFQWxpdiExEDAOBgNVBAsMBzAuMC4wLjAx 8 | EDAOBgNVBAMMBzAuMC4wLjAxHTAbBgkqhkiG9w0BCQEWDnlvdXJAZW1haWwuY29t 9 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDbXw9yAWxJ/8eFjamyd9UP95p3 10 | Ku2DNeMRpouOGcneFTiVJedfFaG/aOhL8iZrr96vhSsdSCk1JMCdmY3CjKr6XDRD 11 | ktf7HOjrYzy+A0SkfIUsipZboIKyZFIsb8nYKuL+3RW8yueTQwm7+CTsUoedMNws 12 | 5FI4M8PvClahlwcvJwIDAQABMA0GCSqGSIb3DQEBCwUAA4GBAIuplVDtWiDsotsc 13 | uGw65nST4864k3+GwLML34nAT1hB3bjzu4ITIGz7viWXIfLV6niQXHTe2q3FoIj3 14 | FjXqaQXNEvb5D++eBLzZpi1BfedISXzaDZYoRRCP1or3rChnFB7t8yv1C2qgYeFj 15 | DZAb1e25eTIAhSZyRITCUIiOAVlg 16 | -----END CERTIFICATE----- 17 | -------------------------------------------------------------------------------- /server/cert/ca.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | Proc-Type: 4,ENCRYPTED 3 | DEK-Info: DES-EDE3-CBC,D708975DF96D564B 4 | 5 | ELsYF4Ix/FBJVCjFbbDKLrGYl0PSbtZJ1NzCuLgFQLYOtH/B6k/vPPFF3Q1yrAUf 6 | 74CWoQGtUBrx5alAc8I/t2IQTAGtrYpd3q8JB7K41Ki+7wLjVuXNZv7gF2+1emKu 7 | 3BDPGNvDyEukEwsM/nRlArgJAJuOsZ4NEGsHf6LaEjku26UeoPeR+c2K95tKU89b 8 | +vOjwo2I87jJPRhSiiiMRA/q7FerbIUrsVg17AlPO5+I5V7nk8JKP03ODr815tzu 9 | 1N/q9gTyUdV+0Nppvy8FgN2HZcI2f+q1dQfOksFhXv7WWaGlttCgAGA1TZRzvLY2 10 | D5FQg7bAMroCQhBQbTulIuyiiBMGOykQadRKI9MHLjZuCZpBG1Vl1YoQaMCumyy6 11 | /F7+Dp5lX7tEaDP7ALIkxQ3J3FuWVbh9IaTSUvcNTM8MdaRPzt5s7PxVuNbLkXOn 12 | THcOEp/2RSaDM0EQoCIaVEqysIKvObG/INni8jhI2v/a+rlc+f1/y81JvgIV6vjh 13 | KSaWZNSvhtA0QTFk9MbsTEJJJmq6wsQm52z02AyU5aAZ43ew4TglW3+GR2f851R6 14 | JsNJXtdb64BCOfyl/WDJhFcXGJHjk42wYaDkExNprBIc7Sz/IRPMjIlSkWAVGp6M 15 | yIthUsDU/ovf3pJqcdgKTt/9c7v2fItMS/YLiQKhWca/5wK7tmdIng8AGUICyuWb 16 | rpyCASRAQePKj5dqDRxkUVfI43AClSeAy3RQei3t4qjXi6c0iMBdlLt4nCd2dD59 17 | e+yW7KaeTjQSzqKq32PClcCXuL6Bw/ltoQ3JbPEr6ZsnfOHR3PT2Lw== 18 | -----END RSA PRIVATE KEY----- 19 | -------------------------------------------------------------------------------- /server/api/todo/model/todomodel_test.go: -------------------------------------------------------------------------------- 1 | package todomodel 2 | 3 | import ( 4 | "testing" 5 | "time" 6 | 7 | "github.com/stretchr/testify/assert" 8 | "gopkg.in/mgo.v2/bson" 9 | ) 10 | 11 | var testsModel = []struct { 12 | in Todo 13 | out bool 14 | }{ 15 | { 16 | in: Todo{bson.NewObjectId(), "", time.Now()}, 17 | out: false, 18 | }, 19 | { 20 | in: Todo{bson.NewObjectId(), "sml", time.Now()}, 21 | out: false, 22 | }, 23 | { 24 | in: Todo{bson.NewObjectId(), "biggggg", time.Now()}, 25 | out: true, 26 | }, 27 | { 28 | in: Todo{bson.NewObjectId(), "juste", time.Now()}, 29 | out: true, 30 | }, 31 | { 32 | in: Todo{bson.NewObjectId(), "1231231321", time.Now()}, 33 | out: true, 34 | }, 35 | { 36 | in: Todo{bson.NewObjectId(), "12312313211231231321123123132112312313211231231321123123132", time.Now()}, 37 | out: true, 38 | }, 39 | } 40 | 41 | func TestIsValid(t *testing.T) { 42 | for _, _test := range testsModel { 43 | assert.Equal(t, _test.out, _test.in.IsValid()) 44 | } 45 | } 46 | 47 | func BenchmarkIsValid(b *testing.B) { 48 | t := Todo{bson.NewObjectId(), "", time.Now()} 49 | 50 | for i := 0; i < b.N; i++ { 51 | t.IsValid() 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /server/api/todo/dao/tododao.go: -------------------------------------------------------------------------------- 1 | package tododao 2 | 3 | import ( 4 | "errors" 5 | todo "ccgolang/server/api/todo/model" 6 | "ccgolang/server/config" 7 | "gopkg.in/mgo.v2/bson" 8 | "time" 9 | ) 10 | 11 | const col string = "todos" 12 | 13 | func All() (todo.Todos, error) { 14 | db := dbconfig.DB{} 15 | ts := todo.Todos{} 16 | 17 | s, err := db.DoDial() 18 | 19 | if err != nil { 20 | return ts, errors.New("There was an error trying to connect with the DB.") 21 | } 22 | 23 | defer s.Close() 24 | 25 | c := s.DB(db.Name()).C(col) 26 | 27 | err = c.Find(bson.M{}).All(&ts) 28 | 29 | if err != nil { 30 | return ts, errors.New("There was an error trying to find the todos.") 31 | } 32 | 33 | return ts, err 34 | } 35 | 36 | func GetById(id string) (todo.Todo, error) { 37 | db := dbconfig.DB{} 38 | t := todo.Todo{} 39 | 40 | s, err := db.DoDial() 41 | 42 | if err != nil { 43 | return t, errors.New("There was an error trying to connect with the DB.") 44 | } 45 | 46 | defer s.Close() 47 | 48 | c := s.DB(db.Name()).C(col) 49 | 50 | err = c.Find(bson.M{"_id" : bson.ObjectIdHex(id)}).One(&t) 51 | 52 | if err != nil { 53 | return t, errors.New("There was an error trying to find the todos.") 54 | } 55 | 56 | return t, err 57 | } 58 | 59 | func NewTodo(t todo.Todo) (todo.Todo, error) { 60 | db := dbconfig.DB{} 61 | t.Id = bson.NewObjectId() 62 | t.CreatedAt = time.Now() 63 | 64 | s, err := db.DoDial() 65 | 66 | if err != nil { 67 | return t, errors.New("There was an error trying to connect to the DB.") 68 | } 69 | 70 | defer s.Close() 71 | 72 | c := s.DB(db.Name()).C(col) 73 | 74 | err = c.Insert(t) 75 | 76 | if err != nil { 77 | return t, errors.New("There was an error trying to insert the doc to the DB.") 78 | } 79 | 80 | return t, err 81 | } 82 | 83 | func DeleteTodo(id string) error { 84 | db := dbconfig.DB{} 85 | 86 | s, err := db.DoDial() 87 | 88 | if err != nil { 89 | return errors.New("There was an error trying to connect with the DB.") 90 | } 91 | 92 | idoi := bson.ObjectIdHex(id) 93 | 94 | defer s.Close() 95 | 96 | c := s.DB(db.Name()).C(col) 97 | 98 | err = c.RemoveId(idoi) 99 | 100 | if err != nil { 101 | return errors.New("There was an error trying to remove the todo.") 102 | } 103 | 104 | return err 105 | } 106 | -------------------------------------------------------------------------------- /server/api/todo/dao/tododao_test.go: -------------------------------------------------------------------------------- 1 | package tododao 2 | 3 | import ( 4 | todo "bitbucket.org/ted/ccgolang/server/api/todo/model" 5 | "github.com/stretchr/testify/assert" 6 | "gopkg.in/mgo.v2" 7 | "gopkg.in/mgo.v2/bson" 8 | "testing" 9 | "time" 10 | ) 11 | 12 | const testDBUrl string = "localhost" 13 | const testDBName string = "ccgolang" 14 | const collName string = "todos" 15 | 16 | var id bson.ObjectId = bson.NewObjectId() 17 | 18 | func clearDB() { 19 | s, err := mgo.Dial(testDBUrl) 20 | 21 | if err != nil { 22 | panic(err) 23 | } 24 | 25 | defer s.Close() 26 | 27 | c := s.DB(testDBName).C(collName) 28 | 29 | _, err = c.RemoveAll(bson.M{}) 30 | 31 | if err != nil { 32 | panic(err) 33 | } 34 | } 35 | 36 | func createTodo(t *todo.Todo) { 37 | s, _ := mgo.Dial(testDBUrl) 38 | 39 | c := s.DB(testDBName).C(collName) 40 | 41 | err := c.Insert(t) 42 | 43 | if err != nil { 44 | panic(err) 45 | } 46 | } 47 | 48 | func findTodoJustCreated() todo.Todo { 49 | t := todo.Todo{} 50 | 51 | s, err := mgo.Dial(testDBUrl) 52 | 53 | if err != nil { 54 | panic(err) 55 | } 56 | 57 | defer s.Close() 58 | 59 | c := s.DB(testDBName).C(collName) 60 | 61 | err = c.Find(bson.M{"_id": id}).One(&t) 62 | 63 | if err != nil { 64 | panic(err) 65 | } 66 | 67 | return t 68 | } 69 | 70 | func TestNewTodo(t *testing.T) { 71 | 72 | td := todo.Todo{id, "1234556", time.Now()} 73 | 74 | createTodo(&td) 75 | 76 | assert.Equal(t, td.TodoMessage, findTodoJustCreated().TodoMessage) 77 | assert.Equal(t, td.Id, findTodoJustCreated().Id) 78 | 79 | clearDB() 80 | } 81 | 82 | func TestAll(t *testing.T) { 83 | 84 | ts := todo.Todos{} 85 | 86 | td0 := todo.Todo{bson.NewObjectId(), "12345560", time.Now()} 87 | td1 := todo.Todo{bson.NewObjectId(), "12345561", time.Now()} 88 | td2 := todo.Todo{bson.NewObjectId(), "12345562", time.Now()} 89 | td3 := todo.Todo{bson.NewObjectId(), "12345563", time.Now()} 90 | td4 := todo.Todo{bson.NewObjectId(), "12345564", time.Now()} 91 | 92 | createTodo(&td0) 93 | createTodo(&td1) 94 | createTodo(&td2) 95 | createTodo(&td3) 96 | createTodo(&td4) 97 | 98 | ts, _ = All() 99 | 100 | assert.Equal(t, td0.TodoMessage, ts[0].TodoMessage) 101 | assert.Equal(t, td1.TodoMessage, ts[1].TodoMessage) 102 | assert.Equal(t, td2.TodoMessage, ts[2].TodoMessage) 103 | assert.Equal(t, td3.TodoMessage, ts[3].TodoMessage) 104 | assert.Equal(t, td4.TodoMessage, ts[4].TodoMessage) 105 | 106 | clearDB() 107 | } 108 | 109 | func TestDeleteTodo(t *testing.T) { 110 | 111 | td := todo.Todo{bson.NewObjectId(), "some text here", time.Now()} 112 | ftd := todo.Todo{} 113 | 114 | createTodo(&td) 115 | 116 | err := DeleteTodo(td.Id.Hex()) 117 | 118 | if err != nil { 119 | panic(err) 120 | } 121 | 122 | s, _ := mgo.Dial(testDBUrl) 123 | 124 | c := s.DB(testDBName).C(collName) 125 | 126 | err = c.Find(bson.M{"_id": td.Id}).One(&ftd) 127 | 128 | if err != nil { 129 | assert.NotEqual(t, td, ftd) 130 | } 131 | 132 | clearDB() 133 | } 134 | 135 | func BenchmarkNewTodo(b *testing.B) { 136 | 137 | td := todo.Todo{id, "something here", time.Now()} 138 | 139 | for i := 0; i < b.N; i++ { 140 | NewTodo(td) 141 | } 142 | 143 | clearDB() 144 | } 145 | 146 | func BenchmarkAll(b *testing.B) { 147 | 148 | td0 := todo.Todo{bson.NewObjectId(), "12345560", time.Now()} 149 | td1 := todo.Todo{bson.NewObjectId(), "12345561", time.Now()} 150 | td2 := todo.Todo{bson.NewObjectId(), "12345562", time.Now()} 151 | td3 := todo.Todo{bson.NewObjectId(), "12345563", time.Now()} 152 | td4 := todo.Todo{bson.NewObjectId(), "12345564", time.Now()} 153 | 154 | createTodo(&td0) 155 | createTodo(&td1) 156 | createTodo(&td2) 157 | createTodo(&td3) 158 | createTodo(&td4) 159 | 160 | for i := 0; i < b.N; i++ { 161 | _, _ = All() 162 | } 163 | 164 | clearDB() 165 | } 166 | --------------------------------------------------------------------------------