Files
email-notification/route/route.go
2025-04-21 11:58:12 +07:00

267 lines
7.1 KiB
Go

package route
import (
"email-notification/helper"
"email-notification/middleware"
"email-notification/model"
"email-notification/query"
"fmt"
"log"
"net/http"
"os"
"strings"
"time"
"gorm.io/gorm"
)
func Route(db *gorm.DB) {
http.HandleFunc("/birthday-notification", middleware.ResponseTimeMiddleware(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
sessionID := helper.GenerateSessionID()
module := "BIRTHDAY NOTIFICATION"
log.Printf("%+v %+v request %+v", sessionID, module, nil)
data := new([]model.Birthday)
month := int(time.Now().Month())
day := time.Now().Day()
subject := "Happy Birthday 🎉🎂🥳"
err := query.GetBirthday(db, data, fmt.Sprint(month), fmt.Sprint(day))
if err != nil {
log.Printf("%+v %+v response %+v", sessionID, module, err.Error())
w.WriteHeader(500)
w.Write([]byte(err.Error()))
return
}
for _, v := range *data {
fmt.Println("Birthday", v.Fullname)
sendTo := []string{v.Email}
type Data struct {
Name string
}
data := Data{Name: v.Fullname}
htmlString := helper.ParseHTML("template/birthday.html", data)
go func(v model.Birthday) {
log.Printf("%+v %+v SENDING EMAIL TO %+v", sessionID, module, v.Email)
err := helper.SendEmail(sendTo, sendTo, "", subject, "", htmlString)
if err != nil {
log.Printf("%+v %+v response %+v", sessionID, module, err.Error())
} else {
log.Printf("%+v %+v EMAIL SENT TO %+v", sessionID, module, v.Email)
}
}(v)
}
log.Printf("%+v %+v response %+v", sessionID, module, "success")
w.Write([]byte("success"))
}))
http.HandleFunc("/workanniversary-notification", middleware.ResponseTimeMiddleware(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
sessionID := helper.GenerateSessionID()
module := "WORKANNIVERSARY NOTIFICATION"
log.Printf("%+v %+v request %+v", sessionID, module, nil)
data := new([]model.Workanniversary)
month := int(time.Now().Month())
day := time.Now().Day()
err := query.GetWorkanniversary(db, data, fmt.Sprint(month), fmt.Sprint(day))
if err != nil {
log.Printf("%+v %+v response %+v", sessionID, module, err.Error())
w.WriteHeader(500)
w.Write([]byte(err.Error()))
return
}
subject := "Work Anniversary 🎉"
for _, v := range *data {
fmt.Println("Workanniversary", v.Fullname)
sendTo := []string{v.Email}
type Data struct {
Name string
Year string
}
duration := helper.FormatSince(v.HireDate)
// duration := time.Since(v.HireDate).String()
data := Data{Name: v.Fullname, Year: duration}
htmlString := helper.ParseHTML("template/workanniversary.html", data)
go func(v model.Workanniversary) {
log.Printf("%+v %+v SENDING EMAIL TO %+v", sessionID, module, v.Email)
err := helper.SendEmail(sendTo, sendTo, "", subject, "", htmlString)
if err != nil {
log.Printf("%+v %+v response %+v", sessionID, module, err.Error())
} else {
log.Printf("%+v %+v EMAIL SENT TO %+v", sessionID, module, v.Email)
}
}(v)
}
log.Printf("%+v %+v response %+v", sessionID, module, "success")
w.Write([]byte("success"))
}))
http.HandleFunc("/server-down-notification", middleware.ResponseTimeMiddleware(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
sessionID := helper.GenerateSessionID()
module := "SERVER DOWN NOTIFICATION"
log.Printf("%+v %+v request %+v", sessionID, module, nil)
subject := "Server Down 🚨"
sendTo := strings.Split(os.Getenv("ALERT_EMAIL"), ",")
type Data struct {
TimeAt string
Host string
}
data := Data{TimeAt: time.Now().Format("2006-01-02 15:04:05"), Host: "36.66.3.44"}
htmlString := helper.ParseHTML("template/server-down.html", data)
go func() {
log.Printf("%+v %+v SENDING EMAIL TO %+v", sessionID, module, sendTo)
err := helper.SendEmail(sendTo, sendTo, "", subject, "", htmlString)
if err != nil {
log.Printf("%+v %+v response %+v", sessionID, module, err.Error())
} else {
log.Printf("%+v %+v EMAIL SENT TO %+v", sessionID, module, sendTo)
}
}()
log.Printf("%+v %+v response %+v", sessionID, module, "success")
w.Write([]byte("success"))
}))
http.HandleFunc("/high-memory-notification", middleware.ResponseTimeMiddleware(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
sessionID := helper.GenerateSessionID()
module := "HIGH MEMORY USAGE NOTIFICATION"
log.Printf("%+v %+v request %+v", sessionID, module, nil)
subject := "High Memory Usage 🚨"
sendTo := strings.Split(os.Getenv("ALERT_EMAIL"), ",")
type Data struct {
TimeAt string
Host string
}
data := Data{TimeAt: time.Now().Format("2006-01-02 15:04:05"), Host: "36.66.3.44"}
htmlString := helper.ParseHTML("template/high-memory-usage.html", data)
go func() {
log.Printf("%+v %+v SENDING EMAIL TO %+v", sessionID, module, sendTo)
err := helper.SendEmail(sendTo, sendTo, "", subject, "", htmlString)
if err != nil {
log.Printf("%+v %+v response %+v", sessionID, module, err.Error())
} else {
log.Printf("%+v %+v EMAIL SENT TO %+v", sessionID, module, sendTo)
}
}()
log.Printf("%+v %+v response %+v", sessionID, module, "success")
w.Write([]byte("success"))
}))
http.HandleFunc("/send-email", middleware.ResponseTimeMiddleware(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
sessionID := helper.GenerateSessionID()
module := "SEND EMAIL"
request := new(model.SendEmailRequest)
err := helper.ParseRequest(r, request)
if err != nil {
w.WriteHeader(500)
w.Write([]byte("system error"))
return
}
err = helper.ValidateRequest(request)
if err != nil {
w.WriteHeader(400)
w.Write([]byte(err.Error()))
return
}
subject := request.Subject
sendTo := request.To
type Data struct {
Message string
}
data := Data{Message: request.Message}
htmlString := helper.ParseHTML("template/general.html", data)
go func() {
log.Printf("%+v %+v SENDING EMAIL TO %+v", sessionID, module, sendTo)
err := helper.SendEmail(sendTo, request.CC, "", subject, "", htmlString)
if err != nil {
log.Printf("%+v %+v response %+v", sessionID, module, err.Error())
} else {
log.Printf("%+v %+v EMAIL SENT TO %+v", sessionID, module, sendTo)
}
}()
log.Printf("%+v %+v response %+v", sessionID, module, "success")
w.Write([]byte("success"))
}))
http.Handle("/", middleware.ResponseTimeMiddleware(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
if r.URL.Path != "/" {
w.WriteHeader(404)
w.Write([]byte("What are you looking for?!"))
return
}
w.Write([]byte("Welcome!"))
}))
}