From ab66454020c4ad32397d91b4e41a41c5062c8bcc Mon Sep 17 00:00:00 2001 From: Pin Date: Sun, 31 Jan 2021 16:45:18 -0500 Subject: [PATCH] initial commit Signed-off-by: Pin --- .gitignore | 1 + README.md | 1 + db/connectdb.go | 24 +++++++++++++++++ db/dbinit/dbinit.go | 46 +++++++++++++++++++++++++++++++ db/dbinit/dbinit.psql | 4 +++ db/dbmigrate/migrate.go | 60 +++++++++++++++++++++++++++++++++++++++++ db/randomselect.go | 17 ++++++++++++ handlers/apihandler.go | 33 +++++++++++++++++++++++ init.go | 12 +++++++++ main.go | 21 +++++++++++++++ structs/queryrow.go | 11 ++++++++ 11 files changed, 230 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 db/connectdb.go create mode 100644 db/dbinit/dbinit.go create mode 100644 db/dbinit/dbinit.psql create mode 100644 db/dbmigrate/migrate.go create mode 100644 db/randomselect.go create mode 100644 handlers/apihandler.go create mode 100644 init.go create mode 100644 main.go create mode 100644 structs/queryrow.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env diff --git a/README.md b/README.md new file mode 100644 index 0000000..cfb5906 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +This is a simple Dog API written in Go diff --git a/db/connectdb.go b/db/connectdb.go new file mode 100644 index 0000000..d223be5 --- /dev/null +++ b/db/connectdb.go @@ -0,0 +1,24 @@ +package db + +import ( + "database/sql" + "os" + "fmt" + "log" + _ "github.com/lib/pq" +) + +var conn *sql.DB + +func ConnectDB() (error) { + psqlInfo := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", + os.Getenv("HOST"), os.Getenv("PORT"), os.Getenv("DBUSER"), os.Getenv("PASSWD"), os.Getenv("DBNAME")) + var err error + conn, err = sql.Open("postgres", psqlInfo) + + if err != nil { + log.Fatalln(err) + } + err = conn.Ping() + return err +} diff --git a/db/dbinit/dbinit.go b/db/dbinit/dbinit.go new file mode 100644 index 0000000..b51c901 --- /dev/null +++ b/db/dbinit/dbinit.go @@ -0,0 +1,46 @@ +package dbinit + +import ( + "log" + "fmt" + _ "github.com/lib/pq" + "database/sql" + "os" +) + +func checkerr(err error) { + if err != nil { + log.Println(err) + } +} + +func InitDB() { + psqlInfo := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", + os.Getenv("HOST"), os.Getenv("PORT"), os.Getenv("DBUSER"), os.Getenv("PASSWD"), os.Getenv("DBNAME")) + + db, err := sql.Open("postgres", psqlInfo) + + checkerr(err) + + defer db.Close() + + _, err = db.Exec(`create table if not exists breed_manifest ( + breed_id bigserial primary key, + breed text NOT NULL UNIQUE);`) + + checkerr(err) + + _, err = db.Exec(`create table if not exists dog_pictures ( + dog_id bigserial primary key, + breed_id bigserial NOT NULL, + author text, + title text, + picture_format text NOT NULL, + picture_hash text NOT NULL UNIQUE, + picture_url text NOT NULL UNIQUE, + CONSTRAINT fk_breed_id + FOREIGN KEY (breed_id) + REFERENCES breed_manifest(breed_id));`) + + checkerr(err) +} diff --git a/db/dbinit/dbinit.psql b/db/dbinit/dbinit.psql new file mode 100644 index 0000000..392929d --- /dev/null +++ b/db/dbinit/dbinit.psql @@ -0,0 +1,4 @@ +create table breed_manifest if not exists ( +breed_id bigserial primary key, +breed text NOT NULL UNIQUE, +)` diff --git a/db/dbmigrate/migrate.go b/db/dbmigrate/migrate.go new file mode 100644 index 0000000..f319d1c --- /dev/null +++ b/db/dbmigrate/migrate.go @@ -0,0 +1,60 @@ +package main + +import ( + "log" + _ "github.com/lib/pq" + "database/sql" + "os" + "fmt" + _ "github.com/joho/godotenv/autoload" + _ "github.com/go-sql-driver/mysql" +) + +type DogRow struct { + Id int + Author string + Title string + Format string + Hash string + Type string +} + +func checkerr(err error) { + if err != nil { + log.Println(err) + } +} + +func dsn(dbName string) string { + return fmt.Sprintf("%s:%s@tcp(%s)/%s", os.Getenv("MYSQLUSERNAME"), os.Getenv("MYSQLPASS"), os.Getenv("MYSQLHOSTNAME"), dbName) +} + +func main() { + log.Println("Log") + + psqlInfo := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", + os.Getenv("HOST"), os.Getenv("PORT"), os.Getenv("DBUSER"), os.Getenv("PASSWD"), os.Getenv("DBNAME")) + + pgdb, err := sql.Open("postgres", psqlInfo) + checkerr(err) + mysqldb, err := sql.Open("mysql", dsn(os.Getenv("MYSQLDBNAME"))) + checkerr(err) + + rows, err := mysqldb.Query(`select * from pug;`) + checkerr(err) + defer rows.Close() + + for rows.Next() { + var rowsel DogRow + if err := rows.Scan(&rowsel.Id, &rowsel.Author, &rowsel.Title, &rowsel.Format, &rowsel.Hash, &rowsel.Type); err != nil { + log.Fatal(err) + } + _, err = pgdb.Exec(`insert into dog_pictures (breed_id, author, title, picture_format, + picture_hash, picture_url) values ((select breed_id from breed_manifest where breed = $1), + $2, $3, $4, $5, $6)`, rowsel.Type, rowsel.Author, rowsel.Title, rowsel.Format, rowsel.Hash, + os.Getenv("DOGURL") + rowsel.Type + "/" + rowsel.Hash + "." + rowsel.Format) + if err != nil { + log.Println(rowsel.Hash) + } + } +} diff --git a/db/randomselect.go b/db/randomselect.go new file mode 100644 index 0000000..a8febf3 --- /dev/null +++ b/db/randomselect.go @@ -0,0 +1,17 @@ +package db + +import ( + "dogapi/structs" + "log" +) + +func RandomSelect() (structs.DogPicRow) { + selstat, _ := conn.Query(`select * from dog_pictures offset floor(random()*(select count(*) from dog_pictures)) limit 1;`) + var rowsel structs.DogPicRow + for selstat.Next() { + if err := selstat.Scan(&rowsel.Dog_id, &rowsel.Breed_id, &rowsel.Author, &rowsel.Title, &rowsel.Format, &rowsel.Hash, &rowsel.Url); err != nil { + log.Fatal(err) + } + } + return rowsel +} diff --git a/handlers/apihandler.go b/handlers/apihandler.go new file mode 100644 index 0000000..4693c5e --- /dev/null +++ b/handlers/apihandler.go @@ -0,0 +1,33 @@ +package handlers + +import ( + "net/http" + "log" + "dogapi/db" + "encoding/json" + "dogapi/structs" +) + +type Dog struct { + Id string `json:"id"` + Author string `json:"author"` + Title string `json:"title"` + Format string `json:"format"` + Hash string `json:"hash"` + Breed string `json:"breed"` + Url string `json:"url"` +} + +func APIHandler(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case "GET": + var dogquery structs.DogPicRow + dogquery = db.RandomSelect() + log.Println(dogquery) + var res Dog + res.Id = "1" + res.Author = "spencer" + res.Title = "cool dog" + json.NewEncoder(w).Encode(dogquery) + } +} diff --git a/init.go b/init.go new file mode 100644 index 0000000..3d9a221 --- /dev/null +++ b/init.go @@ -0,0 +1,12 @@ +package main + +import ( + "./db/dbinit" + "log" + _ "github.com/joho/godotenv/autoload" +) + +func main() { + log.Println("Initializing Database") + dbinit.InitDB() +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..4f2cc5b --- /dev/null +++ b/main.go @@ -0,0 +1,21 @@ +package main + +import ( + "dogapi/handlers" + "log" + "net/http" + "dogapi/db" + _ "github.com/joho/godotenv/autoload" +) + +func main() { + port := "8080" + err := db.ConnectDB() + if err != nil { + log.Println("asd") + log.Fatalln(err) + } + log.Println("Server started on port " + port) + http.HandleFunc("/api", handlers.APIHandler) + http.ListenAndServe(":"+port, nil) +} diff --git a/structs/queryrow.go b/structs/queryrow.go new file mode 100644 index 0000000..f9532a3 --- /dev/null +++ b/structs/queryrow.go @@ -0,0 +1,11 @@ +package structs + +type DogPicRow struct { + Dog_id int + Breed_id int + Author string + Title string + Format string + Hash string + Url string +}