blob: 7bf363a7ca4c3c50c1649711c954f56a10c59784 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package middleware
import (
"fmt"
"net/url"
"os"
"path"
"path/filepath"
"strings"
"github.com/apache/incubator-answer/internal/service/service_config"
"github.com/apache/incubator-answer/internal/service/uploader"
"github.com/apache/incubator-answer/pkg/converter"
"github.com/gin-gonic/gin"
"github.com/segmentfault/pacman/log"
)
type AvatarMiddleware struct {
serviceConfig *service_config.ServiceConfig
uploaderService uploader.UploaderService
}
// NewAvatarMiddleware new auth user middleware
func NewAvatarMiddleware(serviceConfig *service_config.ServiceConfig,
uploaderService uploader.UploaderService,
) *AvatarMiddleware {
return &AvatarMiddleware{
serviceConfig: serviceConfig,
uploaderService: uploaderService,
}
}
func (am *AvatarMiddleware) AvatarThumb() gin.HandlerFunc {
return func(ctx *gin.Context) {
uri := ctx.Request.RequestURI
if strings.Contains(uri, "/uploads/avatar/") {
size := converter.StringToInt(ctx.Query("s"))
uriWithoutQuery, _ := url.Parse(uri)
filename := filepath.Base(uriWithoutQuery.Path)
filePath := fmt.Sprintf("%s/avatar/%s", am.serviceConfig.UploadPath, filename)
var err error
if size != 0 {
filePath, err = am.uploaderService.AvatarThumbFile(ctx, filename, size)
if err != nil {
log.Error(err)
ctx.Abort()
}
}
avatarFile, err := os.ReadFile(filePath)
if err != nil {
log.Error(err)
ctx.Abort()
return
}
ctx.Header("content-type", fmt.Sprintf("image/%s", strings.TrimLeft(path.Ext(filePath), ".")))
_, err = ctx.Writer.Write(avatarFile)
if err != nil {
log.Error(err)
}
ctx.Abort()
return
} else {
urlInfo, err := url.Parse(uri)
if err != nil {
ctx.Next()
return
}
ext := strings.TrimPrefix(filepath.Ext(urlInfo.Path), ".")
ctx.Header("content-type", fmt.Sprintf("image/%s", ext))
}
ctx.Next()
}
}