113 lines
3.0 KiB
Go
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)
|
|
}
|