mirror of
https://github.com/MichaelCade/90DaysOfDevOps.git
synced 2025-01-13 08:14:43 +07:00
4ff8c158a9
Signed-off-by: Alistair Hey <alistair@heyal.co.uk>
135 lines
2.7 KiB
Go
135 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"fmt"
|
|
_ "github.com/go-sql-driver/mysql"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func storeString(input string) error {
|
|
// Connect to the database
|
|
db, err := sql.Open("mysql", "root:password@tcp(mysql:3306)/mysql")
|
|
defer db.Close()
|
|
// Insert the random number into the database
|
|
_, err = db.Exec("INSERT INTO requestor(random_string) VALUES(?)", input)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Printf("Random string %s has been inserted into the database\n", input)
|
|
return nil
|
|
}
|
|
|
|
func getStringFromDB(input string) error {
|
|
// see if the string exists in the db, if so return nil
|
|
// if not, return an error
|
|
db, err := sql.Open("mysql", "root:password@tcp(mysql:3306)/mysql")
|
|
defer db.Close()
|
|
result, err := db.Query("SELECT * FROM requestor WHERE random_string = ?", input)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for result.Next() {
|
|
var randomString string
|
|
err = result.Scan(&randomString)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if randomString == input {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
return errors.New("string not found")
|
|
}
|
|
|
|
func getStringFromGenerator() {
|
|
// make a request to the generator
|
|
// save sthe string to db
|
|
r, err := http.Get("http://generator-service:8080/new")
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
body, err := io.ReadAll(r.Body)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
fmt.Println(fmt.Sprintf("body from generator: %s", string(body)))
|
|
|
|
storeString(string(body))
|
|
|
|
}
|
|
|
|
func main() {
|
|
// setup a goroutine loop calling the generator every minute, saving the result in the DB
|
|
|
|
ticker := time.NewTicker(60 * time.Second)
|
|
quit := make(chan struct{})
|
|
go func() {
|
|
for {
|
|
select {
|
|
case <-ticker.C:
|
|
getStringFromGenerator()
|
|
case <-quit:
|
|
ticker.Stop()
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
|
|
// Create a new HTTP server
|
|
server := &http.Server{
|
|
Addr: ":8080",
|
|
}
|
|
|
|
err := createRequestordb()
|
|
if err != nil {
|
|
panic(err.Error())
|
|
}
|
|
|
|
// Handle requests to /generate
|
|
http.HandleFunc("/check/", func(w http.ResponseWriter, r *http.Request) {
|
|
// get the value after check from the url
|
|
id := strings.TrimPrefix(r.URL.Path, "/check/")
|
|
|
|
// check if it exists in the db
|
|
err := getStringFromDB(id)
|
|
if err != nil {
|
|
http.Error(w, "string not found", http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
fmt.Fprintf(w, "string found", http.StatusOK)
|
|
})
|
|
|
|
// Start the server
|
|
fmt.Println("Listening on port 8080")
|
|
err = server.ListenAndServe()
|
|
if err != nil {
|
|
panic(err.Error())
|
|
}
|
|
}
|
|
|
|
func createRequestordb() error {
|
|
db, err := sql.Open("mysql", "root:password@tcp(mysql:3306)/mysql")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer db.Close()
|
|
|
|
// try to create a table for us
|
|
_, err = db.Exec("CREATE TABLE IF NOT EXISTS requestor(random_string VARCHAR(100))")
|
|
|
|
return err
|
|
}
|