Files

113 lines
3.0 KiB
Go

package handlers
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"mengpost-backend/models"
"mengpost-backend/services"
)
func getAccount(c *gin.Context) *models.Account {
id, _ := strconv.ParseInt(c.Param("id"), 10, 64)
acc, err := models.GetAccount(id)
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "account not found"})
return nil
}
return acc
}
// GET /api/accounts/:id/mailboxes
func ListMailboxes(c *gin.Context) {
acc := getAccount(c)
if acc == nil {
return
}
boxes, err := services.ListMailboxes(acc)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": services.WrapMicrosoftMailErr(acc.Email, err).Error()})
return
}
c.JSON(http.StatusOK, boxes)
}
// GET /api/accounts/:id/messages?mailbox=INBOX&limit=30
func ListMessages(c *gin.Context) {
acc := getAccount(c)
if acc == nil {
return
}
mailbox := c.DefaultQuery("mailbox", "INBOX")
limit, _ := strconv.Atoi(c.DefaultQuery("limit", "30"))
list, err := services.FetchMessages(acc, mailbox, limit)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": services.WrapMicrosoftMailErr(acc.Email, err).Error()})
return
}
c.JSON(http.StatusOK, list)
}
// GET /api/accounts/:id/messages/:uid?mailbox=INBOX
func GetMessage(c *gin.Context) {
acc := getAccount(c)
if acc == nil {
return
}
uid64, _ := strconv.ParseUint(c.Param("uid"), 10, 32)
mailbox := c.DefaultQuery("mailbox", "INBOX")
detail, err := services.FetchMessage(acc, mailbox, uint32(uid64))
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": services.WrapMicrosoftMailErr(acc.Email, err).Error()})
return
}
c.JSON(http.StatusOK, detail)
}
// POST /api/accounts/:id/send
func SendMessage(c *gin.Context) {
acc := getAccount(c)
if acc == nil {
return
}
var body struct {
To string `json:"to"`
Subject string `json:"subject"`
Body string `json:"body"`
HTML bool `json:"html"`
}
if err := c.ShouldBindJSON(&body); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
log := &models.SentLog{AccountID: acc.ID, To: body.To, Subject: body.Subject, Body: body.Body}
if err := services.SendMail(acc, body.To, body.Subject, body.Body, body.HTML); err != nil {
wrapped := services.WrapMicrosoftMailErr(acc.Email, err)
log.Status = "failed"
log.Error = wrapped.Error()
_ = models.AddSentLog(log)
c.JSON(http.StatusInternalServerError, gin.H{"error": wrapped.Error()})
return
}
log.Status = "ok"
_ = models.AddSentLog(log)
c.JSON(http.StatusOK, gin.H{"ok": true})
}
// GET /api/accounts/:id/sent?limit=50
func ListSentLogs(c *gin.Context) {
acc := getAccount(c)
if acc == nil {
return
}
limit, _ := strconv.Atoi(c.DefaultQuery("limit", "50"))
list, err := models.ListSentLogs(acc.ID, limit)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, list)
}