Generate avatars for users

This commit is contained in:
nemunaire 2023-11-28 10:06:08 +01:00
parent c2ce947f97
commit 5317daa6b8
3 changed files with 54 additions and 0 deletions

View File

@ -37,9 +37,11 @@ import (
"fmt"
"log"
"net/http"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/nullrocks/identicon"
"git.happydns.org/happyDomain/actions"
"git.happydns.org/happyDomain/config"
@ -70,6 +72,7 @@ func declareUsersAuthRoutes(opts *config.Options, router *gin.RouterGroup) {
apiUserRoutes.Use(userHandler)
apiUserRoutes.GET("", getUser)
apiUserRoutes.GET("/avatar.png", getUserAvatar)
apiSameUserRoutes := router.Group("/users/:uid")
apiSameUserRoutes.Use(userHandler)
@ -273,6 +276,54 @@ func getUser(c *gin.Context) {
}
}
// getUserAvatar returns a unique avatar for the user.
//
// @Summary Show user's avatar.
// @Schemes
// @Description Returns a unique avatar for the user.
// @Tags users
// @Accept json
// @Produce png
// @Param size query int false "Image output desired size"
// @Success 200 {file} png
// @Failure 500 {object} happydns.Error
// @Router /users/{userId}/avatar.png [get]
func getUserAvatar(c *gin.Context) {
user := c.MustGet("user").(*happydns.User)
sizequery := c.DefaultQuery("size", "300")
size, err := strconv.ParseInt(sizequery, 10, 32)
if err != nil {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": fmt.Sprintf("Invalid size asked: %s", err.Error())})
return
} else if size > 2048 {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": "Size too large."})
return
}
ig, err := identicon.New(
"happydomain", // namespace
6, // number of blocks (size)
3, // density of points
)
if err != nil {
log.Printf("Unable to generate user avatar (uid=%s,user=%s): %s", user.Id.String(), user.Email, err.Error())
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "Unable to generate avatar."})
return
}
ii, err := ig.Draw(user.Email)
if err != nil {
log.Printf("Unable to generate user avatar (uid=%s,user=%s): %s", user.Id.String(), user.Email, err.Error())
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "Unable to generate avatar."})
return
}
c.Writer.Header().Set("Content-Type", "image/png")
c.Writer.WriteHeader(http.StatusOK)
ii.Png(int(size), c.Writer)
}
// getUserSettings gets the settings of the given user.
//
// @Summary Retrieve user's settings.

1
go.mod
View File

@ -104,6 +104,7 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04 // indirect
github.com/nrdcg/goinwx v0.10.0 // indirect
github.com/nullrocks/identicon v0.0.0-20180626043057-7875f45b0022 // indirect
github.com/onsi/ginkgo v1.16.4 // indirect
github.com/onsi/gomega v1.19.0 // indirect
github.com/oracle/oci-go-sdk/v32 v32.0.0 // indirect

2
go.sum
View File

@ -269,6 +269,8 @@ github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uY
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nrdcg/goinwx v0.10.0 h1:6W630bjDxQD6OuXKqrFRYVpTt0G/9GXXm3CeOrN0zJM=
github.com/nrdcg/goinwx v0.10.0/go.mod h1:mnMSTi7CXBu2io4DzdOBoGFA1XclD0sEPWJaDhNgkA4=
github.com/nullrocks/identicon v0.0.0-20180626043057-7875f45b0022 h1:Ys0rDzh8s4UMlGaDa1UTA0sfKgvF0hQZzTYX8ktjiDc=
github.com/nullrocks/identicon v0.0.0-20180626043057-7875f45b0022/go.mod h1:x4NsS+uc7ecH/Cbm9xKQ6XzmJM57rWTkjywjfB2yQ18=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=