From cded4d25fc778d6b116a50b7bb0ca665e94768b7 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sun, 15 Oct 2023 19:24:06 +1300 Subject: [PATCH 1/4] Swagger: Update swagger documentation See #188 --- server/apiv1/api.go | 81 ++--------- server/apiv1/structs.go | 5 +- server/apiv1/swagger.go | 138 +++++++++++++----- server/ui/api/v1/swagger.json | 258 ++++++++++++++++++---------------- 4 files changed, 254 insertions(+), 228 deletions(-) diff --git a/server/apiv1/api.go b/server/apiv1/api.go index c1f64a7..4fb20e1 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..583714f 100644 --- a/server/apiv1/swagger.go +++ b/server/apiv1/swagger.go @@ -6,6 +6,8 @@ package apiv1 // swagger:response InfoResponse type infoResponse struct { // Application information + // + // in: body Body appInformation } @@ -13,6 +15,8 @@ type infoResponse struct { // swagger:response WebUIConfigurationResponse type webUIConfigurationResponse struct { // Web UI configuration settings + // + // in: body Body webUIConfiguration } @@ -28,81 +32,137 @@ 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 -} +type binaryResponse string // 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..c85fff4 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,15 +794,19 @@ "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" }, "HTMLCheckResponse": { @@ -1188,6 +1179,10 @@ "type": "integer", "format": "int64" }, + "Snippet": { + "description": "Message snippet includes up to 250 characters", + "type": "string" + }, "Subject": { "description": "Email subject", "type": "string" @@ -1214,7 +1209,7 @@ "type": "object", "properties": { "messages": { - "description": "Messages summary\nin:body", + "description": "Messages summary\nin: body", "type": "array", "items": { "$ref": "#/definitions/MessageSummary" @@ -1256,67 +1251,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 +1284,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 +1380,27 @@ } }, "BinaryResponse": { - "description": "Binary data response inherits the attachment's content type" + "description": "Binary data response inherits the attachment's content type", + "schema": { + "type": "string" + } }, "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 +1410,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" - } } } } From e5646372030a8affb967ab4ee7064f541c6c020f Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sun, 15 Oct 2023 20:55:43 +1300 Subject: [PATCH 2/4] Tests: Add test to validate swagger.json --- .github/workflows/tests.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c26e258..deea3d7 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 @@ -28,9 +29,16 @@ jobs: - run: go test ./internal/storage -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 From e72dd8d9b63f80bafc92779b448f757fb4747760 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sun, 15 Oct 2023 22:02:57 +1300 Subject: [PATCH 3/4] Replace unprintable characters with space in html2text --- .github/workflows/tests.yml | 2 +- internal/tools/html2text/html2text.go | 10 ++ internal/tools/html2text/html2text_test.go | 194 +++++++++++++++++++++ 3 files changed, 205 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index deea3d7..ce99ba5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -26,7 +26,7 @@ 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 - name: Build web UI 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) + + + + + + + +
+
+ + + + +
+ + + + + + +
 
+ + + + + +
+ GitHub +

+ [axllent/mailpit] .github/workflows/tests.yml workflow run + +

+
+ + + + + + +
 
+ +
+ + + + +
+ + + + +
+ + + + +
+ + + + + +
+ + + + +
+ + + + + + + + +
 
+ +

.github/workflows/tests.yml: No jobs were run

+ + + + + + +
 
+ + + + + + + +
+ + + + +
+ + + + +
+ + View workflow 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

+
+ +
+
+ +
                                                           
+ +` From 4c3e073b0c1a825cd687fe575f7cb07157909bef Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Mon, 16 Oct 2023 17:34:10 +1300 Subject: [PATCH 4/4] Change swagger BinaryResponse to os.File --- server/apiv1/swagger.go | 7 ++++++- server/ui/api/v1/swagger.json | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/server/apiv1/swagger.go b/server/apiv1/swagger.go index 583714f..b5ed980 100644 --- a/server/apiv1/swagger.go +++ b/server/apiv1/swagger.go @@ -1,5 +1,7 @@ package apiv1 +import "os" + // These structs are for the purpose of defining swagger HTTP responses // Application information @@ -146,7 +148,10 @@ type linkCheckParams struct { // Binary data response inherits the attachment's content type // swagger:response BinaryResponse -type binaryResponse string +type binaryResponse struct { + // in: body + File os.File +} // Plain text response // swagger:response TextResponse diff --git a/server/ui/api/v1/swagger.json b/server/ui/api/v1/swagger.json index c85fff4..29c18da 100644 --- a/server/ui/api/v1/swagger.json +++ b/server/ui/api/v1/swagger.json @@ -809,6 +809,11 @@ "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", @@ -1382,7 +1387,7 @@ "BinaryResponse": { "description": "Binary data response inherits the attachment's content type", "schema": { - "type": "string" + "$ref": "#/definitions/File" } }, "ErrorResponse": {