initial commit
Signed-off-by: Pin <Pin>
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.env
|
||||||
24
db/connectdb.go
Normal file
24
db/connectdb.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
46
db/dbinit/dbinit.go
Normal file
46
db/dbinit/dbinit.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
4
db/dbinit/dbinit.psql
Normal file
4
db/dbinit/dbinit.psql
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
create table breed_manifest if not exists (
|
||||||
|
breed_id bigserial primary key,
|
||||||
|
breed text NOT NULL UNIQUE,
|
||||||
|
)`
|
||||||
60
db/dbmigrate/migrate.go
Normal file
60
db/dbmigrate/migrate.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
17
db/randomselect.go
Normal file
17
db/randomselect.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
33
handlers/apihandler.go
Normal file
33
handlers/apihandler.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
12
init.go
Normal file
12
init.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"./db/dbinit"
|
||||||
|
"log"
|
||||||
|
_ "github.com/joho/godotenv/autoload"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log.Println("Initializing Database")
|
||||||
|
dbinit.InitDB()
|
||||||
|
}
|
||||||
21
main.go
Normal file
21
main.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
11
structs/queryrow.go
Normal file
11
structs/queryrow.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user