diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index c26e258..ce99ba5 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -16,7 +16,8 @@ jobs:
with:
go-version: ${{ matrix.go-version }}
- uses: actions/checkout@v4
- - uses: actions/cache@v3
+ - name: Run Go tests
+ uses: actions/cache@v3
with:
path: |
~/.cache/go-build
@@ -25,12 +26,19 @@ jobs:
restore-keys: |
${{ runner.os }}-go-
- run: go test ./internal/storage ./server ./internal/tools ./internal/tools/html2text -v
- - run: go test ./internal/storage -bench=.
+ - run: go test ./internal/storage ./internal/tools/html2text -bench=.
# build the assets
- - uses: actions/setup-node@v3
+ - name: Build web UI
+ uses: actions/setup-node@v3
with:
node-version: 18
cache: 'npm'
- run: npm install
- run: npm run package
+
+ # validate the swagger file
+ - name: Validate OpenAPI definition
+ uses: char0n/swagger-editor-validate@v1
+ with:
+ definition-file: server/ui/api/v1/swagger.json
diff --git a/internal/tools/html2text/html2text.go b/internal/tools/html2text/html2text.go
index 0940d06..9f3f6f6 100644
--- a/internal/tools/html2text/html2text.go
+++ b/internal/tools/html2text/html2text.go
@@ -6,6 +6,7 @@ import (
"log"
"regexp"
"strings"
+ "unicode"
"golang.org/x/net/html"
)
@@ -67,6 +68,15 @@ func extract(node *html.Node, buff *bytes.Buffer, includeLinks bool) {
func clean(text string) string {
// replace \uFEFF with space, see https://github.com/golang/go/issues/42274#issuecomment-1017258184
text = strings.ReplaceAll(text, string('\uFEFF'), " ")
+
+ // remove non-printable characters
+ text = strings.Map(func(r rune) rune {
+ if unicode.IsPrint(r) {
+ return r
+ }
+ return []rune(" ")[0]
+ }, text)
+
text = re.ReplaceAllString(text, " ")
return strings.TrimSpace(text)
}
diff --git a/internal/tools/html2text/html2text_test.go b/internal/tools/html2text/html2text_test.go
index dd17639..96ca9a1 100644
--- a/internal/tools/html2text/html2text_test.go
+++ b/internal/tools/html2text/html2text_test.go
@@ -54,3 +54,197 @@ func TestWithLinks(t *testing.T) {
}
}
}
+
+func BenchmarkPlain(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ Strip(htmlTestData, false)
+ }
+}
+
+func BenchmarkLinks(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ Strip(htmlTestData, true)
+ }
+}
+
+var htmlTestData = `
+
+
+
+
+ [axllent/mailpit] Run failed: .github/workflows/tests.yml - feature/swagger (284335a)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [axllent/mailpit] .github/workflows/tests.yml workflow run
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+.github/workflows/tests.yml: No jobs were run
+
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ — You are receiving this because you are subscribed to this thread. Manage your GitHub Actions notifications
+
+ |
+
+
+
+
+ |
+
+
+ GitHub, Inc. ・88 Colin P Kelly Jr Street ・San Francisco, CA 94107
+ |
+
+
+
+
+ |
+
+
+
+
+
+`
diff --git a/server/apiv1/api.go b/server/apiv1/api.go
index d201672..5ad4951 100644
--- a/server/apiv1/api.go
+++ b/server/apiv1/api.go
@@ -144,11 +144,11 @@ func Search(w http.ResponseWriter, r *http.Request) {
// DeleteSearch will delete all messages matching a search
func DeleteSearch(w http.ResponseWriter, r *http.Request) {
- // swagger:route DELETE /api/v1/search messages MessagesSummary
+ // swagger:route DELETE /api/v1/search messages DeleteSearch
//
// # Delete messages by search
//
- // Deletes messages matching a search.
+ // Delete all messages matching a search.
//
// Produces:
// - application/json
@@ -196,7 +196,7 @@ func GetMessage(w http.ResponseWriter, r *http.Request) {
// Parameters:
// + name: ID
// in: path
- // description: Database ID
+ // description: Message database ID
// required: true
// type: string
//
@@ -237,7 +237,7 @@ func DownloadAttachment(w http.ResponseWriter, r *http.Request) {
// Parameters:
// + name: ID
// in: path
- // description: Database ID
+ // description: Message database ID
// required: true
// type: string
// + name: PartID
@@ -362,11 +362,11 @@ func DownloadRaw(w http.ResponseWriter, r *http.Request) {
// DeleteMessages (method: DELETE) deletes all messages matching IDS.
func DeleteMessages(w http.ResponseWriter, r *http.Request) {
- // swagger:route DELETE /api/v1/messages messages Delete
+ // swagger:route DELETE /api/v1/messages messages DeleteMessages
//
// # Delete messages
//
- // If no IDs are provided then all messages are deleted.
+ // Delete individual or all messages. If no IDs are provided then all messages are deleted.
//
// Consumes:
// - application/json
@@ -376,13 +376,6 @@ func DeleteMessages(w http.ResponseWriter, r *http.Request) {
//
// Schemes: http, https
//
- // Parameters:
- // + name: ids
- // in: body
- // description: Database IDs to delete
- // required: false
- // type: DeleteRequest
- //
// Responses:
// 200: OKResponse
// default: ErrorResponse
@@ -406,7 +399,7 @@ func DeleteMessages(w http.ResponseWriter, r *http.Request) {
}
}
- w.Header().Add("Content-Type", "application/json")
+ w.Header().Add("Content-Type", "application/plain")
_, _ = w.Write([]byte("ok"))
}
@@ -427,13 +420,6 @@ func SetReadStatus(w http.ResponseWriter, r *http.Request) {
//
// Schemes: http, https
//
- // Parameters:
- // + name: ids
- // in: body
- // description: Database IDs to update
- // required: false
- // type: SetReadStatusRequest
- //
// Responses:
// 200: OKResponse
// default: ErrorResponse
@@ -491,7 +477,7 @@ func SetReadStatus(w http.ResponseWriter, r *http.Request) {
// GetTags (method: GET) will get all tags currently in use
func GetTags(w http.ResponseWriter, _ *http.Request) {
- // swagger:route GET /api/v1/tags tags SetTags
+ // swagger:route GET /api/v1/tags tags GetTags
//
// # Get all current tags
//
@@ -524,7 +510,7 @@ func SetTags(w http.ResponseWriter, r *http.Request) {
//
// # Set message tags
//
- // To remove all tags from a message, pass an empty tags array.
+ // This will overwrite any existing tags for selected message database IDs. To remove all tags from a message, pass an empty tags array.
//
// Consumes:
// - application/json
@@ -534,13 +520,6 @@ func SetTags(w http.ResponseWriter, r *http.Request) {
//
// Schemes: http, https
//
- // Parameters:
- // + name: ids
- // in: body
- // description: Database IDs to update
- // required: true
- // type: SetTagsRequest
- //
// Responses:
// 200: OKResponse
// default: ErrorResponse
@@ -576,11 +555,11 @@ func SetTags(w http.ResponseWriter, r *http.Request) {
// ReleaseMessage (method: POST) will release a message via a pre-configured external SMTP server.
// If no IDs are provided then all messages are updated.
func ReleaseMessage(w http.ResponseWriter, r *http.Request) {
- // swagger:route POST /api/v1/message/{ID}/release message Release
+ // swagger:route POST /api/v1/message/{ID}/release message ReleaseMessage
//
// # Release message
//
- // Release a message via a pre-configured external SMTP server..
+ // Release a message via a pre-configured external SMTP server. This is only enabled if message relaying has been configured.
//
// Consumes:
// - application/json
@@ -590,18 +569,6 @@ func ReleaseMessage(w http.ResponseWriter, r *http.Request) {
//
// Schemes: http, https
//
- // Parameters:
- // + name: ID
- // in: path
- // description: Database ID
- // required: true
- // type: string
- // + name: to
- // in: body
- // description: Array of email addresses to release message to
- // required: true
- // type: ReleaseMessageRequest
- //
// Responses:
// 200: OKResponse
// default: ErrorResponse
@@ -618,7 +585,7 @@ func ReleaseMessage(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
- data := releaseMessageRequest{}
+ data := releaseMessageRequestBody{}
if err := decoder.Decode(&data); err != nil {
httpError(w, err.Error())
@@ -702,7 +669,7 @@ func ReleaseMessage(w http.ResponseWriter, r *http.Request) {
// HTMLCheck returns a summary of the HTML client support
func HTMLCheck(w http.ResponseWriter, r *http.Request) {
- // swagger:route GET /api/v1/message/{ID}/html-check Other HTMLCheckResponse
+ // swagger:route GET /api/v1/message/{ID}/html-check Other HTMLCheck
//
// # HTML check (beta)
//
@@ -716,13 +683,6 @@ func HTMLCheck(w http.ResponseWriter, r *http.Request) {
//
// Schemes: http, https
//
- // Parameters:
- // + name: ID
- // in: path
- // description: Database ID
- // required: true
- // type: string
- //
// Responses:
// 200: HTMLCheckResponse
// default: ErrorResponse
@@ -754,7 +714,7 @@ func HTMLCheck(w http.ResponseWriter, r *http.Request) {
// LinkCheck returns a summary of links in the email
func LinkCheck(w http.ResponseWriter, r *http.Request) {
- // swagger:route GET /api/v1/message/{ID}/link-check Other LinkCheckResponse
+ // swagger:route GET /api/v1/message/{ID}/link-check Other LinkCheck
//
// # Link check (beta)
//
@@ -768,19 +728,6 @@ func LinkCheck(w http.ResponseWriter, r *http.Request) {
//
// Schemes: http, https
//
- // Parameters:
- // + name: ID
- // in: path
- // description: Database ID
- // required: true
- // type: string
- // + name: follow
- // in: query
- // description: Follow redirects
- // required: false
- // type: boolean
- // default: false
- //
// Responses:
// 200: LinkCheckResponse
// default: ErrorResponse
diff --git a/server/apiv1/structs.go b/server/apiv1/structs.go
index 318ef69..8bf1290 100644
--- a/server/apiv1/structs.go
+++ b/server/apiv1/structs.go
@@ -22,9 +22,6 @@ type MessagesSummary struct {
// Total number of messages matching current query
MessagesCount int `json:"messages_count"`
- // // Number of results returned on current page
- // Count int `json:"count"`
-
// Pagination offset
Start int `json:"start"`
@@ -32,7 +29,7 @@ type MessagesSummary struct {
Tags []string `json:"tags"`
// Messages summary
- // in:body
+ // in: body
Messages []storage.MessageSummary `json:"messages"`
}
diff --git a/server/apiv1/swagger.go b/server/apiv1/swagger.go
index 43e0646..b5ed980 100644
--- a/server/apiv1/swagger.go
+++ b/server/apiv1/swagger.go
@@ -1,11 +1,15 @@
package apiv1
+import "os"
+
// These structs are for the purpose of defining swagger HTTP responses
// Application information
// swagger:response InfoResponse
type infoResponse struct {
// Application information
+ //
+ // in: body
Body appInformation
}
@@ -13,6 +17,8 @@ type infoResponse struct {
// swagger:response WebUIConfigurationResponse
type webUIConfigurationResponse struct {
// Web UI configuration settings
+ //
+ // in: body
Body webUIConfiguration
}
@@ -28,81 +34,140 @@ type messagesSummaryResponse struct {
// swagger:model MessageHeaders
type messageHeaders map[string][]string
+// swagger:parameters DeleteMessages
+type deleteMessagesParams struct {
+ // in: body
+ Body *deleteMessagesRequestBody
+}
+
// Delete request
// swagger:model DeleteRequest
-type deleteRequest struct {
- // ids
- // in:body
+type deleteMessagesRequestBody struct {
+ // Array of message database IDs
+ //
+ // required: false
+ // example: ["5dec4247-812e-4b77-9101-e25ad406e9ea", "8ac66bbc-2d9a-4c41-ad99-00aa75fa674e"]
IDs []string `json:"ids"`
}
+// swagger:parameters SetReadStatus
+type setReadStatusParams struct {
+ // in: body
+ Body *setReadStatusRequestBody
+}
+
// Set read status request
-// swagger:model SetReadStatusRequest
-type setReadStatusRequest struct {
+// swagger:model setReadStatusRequestBody
+type setReadStatusRequestBody struct {
// Read status
+ //
+ // required: false
+ // default: false
+ // example: true
Read bool `json:"read"`
- // ids
- // in:body
+ // Array of message database IDs
+ //
+ // required: false
+ // example: ["5dec4247-812e-4b77-9101-e25ad406e9ea", "8ac66bbc-2d9a-4c41-ad99-00aa75fa674e"]
IDs []string `json:"ids"`
}
+// swagger:parameters SetTags
+type setTagsParams struct {
+ // in: body
+ Body *setTagsRequestBody
+}
+
// Set tags request
-// swagger:model SetTagsRequest
-type setTagsRequest struct {
- // Tags
- // in:body
+// swagger:model setTagsRequestBody
+type setTagsRequestBody struct {
+ // Array of tag names to set
+ //
+ // required: true
+ // example: ["Tag 1", "Tag 2"]
Tags []string `json:"tags"`
- // IDs
- // in:body
+ // Array of message database IDs
+ //
+ // required: true
+ // example: ["5dec4247-812e-4b77-9101-e25ad406e9ea", "8ac66bbc-2d9a-4c41-ad99-00aa75fa674e"]
IDs []string `json:"ids"`
}
+// swagger:parameters ReleaseMessage
+type releaseMessageParams struct {
+ // Message database ID
+ //
+ // in: path
+ // description: Message database ID
+ // required: true
+ ID string
+
+ // in: body
+ Body *releaseMessageRequestBody
+}
+
// Release request
-// swagger:model ReleaseMessageRequest
-type releaseMessageRequest struct {
- // To
- // in:body
+// swagger:model releaseMessageRequestBody
+type releaseMessageRequestBody struct {
+ // Array of email addresses to relay the message to
+ //
+ // required: true
+ // example: ["user1@example.com", "user2@example.com"]
To []string `json:"to"`
}
+// swagger:parameters HTMLCheck
+type htmlCheckParams struct {
+ // Message database ID
+ //
+ // in: path
+ // description: Message database ID
+ // required: true
+ ID string
+}
+
+// swagger:parameters LinkCheck
+type linkCheckParams struct {
+ // Message database ID
+ //
+ // in: path
+ // description: Message database ID
+ // required: true
+ ID string
+
+ // Follow redirects
+ //
+ // in: query
+ // description: Follow redirects
+ // required: false
+ // default: false
+ Follow string `json:"follow"`
+}
+
// Binary data response inherits the attachment's content type
// swagger:response BinaryResponse
type binaryResponse struct {
// in: body
- Body string
+ File os.File
}
// Plain text response
// swagger:response TextResponse
-type textResponse struct {
- // in: body
- Body string
-}
+type textResponse string
// HTML response
// swagger:response HTMLResponse
-type htmlResponse struct {
- // in: body
- Body string
-}
+type htmlResponse string
// Error response
// swagger:response ErrorResponse
-type errorResponse struct {
- // The error message
- // in: body
- Body string
-}
+type errorResponse string
// Plain text "ok" response
// swagger:response OKResponse
-type okResponse struct {
- // Default response
- // in: body
- Body string
-}
+type okResponse string
// Plain JSON array response
// swagger:response ArrayResponse
diff --git a/server/ui/api/v1/swagger.json b/server/ui/api/v1/swagger.json
index d0a85a5..29c18da 100644
--- a/server/ui/api/v1/swagger.json
+++ b/server/ui/api/v1/swagger.json
@@ -66,7 +66,7 @@
"parameters": [
{
"type": "string",
- "description": "Database ID",
+ "description": "Message database ID",
"name": "ID",
"in": "path",
"required": true
@@ -136,11 +136,11 @@
"Other"
],
"summary": "HTML check (beta)",
- "operationId": "HTMLCheckResponse",
+ "operationId": "HTMLCheck",
"parameters": [
{
"type": "string",
- "description": "Database ID",
+ "description": "Message database ID",
"name": "ID",
"in": "path",
"required": true
@@ -173,18 +173,19 @@
"Other"
],
"summary": "Link check (beta)",
- "operationId": "LinkCheckResponse",
+ "operationId": "LinkCheck",
"parameters": [
{
"type": "string",
- "description": "Database ID",
+ "description": "Message database ID",
"name": "ID",
"in": "path",
"required": true
},
{
- "type": "boolean",
- "default": false,
+ "type": "string",
+ "default": "false",
+ "x-go-name": "Follow",
"description": "Follow redirects",
"name": "follow",
"in": "query"
@@ -223,7 +224,7 @@
"parameters": [
{
"type": "string",
- "description": "Database ID",
+ "description": "Message database ID",
"name": "ID",
"in": "path",
"required": true
@@ -323,7 +324,7 @@
},
"/api/v1/message/{ID}/release": {
"post": {
- "description": "Release a message via a pre-configured external SMTP server..",
+ "description": "Release a message via a pre-configured external SMTP server. This is only enabled if message relaying has been configured.",
"consumes": [
"application/json"
],
@@ -338,24 +339,20 @@
"message"
],
"summary": "Release message",
- "operationId": "Release",
+ "operationId": "ReleaseMessage",
"parameters": [
{
"type": "string",
- "description": "Database ID",
+ "description": "Message database ID",
"name": "ID",
"in": "path",
"required": true
},
{
- "description": "Array of email addresses to release message to",
- "name": "to",
+ "name": "Body",
"in": "body",
- "required": true,
"schema": {
- "description": "Array of email addresses to release message to",
- "type": "object",
- "$ref": "#/definitions/ReleaseMessageRequest"
+ "$ref": "#/definitions/releaseMessageRequestBody"
}
}
],
@@ -428,13 +425,10 @@
"operationId": "SetReadStatus",
"parameters": [
{
- "description": "Database IDs to update",
- "name": "ids",
+ "name": "Body",
"in": "body",
"schema": {
- "description": "Database IDs to update",
- "type": "object",
- "$ref": "#/definitions/SetReadStatusRequest"
+ "$ref": "#/definitions/setReadStatusRequestBody"
}
}
],
@@ -448,7 +442,7 @@
}
},
"delete": {
- "description": "If no IDs are provided then all messages are deleted.",
+ "description": "Delete individual or all messages. If no IDs are provided then all messages are deleted.",
"consumes": [
"application/json"
],
@@ -463,15 +457,12 @@
"messages"
],
"summary": "Delete messages",
- "operationId": "Delete",
+ "operationId": "DeleteMessages",
"parameters": [
{
- "description": "Database IDs to delete",
- "name": "ids",
+ "name": "Body",
"in": "body",
"schema": {
- "description": "Database IDs to delete",
- "type": "object",
"$ref": "#/definitions/DeleteRequest"
}
}
@@ -534,7 +525,7 @@
}
},
"delete": {
- "description": "Deletes messages matching a search.",
+ "description": "Delete all messages matching a search.",
"produces": [
"application/json"
],
@@ -546,7 +537,7 @@
"messages"
],
"summary": "Delete messages by search",
- "operationId": "MessagesSummary",
+ "operationId": "DeleteSearch",
"parameters": [
{
"type": "string",
@@ -580,7 +571,7 @@
"tags"
],
"summary": "Get all current tags",
- "operationId": "SetTags",
+ "operationId": "GetTags",
"responses": {
"200": {
"$ref": "#/responses/ArrayResponse"
@@ -591,7 +582,7 @@
}
},
"put": {
- "description": "To remove all tags from a message, pass an empty tags array.",
+ "description": "This will overwrite any existing tags for selected message database IDs. To remove all tags from a message, pass an empty tags array.",
"consumes": [
"application/json"
],
@@ -609,14 +600,10 @@
"operationId": "SetTags",
"parameters": [
{
- "description": "Database IDs to update",
- "name": "ids",
+ "name": "Body",
"in": "body",
- "required": true,
"schema": {
- "description": "Database IDs to update",
- "type": "object",
- "$ref": "#/definitions/SetTagsRequest"
+ "$ref": "#/definitions/setTagsRequestBody"
}
}
],
@@ -807,17 +794,26 @@
"type": "object",
"properties": {
"ids": {
- "description": "ids\nin:body",
+ "description": "Array of message database IDs",
"type": "array",
"items": {
"type": "string"
},
- "x-go-name": "IDs"
+ "x-go-name": "IDs",
+ "example": [
+ "5dec4247-812e-4b77-9101-e25ad406e9ea",
+ "8ac66bbc-2d9a-4c41-ad99-00aa75fa674e"
+ ]
}
},
- "x-go-name": "deleteRequest",
+ "x-go-name": "deleteMessagesRequestBody",
"x-go-package": "github.com/axllent/mailpit/server/apiv1"
},
+ "File": {
+ "type": "object",
+ "title": "File represents an open file descriptor.",
+ "x-go-package": "os"
+ },
"HTMLCheckResponse": {
"description": "Response represents the HTML check response struct",
"type": "object",
@@ -1188,6 +1184,10 @@
"type": "integer",
"format": "int64"
},
+ "Snippet": {
+ "description": "Message snippet includes up to 250 characters",
+ "type": "string"
+ },
"Subject": {
"description": "Email subject",
"type": "string"
@@ -1214,7 +1214,7 @@
"type": "object",
"properties": {
"messages": {
- "description": "Messages summary\nin:body",
+ "description": "Messages summary\nin: body",
"type": "array",
"items": {
"$ref": "#/definitions/MessageSummary"
@@ -1256,67 +1256,6 @@
},
"x-go-package": "github.com/axllent/mailpit/server/apiv1"
},
- "ReleaseMessageRequest": {
- "description": "Release request",
- "type": "object",
- "properties": {
- "to": {
- "description": "To\nin:body",
- "type": "array",
- "items": {
- "type": "string"
- },
- "x-go-name": "To"
- }
- },
- "x-go-name": "releaseMessageRequest",
- "x-go-package": "github.com/axllent/mailpit/server/apiv1"
- },
- "SetReadStatusRequest": {
- "description": "Set read status request",
- "type": "object",
- "properties": {
- "ids": {
- "description": "ids\nin:body",
- "type": "array",
- "items": {
- "type": "string"
- },
- "x-go-name": "IDs"
- },
- "read": {
- "description": "Read status",
- "type": "boolean",
- "x-go-name": "Read"
- }
- },
- "x-go-name": "setReadStatusRequest",
- "x-go-package": "github.com/axllent/mailpit/server/apiv1"
- },
- "SetTagsRequest": {
- "description": "Set tags request",
- "type": "object",
- "properties": {
- "ids": {
- "description": "IDs\nin:body",
- "type": "array",
- "items": {
- "type": "string"
- },
- "x-go-name": "IDs"
- },
- "tags": {
- "description": "Tags\nin:body",
- "type": "array",
- "items": {
- "type": "string"
- },
- "x-go-name": "Tags"
- }
- },
- "x-go-name": "setTagsRequest",
- "x-go-package": "github.com/axllent/mailpit/server/apiv1"
- },
"WebUIConfiguration": {
"description": "Response includes global web UI settings",
"type": "object",
@@ -1350,6 +1289,89 @@
},
"x-go-name": "webUIConfiguration",
"x-go-package": "github.com/axllent/mailpit/server/apiv1"
+ },
+ "releaseMessageRequestBody": {
+ "description": "Release request",
+ "type": "object",
+ "required": [
+ "to"
+ ],
+ "properties": {
+ "to": {
+ "description": "Array of email addresses to relay the message to",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "x-go-name": "To",
+ "example": [
+ "user1@example.com",
+ "user2@example.com"
+ ]
+ }
+ },
+ "x-go-package": "github.com/axllent/mailpit/server/apiv1"
+ },
+ "setReadStatusRequestBody": {
+ "description": "Set read status request",
+ "type": "object",
+ "properties": {
+ "ids": {
+ "description": "Array of message database IDs",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "x-go-name": "IDs",
+ "example": [
+ "5dec4247-812e-4b77-9101-e25ad406e9ea",
+ "8ac66bbc-2d9a-4c41-ad99-00aa75fa674e"
+ ]
+ },
+ "read": {
+ "description": "Read status",
+ "type": "boolean",
+ "default": false,
+ "x-go-name": "Read",
+ "example": true
+ }
+ },
+ "x-go-package": "github.com/axllent/mailpit/server/apiv1"
+ },
+ "setTagsRequestBody": {
+ "description": "Set tags request",
+ "type": "object",
+ "required": [
+ "tags",
+ "ids"
+ ],
+ "properties": {
+ "ids": {
+ "description": "Array of message database IDs",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "x-go-name": "IDs",
+ "example": [
+ "5dec4247-812e-4b77-9101-e25ad406e9ea",
+ "8ac66bbc-2d9a-4c41-ad99-00aa75fa674e"
+ ]
+ },
+ "tags": {
+ "description": "Array of tag names to set",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "x-go-name": "Tags",
+ "example": [
+ "Tag 1",
+ "Tag 2"
+ ]
+ }
+ },
+ "x-go-package": "github.com/axllent/mailpit/server/apiv1"
}
},
"responses": {
@@ -1363,23 +1385,27 @@
}
},
"BinaryResponse": {
- "description": "Binary data response inherits the attachment's content type"
+ "description": "Binary data response inherits the attachment's content type",
+ "schema": {
+ "$ref": "#/definitions/File"
+ }
},
"ErrorResponse": {
- "description": "Error response"
+ "description": "Error response",
+ "schema": {
+ "type": "string"
+ }
},
"HTMLResponse": {
- "description": "HTML response"
+ "description": "HTML response",
+ "schema": {
+ "type": "string"
+ }
},
"InfoResponse": {
"description": "Application information",
"schema": {
"$ref": "#/definitions/AppInformation"
- },
- "headers": {
- "Body": {
- "description": "Application information"
- }
}
},
"MessagesSummaryResponse": {
@@ -1389,20 +1415,21 @@
}
},
"OKResponse": {
- "description": "Plain text \"ok\" response"
+ "description": "Plain text \"ok\" response",
+ "schema": {
+ "type": "string"
+ }
},
"TextResponse": {
- "description": "Plain text response"
+ "description": "Plain text response",
+ "schema": {
+ "type": "string"
+ }
},
"WebUIConfigurationResponse": {
"description": "Web UI configuration",
"schema": {
"$ref": "#/definitions/WebUIConfiguration"
- },
- "headers": {
- "Body": {
- "description": "Web UI configuration settings"
- }
}
}
}