diff --git a/pkg/app/blob_routes.go b/pkg/app/blob_routes.go index 376bf86..b19a03d 100644 --- a/pkg/app/blob_routes.go +++ b/pkg/app/blob_routes.go @@ -29,6 +29,10 @@ func InitializeBlobRoutes(g *gin.Engine) { { protected.POST("/upload", uploadBlob) } + unprotected := g.Group("/api/blob") + { + unprotected.POST("/search", searchBlob) + } } @@ -45,14 +49,6 @@ func uploadBlob(c *gin.Context) { return } - if err != nil { - c.JSON(http.StatusBadRequest, models.ErrorResponse{ - Code: http.StatusBadRequest, - Message: err.Error(), - }) - return - } - id := uuid.NewString() folder1 := id[0:2] folder2 := id[2:4] @@ -205,3 +201,48 @@ func uploadBlob(c *gin.Context) { } return } + +func searchBlob(c *gin.Context) { + // Source + file, err := c.FormFile("file") + + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse{ + Code: http.StatusBadRequest, + Message: err.Error(), + }) + return + } + + fileObj, _ := file.Open() + originalImage, _, err := image.Decode(fileObj) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse{ + Code: http.StatusBadRequest, + Message: err.Error(), + }) + } + + hash, err := goimagehash.PerceptionHash(originalImage) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse{ + Code: http.StatusBadRequest, + Message: err.Error(), + }) + return + } + hashInt := hash.GetHash() + + similarPosts, err := services.SimilaritySearch(hashInt) + if err != nil { + c.JSON(http.StatusInternalServerError, models.ErrorResponse{ + Code: http.StatusInternalServerError, + Message: err.Error(), + }) + return + } + c.JSON(http.StatusOK, + models.SimilarResponse{ + Similar: similarPosts, + }) +} diff --git a/pkg/models/item.go b/pkg/models/item.go index e44939e..ebd108c 100644 --- a/pkg/models/item.go +++ b/pkg/models/item.go @@ -24,5 +24,7 @@ type PostListItem struct { type PostSimilarityListItem struct { ID string `json:"id"` + ImagePath string `json:"image_path"` + ImageThumbnailPath string `json:"thumbnail_path"` Distance int `json:"distance"` } diff --git a/pkg/models/responses.go b/pkg/models/responses.go index e999360..ef12f8a 100644 --- a/pkg/models/responses.go +++ b/pkg/models/responses.go @@ -28,6 +28,11 @@ type BlobSimilarResponse struct { PreviewUrl string `json:"previewUrl"` Similar []PostSimilarityListItem `json:"similar"` } + +type SimilarResponse struct { + Similar []PostSimilarityListItem `json:"similar"` +} + type PostPaginationResponse struct { CurrentPage int `json:"currentPage"` TotalPage int `json:"totalPage"` diff --git a/pkg/services/blob.go b/pkg/services/blob.go index 22fb508..32815b3 100644 --- a/pkg/services/blob.go +++ b/pkg/services/blob.go @@ -38,8 +38,10 @@ func SimilaritySearch(originalHashInt uint64) ([]models.PostSimilarityListItem, var post database.Post database.DB.Where("blob_id = ?", blob.ID).Find(&post) posts = append(posts, models.PostSimilarityListItem{ - ID: post.ID, - Distance: distance, + ID: post.ID, + ImageThumbnailPath: "/data/" + blob.ThumbnailFilePath, + ImagePath: "/data/" + blob.FilePath, + Distance: distance, }) } } diff --git a/pkg/web/src/lib/api.ts b/pkg/web/src/lib/api.ts index 3a1a494..16ea377 100644 --- a/pkg/web/src/lib/api.ts +++ b/pkg/web/src/lib/api.ts @@ -123,6 +123,28 @@ export async function uploadBlob({ file, onProgress }) { return response.data; } +export async function searchBlob({ file, onProgress }) { + var formData = new FormData(); + formData.append("file", file); + const endpoint = url + "/api/blob/search"; + const response = await axios({ + url: endpoint, + method: "POST", + headers: { + 'Authorization': 'Bearer ' + current_token, + 'Content-Type': 'multipart/form-data', + }, + withCredentials: true, + data: formData, + onUploadProgress: e => { + if (onProgress) { + onProgress(e) + } + } + }) + return response.data; +} + export async function postCreate({ blob_id, source_url, tags }) { const endpoint = url + "/api/post/create"; const response = await axios({ diff --git a/pkg/web/src/lib/components/ui/Navbar.svelte b/pkg/web/src/lib/components/ui/Navbar.svelte index 3d367fe..dbd5956 100644 --- a/pkg/web/src/lib/components/ui/Navbar.svelte +++ b/pkg/web/src/lib/components/ui/Navbar.svelte @@ -41,6 +41,7 @@