Skip to content

Commit

Permalink
Merge pull request #12 from Ulas-Scan/development
Browse files Browse the repository at this point in the history
Feat: Concurent for ML API
  • Loading branch information
iyoubee authored Jun 12, 2024
2 parents 91056d9 + 616961c commit 54a1add
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 20 deletions.
76 changes: 56 additions & 20 deletions controller/ml.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"net/http"
"net/url"
"strings"
"sync"

"ulascan-be/dto"
"ulascan-be/service"
Expand Down Expand Up @@ -55,6 +56,13 @@ func (c *mlController) GetSentimentAnalysisAndSummarization(ctx *gin.Context) {
return
}

// Validate that the URL is from tokopedia.com
if parsedUrl.Host != "www.tokopedia.com" && parsedUrl.Host != "tokopedia.com" {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_REVIEWS, dto.ErrNotTokopediaUrls.Error(), nil)
ctx.AbortWithStatusJSON(http.StatusBadRequest, res)
return
}

pathParts := strings.Split(parsedUrl.Path, "/")
if len(pathParts) < 3 {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_REVIEWS, dto.ErrProductUrlWrongFormat.Error(), nil)
Expand All @@ -75,13 +83,6 @@ func (c *mlController) GetSentimentAnalysisAndSummarization(ctx *gin.Context) {
return
}

shopAvatar, err := c.tokopediaService.GetShopAvatar(ctx, productReq.ShopDomain)
if err != nil {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_SHOP_AVATAR, err.Error(), nil)
ctx.JSON(http.StatusBadRequest, res)
return
}

// fmt.Println("=== PRODUCT ID ===")
// fmt.Println(product)

Expand Down Expand Up @@ -123,30 +124,65 @@ func (c *mlController) GetSentimentAnalysisAndSummarization(ctx *gin.Context) {
// fmt.Println("=== PREDICT REQ ===")
// fmt.Println(predictReq)

predictResult, err := c.modelService.Predict(ctx, predictReq)
if err != nil {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_PREDICT, err.Error(), nil)
ctx.JSON(http.StatusBadRequest, res)
return
}

var builder strings.Builder
for _, review := range reviews {
builder.WriteString(review.Message)
builder.WriteString("\n")
}
concatenatedMessage := builder.String()

analyzeResult, err := c.geminiService.Analyze(ctx, concatenatedMessage)
if err != nil {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_ANALYZE, err.Error(), nil)
var shopAvatar string
var predictResult dto.PredictResponse
var analyzeResult dto.AnalyzeResponse
var summarizeResult string

var wg sync.WaitGroup
// var shopAvatarErr, predictErr error
var shopAvatarErr, predictErr, analyzeErr, summarizeErr error

wg.Add(4)

go func() {
defer wg.Done()
shopAvatar, shopAvatarErr = c.tokopediaService.GetShopAvatar(ctx, productReq.ShopDomain)
}()

go func() {
defer wg.Done()
predictResult, predictErr = c.modelService.Predict(ctx, predictReq)
}()

go func() {
defer wg.Done()
analyzeResult, analyzeErr = c.geminiService.Analyze(ctx, concatenatedMessage)
}()

go func() {
defer wg.Done()
summarizeResult, err = c.geminiService.Summarize(ctx, concatenatedMessage)
}()

wg.Wait()

if shopAvatarErr != nil {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_SHOP_AVATAR, shopAvatarErr.Error(), nil)
ctx.JSON(http.StatusBadRequest, res)
return
}

summarizeResult, err := c.geminiService.Summarize(ctx, concatenatedMessage)
if err != nil {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_ANALYZE, err.Error(), nil)
if predictErr != nil {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_PREDICT, predictErr.Error(), nil)
ctx.JSON(http.StatusBadRequest, res)
return
}

if summarizeErr != nil {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_ANALYZE, summarizeErr.Error(), nil)
ctx.JSON(http.StatusBadRequest, res)
return
}
if analyzeErr != nil {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_ANALYZE, analyzeErr.Error(), nil)
ctx.JSON(http.StatusBadRequest, res)
return
}
Expand Down
1 change: 1 addition & 0 deletions dto/tokopedia.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const (
var (
ErrProductUrlMissing = errors.New("product url is required")
ErrProductUrlWrongFormat = errors.New("invalid product url format")
ErrNotTokopediaUrls = errors.New("invalid domain, only tokopedia.com urls are accepted")
ErrProductId = errors.New("failed to extract product id")
ErrShopAvatarNotFound = errors.New("shop avatar not found")
)
Expand Down

0 comments on commit 54a1add

Please sign in to comment.