mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
[feature] Allow users to export data via the settings panel (#3140)
* [feature] Allow users to export data via the settings panel * rename/move some stuff
This commit is contained in:
@@ -35,6 +35,7 @@ const (
|
||||
TextXML = `text/xml`
|
||||
TextHTML = `text/html`
|
||||
TextCSS = `text/css`
|
||||
TextCSV = `text/csv`
|
||||
)
|
||||
|
||||
// JSONContentType returns whether is application/json(;charset=utf-8)? content-type.
|
||||
|
@@ -88,6 +88,12 @@ var HostMetaHeaders = []string{
|
||||
AppXML,
|
||||
}
|
||||
|
||||
// CSVHeaders just contains the text/csv
|
||||
// MIME type, used for import/export.
|
||||
var CSVHeaders = []string{
|
||||
TextCSV,
|
||||
}
|
||||
|
||||
// NegotiateAccept takes the *gin.Context from an incoming request, and a
|
||||
// slice of Offers, and performs content negotiation for the given request
|
||||
// with the given content-type offers. It will return a string representation
|
||||
|
@@ -18,6 +18,7 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"encoding/csv"
|
||||
"encoding/json"
|
||||
"encoding/xml"
|
||||
"io"
|
||||
@@ -213,6 +214,47 @@ func EncodeXMLResponse(
|
||||
putBuf(buf)
|
||||
}
|
||||
|
||||
// EncodeCSVResponse encodes 'records' as CSV HTTP response
|
||||
// to ResponseWriter with given status code, using CSV content-type.
|
||||
func EncodeCSVResponse(
|
||||
rw http.ResponseWriter,
|
||||
r *http.Request,
|
||||
statusCode int,
|
||||
records [][]string,
|
||||
) {
|
||||
// Acquire buffer.
|
||||
buf := getBuf()
|
||||
|
||||
// Wrap buffer in CSV writer.
|
||||
csvWriter := csv.NewWriter(buf)
|
||||
|
||||
// Write all the records to the buffer.
|
||||
if err := csvWriter.WriteAll(records); err == nil {
|
||||
// Respond with the now-known
|
||||
// size byte slice within buf.
|
||||
WriteResponseBytes(rw, r,
|
||||
statusCode,
|
||||
TextCSV,
|
||||
buf.B,
|
||||
)
|
||||
} else {
|
||||
// This will always be an csv error, we
|
||||
// can't really add any more useful context.
|
||||
log.Error(r.Context(), err)
|
||||
|
||||
// Any error returned here is unrecoverable,
|
||||
// set Internal Server Error JSON response.
|
||||
WriteResponseBytes(rw, r,
|
||||
http.StatusInternalServerError,
|
||||
AppJSON,
|
||||
StatusInternalServerErrorJSON,
|
||||
)
|
||||
}
|
||||
|
||||
// Release.
|
||||
putBuf(buf)
|
||||
}
|
||||
|
||||
// writeResponseUnknownLength handles reading data of unknown legnth
|
||||
// efficiently into memory, and passing on to WriteResponseBytes().
|
||||
func writeResponseUnknownLength(
|
||||
|
Reference in New Issue
Block a user