appidea-restapi/modules/rabbitmq/rabbitmq.go

144 lines
2.9 KiB
Go

package rabbitmq
import (
"encoding/json"
"fmt"
"git.umbach.dev/app-idea/rest-api/modules/config"
"git.umbach.dev/app-idea/rest-api/modules/structs"
log "github.com/sirupsen/logrus"
"github.com/streadway/amqp"
)
var Conn *amqp.Connection
var Channel *amqp.Channel
var MailQueue amqp.Queue
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")
/*
mailQueue, err := ch.QueueDeclare(
"mails", // name
false, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
if err != nil {
log.Fatalln("Failed to declare a queue", err)
}
MailQueue = mailQueue */
declareQueue(ch, "mails", &MailQueue)
declareQueue(ch, "pictures", &PictureQueue)
/*
pictureQueue, err := ch.QueueDeclare(
"picture", // name
false, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
if err != nil {
log.Fatalln("Failed to declare a queue", err)
}
PictureQueue = pictureQueue */
}
func declareQueue(channel *amqp.Channel, name string, queue *amqp.Queue) {
q, err := channel.QueueDeclare(
name, // name
false, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
if err != nil {
log.Fatalln("Failed to declare a queue", err)
}
log.Debugln("declareQ", q.Name)
*queue = q
log.Infoln("queue", MailQueue)
}
func Publish(queue amqp.Queue, body string) {
log.Infoln("publish queue name", queue.Name)
err := Channel.Publish(
"", // exchange
queue.Name, // routing key
false, // mandatory
false, // immediate
amqp.Publishing{
ContentType: "application/json",
Body: []byte(body),
})
if err != nil {
log.Fatalln("Failed to publish a message", err)
}
}
func PublishMail(mail string, templateId int, languageId int, bodyData json.RawMessage) {
js := structs.RabbitmqMailMessage{Mail: mail, TemplateId: templateId, LanguageId: languageId, BodyData: &bodyData}
reqBody, err := json.MarshalIndent(&js, "", "\t")
if err != nil {
log.Infoln("error reqBody", err)
}
Publish(MailQueue, string(reqBody))
}
func PublishPicture(pictureMessage structs.RabbitmqPictureMessage) {
//js := structs.RabbitmqPictureMessage{Picture: picture, UserId: userId}
reqBody, err := json.MarshalIndent(&pictureMessage, "", "\t")
if err != nil {
log.Infoln("error reqBody", err)
}
Publish(PictureQueue, string(reqBody))
log.Debugln("rabbitmq publicPicture")
}