From 9357d03ab27545e0313425a5292e5bb902b989f6 Mon Sep 17 00:00:00 2001 From: RuisPipe Date: Sun, 1 Aug 2021 12:23:23 +0200 Subject: [PATCH] current state --- config.toml | 11 +++ go.mod | 6 ++ go.sum | 11 +++ main.go | 16 ++++- modules/config/config.go | 30 +++++++++ modules/picture/picture.go | 45 +++++++++++++ modules/rabbitmq/rabbitmq.go | 81 +++++++++++++++++++++++ modules/structs/rabbitmqPictureMessage.go | 7 ++ 8 files changed, 205 insertions(+), 2 deletions(-) create mode 100644 config.toml create mode 100644 go.sum create mode 100644 modules/config/config.go create mode 100644 modules/picture/picture.go create mode 100644 modules/rabbitmq/rabbitmq.go create mode 100644 modules/structs/rabbitmqPictureMessage.go diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..6aa4d2d --- /dev/null +++ b/config.toml @@ -0,0 +1,11 @@ +[server] +debug = true +host = "127.0.0.1:50051" + +[rabbitmq] +host = "localhost:5672" +username = "guest" +password = "guest" + +[storage] +path = "./storage/" \ No newline at end of file diff --git a/go.mod b/go.mod index 9099de4..4e9bddf 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,9 @@ module git.umbach.dev/picture-storage-handler go 1.16 + +require ( + github.com/BurntSushi/toml v0.3.1 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/streadway/amqp v1.0.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..d7b7859 --- /dev/null +++ b/go.sum @@ -0,0 +1,11 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/main.go b/main.go index 99fd805..f4348b6 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,19 @@ package main -import "fmt" +import ( + "git.umbach.dev/picture-storage-handler/modules/config" + "git.umbach.dev/picture-storage-handler/modules/rabbitmq" + log "github.com/sirupsen/logrus" +) func main() { - fmt.Println("Hello") + config.LoadConfig() + + cfg := &config.Cfg.Server + + if cfg.Debug { + log.SetLevel(log.DebugLevel) + } + + rabbitmq.Init() } diff --git a/modules/config/config.go b/modules/config/config.go new file mode 100644 index 0000000..95be6f8 --- /dev/null +++ b/modules/config/config.go @@ -0,0 +1,30 @@ +package config + +import "github.com/BurntSushi/toml" + +var Cfg Config + +type Config struct { + Server server + RabbitMq rabbitmq + Storage storage +} + +type server struct { + Debug bool + Host string +} + +type rabbitmq struct { + Host string + Username string + Password string +} + +type storage struct { + Path string +} + +func LoadConfig() { + toml.DecodeFile("./config.toml", &Cfg) +} diff --git a/modules/picture/picture.go b/modules/picture/picture.go new file mode 100644 index 0000000..184aa2b --- /dev/null +++ b/modules/picture/picture.go @@ -0,0 +1,45 @@ +package picture + +import ( + "bytes" + "image" + "image/jpeg" + "os" + + "git.umbach.dev/picture-storage-handler/modules/structs" + log "github.com/sirupsen/logrus" +) + +func Save(pictureMessage structs.RabbitmqPictureMessage) error { + img, _, err := image.Decode(bytes.NewReader(pictureMessage.Picture)) + + if err != nil { + log.Fatalln("imageDecod failed", err) + return err + } + + err = os.Mkdir("./storage/"+pictureMessage.UserId, 0755) + + if err != nil && !os.IsExist(err) { + log.Infoln("mkdir failed", err) + return err + } + + out, err := os.Create("./storage/" + pictureMessage.UserId + "/" + pictureMessage.Filename) + + if err != nil { + log.Infoln("osCreate failed", err) + return err + } + + defer out.Close() + + err = jpeg.Encode(out, img, nil) + + if err != nil { + log.Println("jpegEncode failed", err) + return err + } + + return nil +} diff --git a/modules/rabbitmq/rabbitmq.go b/modules/rabbitmq/rabbitmq.go new file mode 100644 index 0000000..4455375 --- /dev/null +++ b/modules/rabbitmq/rabbitmq.go @@ -0,0 +1,81 @@ +package rabbitmq + +import ( + "encoding/json" + "fmt" + + "git.umbach.dev/picture-storage-handler/modules/config" + "git.umbach.dev/picture-storage-handler/modules/picture" + "git.umbach.dev/picture-storage-handler/modules/structs" + log "github.com/sirupsen/logrus" + "github.com/streadway/amqp" +) + +var Conn *amqp.Connection +var Channel *amqp.Channel + +var PictureQueue amqp.Queue + +func getConnectionString() string { + cfg := &config.Cfg.RabbitMq + + return fmt.Sprintf("amqp://%s:%s@%s/", cfg.Username, cfg.Password, cfg.Host) +} + +func Init() { + conn, err := amqp.Dial(getConnectionString()) + + if err != nil { + log.Fatalln("Failed to connect to RabbitMQ", err) + } + + Conn = conn + + ch, err := conn.Channel() + + if err != nil { + log.Fatalln("Failed to open a channel", err) + } + + defer ch.Close() + + Channel = ch + + log.Debug("RabbitMQ connected") + + msgs, err := ch.Consume( + "pictures", // queue + "", // consumer + false, // auto-ack + false, // exclusive + false, // no-local + false, // no-wait + nil, // args + ) + + if err != nil { + log.Fatalln("Consume err", err) + } + + forever := make(chan []byte) + + go func() { + for d := range msgs { + log.Infoln("Received Message:", len(d.Body)) + + pictureMessage := structs.RabbitmqPictureMessage{} + + if err := json.Unmarshal(d.Body, &pictureMessage); err != nil { + log.Fatal(err) + } + + if err := picture.Save(pictureMessage); err == nil { + d.Ack(false) + } + } + }() + + fmt.Println("Successfully Connected to our RabbitMQ Instance") + fmt.Println(" [*] - Waiting for messages") + <-forever +} diff --git a/modules/structs/rabbitmqPictureMessage.go b/modules/structs/rabbitmqPictureMessage.go new file mode 100644 index 0000000..c4eb92a --- /dev/null +++ b/modules/structs/rabbitmqPictureMessage.go @@ -0,0 +1,7 @@ +package structs + +type RabbitmqPictureMessage struct { + Picture []byte + UserId string + Filename string +}