fix:knowlegde base file
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
This commit is contained in:
parent
29387100fa
commit
a0af655a56
|
|
@ -2,29 +2,61 @@ package mapper
|
|||
|
||||
import (
|
||||
"narasi-ahli-be/app/database/entity"
|
||||
"path/filepath"
|
||||
|
||||
res "narasi-ahli-be/app/module/knowledge_base/response"
|
||||
)
|
||||
|
||||
func KnowledgeBaseResponseMapper(kb *entity.KnowledgeBase, host string) (out *res.KnowledgeBaseResponse) {
|
||||
func KnowledgeBaseResponseMapper(
|
||||
kb *entity.KnowledgeBase,
|
||||
host string,
|
||||
) (out *res.KnowledgeBaseResponse) {
|
||||
|
||||
if kb == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
viewerBase := host + "/knowledge-base/viewer/"
|
||||
|
||||
var journalUrl, audioUrl, videoUrl *string
|
||||
|
||||
// JOURNAL
|
||||
if kb.FileJournalUrl != nil && *kb.FileJournalUrl != "" {
|
||||
filename := filepath.Base(*kb.FileJournalUrl)
|
||||
url := viewerBase + filename
|
||||
journalUrl = &url
|
||||
}
|
||||
|
||||
// AUDIO
|
||||
if kb.FileAudioUrl != nil && *kb.FileAudioUrl != "" {
|
||||
filename := filepath.Base(*kb.FileAudioUrl)
|
||||
url := viewerBase + filename
|
||||
audioUrl = &url
|
||||
}
|
||||
|
||||
// VIDEO
|
||||
if kb.FileVideoUrl != nil && *kb.FileVideoUrl != "" {
|
||||
filename := filepath.Base(*kb.FileVideoUrl)
|
||||
url := viewerBase + filename
|
||||
videoUrl = &url
|
||||
}
|
||||
|
||||
out = &res.KnowledgeBaseResponse{
|
||||
ID: kb.ID,
|
||||
AgentId: kb.AgentId,
|
||||
AgentName: kb.AgentName,
|
||||
CreatedById: kb.CreatedById,
|
||||
Title: kb.Title,
|
||||
Status: kb.Status,
|
||||
ID: kb.ID,
|
||||
AgentId: kb.AgentId,
|
||||
AgentName: kb.AgentName,
|
||||
CreatedById: kb.CreatedById,
|
||||
Title: kb.Title,
|
||||
Status: kb.Status,
|
||||
|
||||
FileJournalUrl: kb.FileJournalUrl,
|
||||
FileAudioUrl: kb.FileAudioUrl,
|
||||
FileVideoUrl: kb.FileVideoUrl,
|
||||
// 🔥 HANYA viewer URL yang dikirim
|
||||
FileJournalUrl: journalUrl,
|
||||
FileAudioUrl: audioUrl,
|
||||
FileVideoUrl: videoUrl,
|
||||
|
||||
IsActive: kb.IsActive,
|
||||
CreatedAt: kb.CreatedAt,
|
||||
UpdatedAt: kb.UpdatedAt,
|
||||
IsActive: kb.IsActive,
|
||||
CreatedAt: kb.CreatedAt,
|
||||
UpdatedAt: kb.UpdatedAt,
|
||||
}
|
||||
|
||||
return out
|
||||
|
|
|
|||
|
|
@ -118,25 +118,29 @@ func (r *KnowledgeBaseRepository) Delete(id uint) (err error) {
|
|||
return r.DB.DB.Delete(&entity.KnowledgeBase{}, id).Error
|
||||
}
|
||||
|
||||
func (r *KnowledgeBaseRepository) FindByFilename(filename string) (data *entity.KnowledgeBase, fileType string, err error) {
|
||||
query := r.DB.DB.Model(&entity.KnowledgeBase{}).Where("is_active = ?", true)
|
||||
func (r *KnowledgeBaseRepository) FindByFilename(filename string) (*entity.KnowledgeBase, string, error) {
|
||||
|
||||
// cari berdasarkan url yang mengandung filename
|
||||
var kb entity.KnowledgeBase
|
||||
like := "%" + filename
|
||||
|
||||
// journal
|
||||
var kb entity.KnowledgeBase
|
||||
if err := query.Where("file_journal_url LIKE ?", like).First(&kb).Error; err == nil {
|
||||
if err := r.DB.DB.
|
||||
Where("is_active = ?", true).
|
||||
Where("file_journal_url LIKE ?", like).
|
||||
First(&kb).Error; err == nil {
|
||||
return &kb, "journal", nil
|
||||
}
|
||||
|
||||
// audio
|
||||
if err := query.Where("file_audio_url LIKE ?", like).First(&kb).Error; err == nil {
|
||||
if err := r.DB.DB.
|
||||
Where("is_active = ?", true).
|
||||
Where("file_audio_url LIKE ?", like).
|
||||
First(&kb).Error; err == nil {
|
||||
return &kb, "audio", nil
|
||||
}
|
||||
|
||||
// video
|
||||
if err := query.Where("file_video_url LIKE ?", like).First(&kb).Error; err == nil {
|
||||
if err := r.DB.DB.
|
||||
Where("is_active = ?", true).
|
||||
Where("file_video_url LIKE ?", like).
|
||||
First(&kb).Error; err == nil {
|
||||
return &kb, "video", nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -88,9 +88,11 @@ func (s *KnowledgeBaseService) uploadFileToMinio(
|
|||
newFilename := fmt.Sprintf("%s_%d%s", filenameWithoutExt, now.UnixNano(), ext)
|
||||
|
||||
objectName := fmt.Sprintf(
|
||||
"knowledge-base/%s/%s/%s",
|
||||
"knowledge-base/%s/%s/%d/%d/%s",
|
||||
agentId,
|
||||
folder,
|
||||
now.Year(),
|
||||
now.Month(),
|
||||
newFilename,
|
||||
)
|
||||
|
||||
|
|
@ -100,13 +102,16 @@ func (s *KnowledgeBaseService) uploadFileToMinio(
|
|||
objectName,
|
||||
src,
|
||||
fileHeader.Size,
|
||||
minio.PutObjectOptions{},
|
||||
minio.PutObjectOptions{
|
||||
ContentType: mime.TypeByExtension(ext),
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &newFilename, nil
|
||||
// 🔥 RETURN OBJECT PATH, BUKAN FILENAME
|
||||
return &objectName, nil
|
||||
}
|
||||
|
||||
func (s *KnowledgeBaseService) All(req request.KnowledgeBaseQueryRequest) (data []*response.KnowledgeBaseResponse, paging paginator.Pagination, err error) {
|
||||
|
|
@ -134,36 +139,39 @@ func getFileExtension(filename string) string {
|
|||
return parts[len(parts)-1]
|
||||
}
|
||||
|
||||
func (s *KnowledgeBaseService) Viewer(c *fiber.Ctx) (err error) {
|
||||
func (s *KnowledgeBaseService) Viewer(c *fiber.Ctx) error {
|
||||
|
||||
filename := c.Params("filename")
|
||||
|
||||
result, folder, err := s.Repo.FindByFilename(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
return fiber.NewError(fiber.StatusNotFound, "file not found")
|
||||
}
|
||||
|
||||
var objectName string
|
||||
|
||||
switch folder {
|
||||
case "journal":
|
||||
objectName = *result.FileJournalUrl
|
||||
case "audio":
|
||||
objectName = *result.FileAudioUrl
|
||||
case "video":
|
||||
objectName = *result.FileVideoUrl
|
||||
default:
|
||||
return fiber.NewError(fiber.StatusNotFound, "invalid file type")
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
bucketName := s.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
|
||||
|
||||
objectName := fmt.Sprintf("knowledge-base/%s/%s/%s", *result.AgentId, folder, filename)
|
||||
|
||||
s.Log.Info().
|
||||
Str("timestamp", time.Now().Format(time.RFC3339)).
|
||||
Str("Service:Resource", "KnowledgeBase:Viewer").
|
||||
Interface("objectName", objectName).
|
||||
Msg("")
|
||||
|
||||
minioClient, err := s.MinioStorage.ConnectMinio()
|
||||
if err != nil {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
||||
"error": true,
|
||||
"msg": err.Error(),
|
||||
})
|
||||
return fiber.ErrInternalServerError
|
||||
}
|
||||
|
||||
fileContent, err := minioClient.GetObject(ctx, bucketName, objectName, minio.GetObjectOptions{})
|
||||
if err != nil {
|
||||
return err
|
||||
return fiber.NewError(fiber.StatusNotFound, "file not found in storage")
|
||||
}
|
||||
defer fileContent.Close()
|
||||
|
||||
|
|
@ -171,13 +179,11 @@ func (s *KnowledgeBaseService) Viewer(c *fiber.Ctx) (err error) {
|
|||
if contentType == "" {
|
||||
contentType = "application/octet-stream"
|
||||
}
|
||||
|
||||
c.Set("Content-Type", contentType)
|
||||
|
||||
if _, err := io.Copy(c.Response().BodyWriter(), fileContent); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
_, err = io.Copy(c.Response().BodyWriter(), fileContent)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *KnowledgeBaseService) Show(id uint) (data *response.KnowledgeBaseResponse, err error) {
|
||||
|
|
@ -233,19 +239,15 @@ func (s *KnowledgeBaseService) Create(c *fiber.Ctx) (data *response.KnowledgeBas
|
|||
|
||||
entity := req.ToEntity()
|
||||
|
||||
viewerBase := s.Cfg.App.Domain + "/knowledge-base/viewer/"
|
||||
|
||||
if journalFilename != nil {
|
||||
journalUrl := viewerBase + *journalFilename
|
||||
entity.FileJournalUrl = &journalUrl
|
||||
entity.FileJournalUrl = journalFilename
|
||||
}
|
||||
if audioFilename != nil {
|
||||
audioUrl := viewerBase + *audioFilename
|
||||
entity.FileAudioUrl = &audioUrl
|
||||
entity.FileAudioUrl = audioFilename
|
||||
}
|
||||
if videoFilename != nil {
|
||||
videoUrl := viewerBase + *videoFilename
|
||||
entity.FileVideoUrl = &videoUrl
|
||||
entity.FileVideoUrl = videoFilename
|
||||
}
|
||||
|
||||
if req.Status < 0 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue