initial commit

Signed-off-by: Pin <wf6DJd8a3xSSCZbn@protonmail.com>
This commit is contained in:
Pin
2021-01-31 16:45:18 -05:00
committed by Pin
commit 6121f39c2a
11 changed files with 214 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.env

1
README.md Normal file
View File

@@ -0,0 +1 @@
This is a simple Dog API written in Go

24
db/connectdb.go Normal file
View 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
View 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
View 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
View 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
View 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
}

18
handlers/apihandler.go Normal file
View File

@@ -0,0 +1,18 @@
package handlers
import (
"net/http"
"log"
"dogapi/db"
"encoding/json"
"dogapi/structs"
)
func APIHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "GET":
var dogquery structs.DogPicRow
dogquery = db.RandomSelect()
json.NewEncoder(w).Encode(dogquery)
}
}

12
init.go Normal file
View File

@@ -0,0 +1,12 @@
package main
import (
"./db/dbinit"
"log"
_ "github.com/joho/godotenv/autoload"
)
func main() {
log.Println("Initializing Database")
dbinit.InitDB()
}

20
main.go Normal file
View File

@@ -0,0 +1,20 @@
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.Fatalln(err)
}
log.Println("Server started on port " + port)
http.HandleFunc("/api", handlers.APIHandler)
http.ListenAndServe(":"+port, nil)
}

11
structs/queryrow.go Normal file
View 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
}