Skip to content

Commit

Permalink
Update database handling
Browse files Browse the repository at this point in the history
  • Loading branch information
qjoly committed Aug 28, 2024
1 parent 7017f41 commit 442c41f
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 38 deletions.
10 changes: 4 additions & 6 deletions controller/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,15 @@ func main() {
sub, _ := nc.Subscribe(subject, func(msg *nats.Msg) {

fmt.Println("Received a new order: " + string(msg.Data))
response := controllerResponse{
Status: "success",
Message: "The coffee has been successfully scheduled",
}

var response controllerResponse
response.Status = "success"
response.Message = "The coffee has been successfully scheduled"

// Handle message

jsonData, _ := json.Marshal(response)

fmt.Printf("Status: %s, Message: %s\n", response.Status, response.Message)

msg.Respond(jsonData)
})

Expand Down
16 changes: 16 additions & 0 deletions stock-manager/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
module github.com/une-tasse-de-cafe/coffee-shop/stock-manager

go 1.21.6

require (
github.com/mattn/go-sqlite3 v1.14.22
github.com/nats-io/nats.go v1.37.0
)

require (
github.com/klauspost/compress v1.17.2 // indirect
github.com/nats-io/nkeys v0.4.7 // indirect
github.com/nats-io/nuid v1.0.1 // indirect
golang.org/x/crypto v0.18.0 // indirect
golang.org/x/sys v0.16.0 // indirect
)
14 changes: 14 additions & 0 deletions stock-manager/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE=
github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=
github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
118 changes: 86 additions & 32 deletions stock-manager/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"database/sql"
"fmt"
"log"
"os"
"strings"

_ "github.com/mattn/go-sqlite3"
"github.com/nats-io/nats.go"
Expand All @@ -17,7 +19,7 @@ type Message struct {
}

func main() {
// Connect to SQLite database

db, err := sql.Open("sqlite3", "./data.db")
if err != nil {
log.Fatal("Failed to open SQLite database:", err)
Expand All @@ -26,60 +28,112 @@ func main() {

// Create a table if it doesn't exist
createTableSQL := `CREATE TABLE IF NOT EXISTS data (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT,
"value" TEXT
type TEXT NOT NULL PRIMARY KEY,
value TEXT
);`
_, err = db.Exec(createTableSQL)
if err != nil {
log.Fatal("Failed to create table:", err)
}

// Check and insert missing rows if they don't exist
rows := []struct {
Type string
Value string
}{
{"mixed", "150"},
{"arabica", "150"},
{"robusta", "150"},
}

for _, row := range rows {
var exists bool
query := `SELECT EXISTS(SELECT 1 FROM data WHERE type=? LIMIT 1)`
err = db.QueryRow(query, row.Type).Scan(&exists)
if err != nil {
log.Fatal("Failed to query database:", err)
}

if !exists {
insertSQL := `INSERT INTO data (type, value) VALUES (?, ?)`
_, err = db.Exec(insertSQL, row.Type, row.Value)
if err != nil {
log.Fatal("Failed to insert row:", err)
}
fmt.Printf("Inserted missing row: type=%s, value=%s\n", row.Type, row.Value)
} else {
fmt.Printf("Row already exists: type=%s\n", row.Type)
}
}

// Connect to NATS server
nc, err := nats.Connect(nats.DefaultURL)
url := os.Getenv("NATS_URL")
if url == "" {
url = "192.168.128.51:4222"
}

nc, err := nats.Connect(url)
if err != nil {
log.Fatal("Failed to connect to NATS:", err)
}

defer nc.Close()

// Subscribe to a NATS subject
sub, err := nc.Subscribe("data.subject", func(m *nats.Msg) {
sub, err := nc.Subscribe("coffee.stock.>", func(m *nats.Msg) {
log.Printf("Received a message: %s", string(m.Data))
log.Printf("Subject : %s", m.Subject)
subjectUri := strings.Split(m.Subject, ".")
fmt.Println(subjectUri)

// Process the received message and store it in the database
err := processAndStore(db, m.Data)
if err != nil {
log.Println("Error processing and storing data:", err)
if len(subjectUri) != 4 {
fmt.Println("The subject length isn't correct")
return
}

// Authorize only requests for knowned type/action
typeBean := subjectUri[2]
switch typeBean {
case "arabica":
fmt.Println(typeBean)
case "robusta":
fmt.Println(typeBean)
case "mixed":
fmt.Println(typeBean)
default:
fmt.Println("Not supported")
return
}

action := subjectUri[3]
switch action {
case "get":
fmt.Println("get")
getRequest := `SELECT value FROM data WHERE type=?`
var value string
err := db.QueryRow(getRequest, typeBean).Scan(&value)
if err != nil {
fmt.Println("Cannot requests to the db")
return
}
fmt.Println(value)

case "set":
fmt.Println("set")
default:
fmt.Println("This action is not supported.")
return
}

})

if err != nil {
log.Fatal("Failed to subscribe to subject:", err)
}

// Keep the service running
log.Println("Service is running... waiting for messages.")
select {} // Block forever

// Unsubscribe when finished
defer sub.Unsubscribe()
}

// Process and store the received data in the SQLite database
func processAndStore(db *sql.DB, data []byte) error {
// For simplicity, assume the data is a simple comma-separated string: "name,value"
var name, value string
n, err := fmt.Sscanf(string(data), "%s,%s", &name, &value)
if err != nil || n != 2 {
return fmt.Errorf("invalid data format")
}

// Insert data into the SQLite database
insertSQL := `INSERT INTO data (name, value) VALUES (?, ?)`
_, err = db.Exec(insertSQL, name, value)
if err != nil {
return fmt.Errorf("failed to insert data into database: %v", err)
}
select {} // Block forever

log.Println("Data successfully stored in the database")
return nil
}

0 comments on commit 442c41f

Please sign in to comment.