diff --git a/server/apiv1/api.go b/server/apiv1/api.go index d65da77..9665440 100644 --- a/server/apiv1/api.go +++ b/server/apiv1/api.go @@ -13,17 +13,8 @@ import ( "github.com/gorilla/mux" ) -// MessagesResult struct -type MessagesResult struct { - Total int `json:"total"` - Unread int `json:"unread"` - Count int `json:"count"` - Start int `json:"start"` - Messages []storage.Summary `json:"messages"` -} - -// Messages returns a paginated list of messages as JSON -func Messages(w http.ResponseWriter, r *http.Request) { +// GetMessages returns a paginated list of messages as JSON +func GetMessages(w http.ResponseWriter, r *http.Request) { start, limit := getStartLimit(r) messages, err := storage.List(start, limit) @@ -34,7 +25,7 @@ func Messages(w http.ResponseWriter, r *http.Request) { stats := storage.StatsGet() - var res MessagesResult + var res MessagesSummary res.Start = start res.Messages = messages @@ -65,7 +56,7 @@ func Search(w http.ResponseWriter, r *http.Request) { stats := storage.StatsGet() - var res MessagesResult + var res MessagesSummary res.Start = 0 res.Messages = messages @@ -78,8 +69,8 @@ func Search(w http.ResponseWriter, r *http.Request) { _, _ = w.Write(bytes) } -// Message (method: GET) returns the *data.Message as JSON -func Message(w http.ResponseWriter, r *http.Request) { +// GetMessage (method: GET) returns the *data.Message as JSON +func GetMessage(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] diff --git a/server/apiv1/structs.go b/server/apiv1/structs.go new file mode 100644 index 0000000..25031a0 --- /dev/null +++ b/server/apiv1/structs.go @@ -0,0 +1,24 @@ +package apiv1 + +import "github.com/axllent/mailpit/storage" + +// The following structs & aliases are provided for easy import +// and understanding of the JSON structure. + +// MessageSummary - summary of a single message +type MessageSummary = storage.MessageSummary + +// MessagesSummary - summary of a list of messages +type MessagesSummary struct { + Total int `json:"total"` + Unread int `json:"unread"` + Count int `json:"count"` + Start int `json:"start"` + Messages []MessageSummary `json:"messages"` +} + +// Message data +type Message = storage.Message + +// Attachment summary +type Attachment = storage.Attachment diff --git a/server/server.go b/server/server.go index f5ddb55..e43a75c 100644 --- a/server/server.go +++ b/server/server.go @@ -57,7 +57,7 @@ func defaultRoutes() *mux.Router { r := mux.NewRouter() // API V1 - r.HandleFunc("/api/v1/messages", middleWareFunc(apiv1.Messages)).Methods("GET") + r.HandleFunc("/api/v1/messages", middleWareFunc(apiv1.GetMessages)).Methods("GET") r.HandleFunc("/api/v1/messages", middleWareFunc(apiv1.SetReadStatus)).Methods("PUT") r.HandleFunc("/api/v1/messages", middleWareFunc(apiv1.DeleteMessages)).Methods("DELETE") r.HandleFunc("/api/v1/search", middleWareFunc(apiv1.Search)).Methods("GET") @@ -65,7 +65,7 @@ func defaultRoutes() *mux.Router { r.HandleFunc("/api/v1/message/{id}/part/{partID}/thumb", middleWareFunc(apiv1.Thumbnail)).Methods("GET") r.HandleFunc("/api/v1/message/{id}/raw", middleWareFunc(apiv1.DownloadRaw)).Methods("GET") r.HandleFunc("/api/v1/message/{id}/headers", middleWareFunc(apiv1.Headers)).Methods("GET") - r.HandleFunc("/api/v1/message/{id}", middleWareFunc(apiv1.Message)).Methods("GET") + r.HandleFunc("/api/v1/message/{id}", middleWareFunc(apiv1.GetMessage)).Methods("GET") r.HandleFunc("/api/v1/info", middleWareFunc(apiv1.AppInfo)).Methods("GET") return r diff --git a/server/server_test.go b/server/server_test.go index e920b03..2bee1ec 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -160,7 +160,7 @@ func setup() { } func assertStatsEqual(t *testing.T, uri string, unread, total int) { - m := apiv1.MessagesResult{} + m := apiv1.MessagesSummary{} data, err := clientGet(uri) if err != nil { @@ -179,7 +179,7 @@ func assertStatsEqual(t *testing.T, uri string, unread, total int) { func assertSearchEqual(t *testing.T, uri, query string, count int) { t.Logf("Test search: %s", query) - m := apiv1.MessagesResult{} + m := apiv1.MessagesSummary{} limit := fmt.Sprintf("%d", count) @@ -226,8 +226,8 @@ func insertEmailData(t *testing.T) { } -func fetchMessages(url string) (apiv1.MessagesResult, error) { - m := apiv1.MessagesResult{} +func fetchMessages(url string) (apiv1.MessagesSummary, error) { + m := apiv1.MessagesSummary{} data, err := clientGet(url) if err != nil { diff --git a/storage/database.go b/storage/database.go index 927a42f..c4c6980 100644 --- a/storage/database.go +++ b/storage/database.go @@ -230,8 +230,7 @@ func Store(body []byte) (string, error) { return "", err } - // return summary - c := &Summary{} + c := &MessageSummary{} if err := json.Unmarshal(b, c); err != nil { return "", err } @@ -247,8 +246,8 @@ func Store(body []byte) (string, error) { // List returns a subset of messages from the mailbox, // sorted latest to oldest -func List(start, limit int) ([]Summary, error) { - results := []Summary{} +func List(start, limit int) ([]MessageSummary, error) { + results := []MessageSummary{} q := sqlf.From("mailbox"). Select(`ID, Data, Read`). @@ -260,7 +259,7 @@ func List(start, limit int) ([]Summary, error) { var id string var summary string var read int - em := Summary{} + em := MessageSummary{} if err := row.Scan(&id, &summary, &read); err != nil { logger.Log().Error(err) @@ -291,8 +290,8 @@ func List(start, limit int) ([]Summary, error) { // The search is broken up by segments (exact phrases can be quoted), and interprits specific terms such as: // is:read, is:unread, has:attachment, to:, from: & subject: // Negative searches also also included by prefixing the search term with a `-` or `!` -func Search(search string, start, limit int) ([]Summary, error) { - results := []Summary{} +func Search(search string, start, limit int) ([]MessageSummary, error) { + results := []MessageSummary{} tsStart := time.Now() s := strings.ToLower(search) @@ -316,7 +315,7 @@ func Search(search string, start, limit int) ([]Summary, error) { var summary string var read int var ignore string - em := Summary{} + em := MessageSummary{} if err := row.Scan(&id, &summary, &read, &ignore, &ignore, &ignore, &ignore); err != nil { logger.Log().Error(err) diff --git a/storage/structs.go b/storage/structs.go index f0d68d3..7cc68ff 100644 --- a/storage/structs.go +++ b/storage/structs.go @@ -33,8 +33,8 @@ type Attachment struct { Size int } -// Summary struct for frontend messages -type Summary struct { +// MessageSummary struct for frontend messages +type MessageSummary struct { ID string Read bool From *mail.Address