update HTML with new methods
This commit is contained in:
		| @@ -1356,6 +1356,9 @@ func (h APIHandler) CreateMessage(g *gin.Context) ginresp.HTTPResponse { | ||||
| 	if b.Content != nil && len(*b.Content) > user.MaxContentLength() { | ||||
| 		return ginresp.SendAPIError(g, 400, apierr.CONTENT_TOO_LONG, 104, fmt.Sprintf("Content too long (%d characters; max := %d characters)", len(*b.Content), user.MaxContentLength()), nil) | ||||
| 	} | ||||
| 	if len(channelName) > user.MaxChannelNameLength() { | ||||
| 		return ginresp.SendAPIError(g, 400, apierr.CONTENT_TOO_LONG, 106, fmt.Sprintf("Channel too long (max %d characters)", user.MaxChannelNameLength()), nil) | ||||
| 	} | ||||
|  | ||||
| 	if b.UserMessageID != nil { | ||||
| 		msg, err := h.database.GetMessageByUserMessageID(ctx, *b.UserMessageID) | ||||
|   | ||||
| @@ -44,7 +44,6 @@ func NewMessageHandler(app *logic.Application) MessageHandler { | ||||
| // @Failure     400        {object} ginresp.apiError | ||||
| // @Failure     401        {object} ginresp.apiError | ||||
| // @Failure     403        {object} ginresp.apiError | ||||
| // @Failure     404        {object} ginresp.apiError | ||||
| // @Failure     500        {object} ginresp.apiError | ||||
| // | ||||
| // @Router      /send.php [POST] | ||||
| @@ -93,10 +92,9 @@ func (h MessageHandler) SendMessageCompat(g *gin.Context) ginresp.HTTPResponse { | ||||
| // | ||||
| // @Success     200        {object} handler.sendMessageInternal.response | ||||
| // @Failure     400        {object} ginresp.apiError | ||||
| // @Failure     401        {object} ginresp.apiError | ||||
| // @Failure     403        {object} ginresp.apiError | ||||
| // @Failure     404        {object} ginresp.apiError | ||||
| // @Failure     500        {object} ginresp.apiError | ||||
| // @Failure     401        {object} ginresp.apiError "The user_id was not found or the user_key is wrong" | ||||
| // @Failure     403        {object} ginresp.apiError "The user has exceeded its daily quota - wait 24 hours or upgrade your account" | ||||
| // @Failure     500        {object} ginresp.apiError "An internal server error occurred - try again later" | ||||
| // | ||||
| // @Router      /     [POST] | ||||
| // @Router      /send [POST] | ||||
| @@ -212,6 +210,9 @@ func (h MessageHandler) sendMessageInternal(g *gin.Context, ctx *logic.AppContex | ||||
| 	if Content != nil && len(*Content) > user.MaxContentLength() { | ||||
| 		return ginresp.SendAPIError(g, 400, apierr.CONTENT_TOO_LONG, 104, fmt.Sprintf("Content too long (%d characters; max := %d characters)", len(*Content), user.MaxContentLength()), nil) | ||||
| 	} | ||||
| 	if len(channelName) > user.MaxChannelNameLength() { | ||||
| 		return ginresp.SendAPIError(g, 400, apierr.CONTENT_TOO_LONG, 106, fmt.Sprintf("Channel too long (max %d characters)", user.MaxChannelNameLength()), nil) | ||||
| 	} | ||||
|  | ||||
| 	if UserMessageID != nil { | ||||
| 		msg, err := h.database.GetMessageByUserMessageID(ctx, *UserMessageID) | ||||
|   | ||||
| @@ -4,43 +4,47 @@ import ( | ||||
| 	"blackforestbytes.com/simplecloudnotifier/common/ginresp" | ||||
| 	"blackforestbytes.com/simplecloudnotifier/logic" | ||||
| 	"blackforestbytes.com/simplecloudnotifier/website" | ||||
| 	"errors" | ||||
| 	"github.com/gin-gonic/gin" | ||||
| 	"net/http" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| type WebsiteHandler struct { | ||||
| 	app *logic.Application | ||||
| 	app         *logic.Application | ||||
| 	rexTemplate *regexp.Regexp | ||||
| } | ||||
|  | ||||
| func NewWebsiteHandler(app *logic.Application) WebsiteHandler { | ||||
| 	return WebsiteHandler{ | ||||
| 		app: app, | ||||
| 		app:         app, | ||||
| 		rexTemplate: regexp.MustCompile("{{template\\|[A-Za-z0-9_\\-.]+}}"), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (h WebsiteHandler) Index(g *gin.Context) ginresp.HTTPResponse { | ||||
| 	return h.serveAsset(g, "index.html") | ||||
| 	return h.serveAsset(g, "index.html", true) | ||||
| } | ||||
|  | ||||
| func (h WebsiteHandler) APIDocs(g *gin.Context) ginresp.HTTPResponse { | ||||
| 	return h.serveAsset(g, "api.html") | ||||
| 	return h.serveAsset(g, "api.html", true) | ||||
| } | ||||
|  | ||||
| func (h WebsiteHandler) APIDocsMore(g *gin.Context) ginresp.HTTPResponse { | ||||
| 	return h.serveAsset(g, "api_more.html") | ||||
| 	return h.serveAsset(g, "api_more.html", true) | ||||
| } | ||||
|  | ||||
| func (h WebsiteHandler) MessageSent(g *gin.Context) ginresp.HTTPResponse { | ||||
| 	return h.serveAsset(g, "message_sent.html") | ||||
| 	return h.serveAsset(g, "message_sent.html", true) | ||||
| } | ||||
|  | ||||
| func (h WebsiteHandler) FaviconIco(g *gin.Context) ginresp.HTTPResponse { | ||||
| 	return h.serveAsset(g, "favicon.ico") | ||||
| 	return h.serveAsset(g, "favicon.ico", false) | ||||
| } | ||||
|  | ||||
| func (h WebsiteHandler) FaviconPNG(g *gin.Context) ginresp.HTTPResponse { | ||||
| 	return h.serveAsset(g, "favicon.png") | ||||
| 	return h.serveAsset(g, "favicon.png", false) | ||||
| } | ||||
|  | ||||
| func (h WebsiteHandler) Javascript(g *gin.Context) ginresp.HTTPResponse { | ||||
| @@ -53,7 +57,7 @@ func (h WebsiteHandler) Javascript(g *gin.Context) ginresp.HTTPResponse { | ||||
| 		return ginresp.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | ||||
| 	} | ||||
|  | ||||
| 	return h.serveAsset(g, "js/"+u.Filename) | ||||
| 	return h.serveAsset(g, "js/"+u.Filename, false) | ||||
| } | ||||
|  | ||||
| func (h WebsiteHandler) CSS(g *gin.Context) ginresp.HTTPResponse { | ||||
| @@ -66,15 +70,32 @@ func (h WebsiteHandler) CSS(g *gin.Context) ginresp.HTTPResponse { | ||||
| 		return ginresp.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | ||||
| 	} | ||||
|  | ||||
| 	return h.serveAsset(g, "css/"+u.Filename) | ||||
| 	return h.serveAsset(g, "css/"+u.Filename, false) | ||||
| } | ||||
|  | ||||
| func (h WebsiteHandler) serveAsset(g *gin.Context, fn string) ginresp.HTTPResponse { | ||||
| func (h WebsiteHandler) serveAsset(g *gin.Context, fn string, repl bool) ginresp.HTTPResponse { | ||||
| 	data, err := website.Assets.ReadFile(fn) | ||||
| 	if err != nil { | ||||
| 		return ginresp.Status(http.StatusNotFound) | ||||
| 	} | ||||
|  | ||||
| 	if repl { | ||||
| 		failed := false | ||||
| 		data = h.rexTemplate.ReplaceAllFunc(data, func(match []byte) []byte { | ||||
| 			prefix := len("{{template|") | ||||
| 			suffix := len("}}") | ||||
| 			fnSub := match[prefix : len(match)-suffix] | ||||
| 			subdata, err := website.Assets.ReadFile(string(fnSub)) | ||||
| 			if err != nil { | ||||
| 				failed = true | ||||
| 			} | ||||
| 			return subdata | ||||
| 		}) | ||||
| 		if failed { | ||||
| 			return ginresp.InternalError(errors.New("template replacement failed")) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	mime := "text/plain" | ||||
|  | ||||
| 	lowerFN := strings.ToLower(fn) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user