fix : update fixing schedule publish
This commit is contained in:
parent
79735695df
commit
5699c1b7fa
|
|
@ -2,13 +2,14 @@ package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
|
||||||
"strings"
|
"strings"
|
||||||
"web-medols-be/app/database"
|
"web-medols-be/app/database"
|
||||||
"web-medols-be/app/database/entity"
|
"web-medols-be/app/database/entity"
|
||||||
"web-medols-be/app/module/article_files/request"
|
"web-medols-be/app/module/article_files/request"
|
||||||
"web-medols-be/utils/paginator"
|
"web-medols-be/utils/paginator"
|
||||||
utilSvc "web-medols-be/utils/service"
|
utilSvc "web-medols-be/utils/service"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleFilesRepository struct {
|
type articleFilesRepository struct {
|
||||||
|
|
@ -136,7 +137,32 @@ func (_i *articleFilesRepository) Update(clientId *uuid.UUID, id uint, articleFi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
articleFilesMap, err := utilSvc.StructToMap(articleFiles)
|
// Create a copy without the relation field to avoid updating non-existent columns
|
||||||
|
updateData := &entity.ArticleFiles{
|
||||||
|
ID: articleFiles.ID,
|
||||||
|
ArticleId: articleFiles.ArticleId,
|
||||||
|
UploadID: articleFiles.UploadID,
|
||||||
|
FilePath: articleFiles.FilePath,
|
||||||
|
FileUrl: articleFiles.FileUrl,
|
||||||
|
FileName: articleFiles.FileName,
|
||||||
|
FileThumbnail: articleFiles.FileThumbnail,
|
||||||
|
FileAlt: articleFiles.FileAlt,
|
||||||
|
WidthPixel: articleFiles.WidthPixel,
|
||||||
|
HeightPixel: articleFiles.HeightPixel,
|
||||||
|
Size: articleFiles.Size,
|
||||||
|
DownloadCount: articleFiles.DownloadCount,
|
||||||
|
CreatedById: articleFiles.CreatedById,
|
||||||
|
StatusId: articleFiles.StatusId,
|
||||||
|
IsPublish: articleFiles.IsPublish,
|
||||||
|
PublishedAt: articleFiles.PublishedAt,
|
||||||
|
ClientId: articleFiles.ClientId,
|
||||||
|
IsActive: articleFiles.IsActive,
|
||||||
|
CreatedAt: articleFiles.CreatedAt,
|
||||||
|
UpdatedAt: articleFiles.UpdatedAt,
|
||||||
|
// Exclude Article relation field
|
||||||
|
}
|
||||||
|
|
||||||
|
articleFilesMap, err := utilSvc.StructToMap(updateData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,6 @@ package service
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gofiber/fiber/v2"
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/minio/minio-go/v7"
|
|
||||||
"github.com/rs/zerolog"
|
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
@ -25,6 +21,11 @@ import (
|
||||||
config "web-medols-be/config/config"
|
config "web-medols-be/config/config"
|
||||||
minioStorage "web-medols-be/config/config"
|
minioStorage "web-medols-be/config/config"
|
||||||
"web-medols-be/utils/paginator"
|
"web-medols-be/utils/paginator"
|
||||||
|
|
||||||
|
"github.com/gofiber/fiber/v2"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/minio/minio-go/v7"
|
||||||
|
"github.com/rs/zerolog"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleFilesService
|
// ArticleFilesService
|
||||||
|
|
|
||||||
|
|
@ -473,14 +473,14 @@ func (_i *articlesController) ArticleMonthlyStats(c *fiber.Ctx) error {
|
||||||
|
|
||||||
// PublishScheduling Articles
|
// PublishScheduling Articles
|
||||||
// @Summary PublishScheduling Articles
|
// @Summary PublishScheduling Articles
|
||||||
// @Description API for Publish Schedule of Article
|
// @Description API for Publish Schedule of Article. Supports both date-only format (2006-01-02) and datetime format (2006-01-02 15:04:05)
|
||||||
// @Tags Articles
|
// @Tags Articles
|
||||||
// @Security Bearer
|
// @Security Bearer
|
||||||
// @Param X-Client-Key header string true "Insert the X-Client-Key"
|
// @Param X-Client-Key header string true "Insert the X-Client-Key"
|
||||||
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
|
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
|
||||||
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
|
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
|
||||||
// @Param id query int false "article id"
|
// @Param id query int false "article id"
|
||||||
// @Param date query string false "publish date"
|
// @Param date query string false "publish date/time (format: 2006-01-02 or 2006-01-02 15:04:05)"
|
||||||
// @Success 200 {object} response.Response
|
// @Success 200 {object} response.Response
|
||||||
// @Failure 400 {object} response.BadRequestError
|
// @Failure 400 {object} response.BadRequestError
|
||||||
// @Failure 401 {object} response.UnauthorizedError
|
// @Failure 401 {object} response.UnauthorizedError
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,21 @@ func (_i *articlesService) PublishScheduling(clientId *uuid.UUID, id uint, publi
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate publish schedule format
|
||||||
|
dateLayout := "2006-01-02"
|
||||||
|
datetimeLayout := "2006-01-02 15:04:05"
|
||||||
|
|
||||||
|
// Try parsing as datetime first (with time)
|
||||||
|
_, parseErr := time.Parse(datetimeLayout, publishSchedule)
|
||||||
|
if parseErr != nil {
|
||||||
|
// If datetime parsing fails, try parsing as date only
|
||||||
|
_, parseErr = time.Parse(dateLayout, publishSchedule)
|
||||||
|
if parseErr != nil {
|
||||||
|
return fmt.Errorf("invalid publish schedule format. Supported formats: '2006-01-02' or '2006-01-02 15:04:05'")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result.PublishSchedule = &publishSchedule
|
result.PublishSchedule = &publishSchedule
|
||||||
return _i.Repo.Update(clientId, id, result)
|
return _i.Repo.Update(clientId, id, result)
|
||||||
}
|
}
|
||||||
|
|
@ -683,21 +698,47 @@ func (_i *articlesService) ExecuteScheduling() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
layout := "2006-01-02"
|
// Support both date-only and datetime formats
|
||||||
|
dateLayout := "2006-01-02"
|
||||||
|
datetimeLayout := "2006-01-02 15:04:05"
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
today := now.Truncate(24 * time.Hour)
|
|
||||||
|
|
||||||
for _, article := range articles { // Looping setiap artikel
|
for _, article := range articles { // Looping setiap artikel
|
||||||
if article.PublishSchedule == nil {
|
if article.PublishSchedule == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
parsedDate, err := time.Parse(layout, *article.PublishSchedule)
|
var scheduledTime time.Time
|
||||||
if err != nil {
|
var parseErr error
|
||||||
continue
|
|
||||||
|
// Try parsing as datetime first (with time)
|
||||||
|
scheduledTime, parseErr = time.Parse(datetimeLayout, *article.PublishSchedule)
|
||||||
|
if parseErr != nil {
|
||||||
|
// If datetime parsing fails, try parsing as date only
|
||||||
|
scheduledTime, parseErr = time.Parse(dateLayout, *article.PublishSchedule)
|
||||||
|
if parseErr != nil {
|
||||||
|
_i.Log.Warn().Str("timestamp", time.Now().
|
||||||
|
Format(time.RFC3339)).Str("Service:articlesService", "Methods:ExecuteScheduling").
|
||||||
|
Str("Invalid schedule format", *article.PublishSchedule).
|
||||||
|
Interface("Article ID", article.ID).Msg("")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// If parsed as date only, set time to start of day (00:00:00)
|
||||||
|
scheduledTime = scheduledTime.Truncate(24 * time.Hour)
|
||||||
}
|
}
|
||||||
|
|
||||||
if parsedDate.Equal(today) {
|
// Check if the scheduled time has passed (for datetime) or if it's today (for date only)
|
||||||
|
shouldPublish := false
|
||||||
|
if len(*article.PublishSchedule) > 10 { // Contains time (datetime format)
|
||||||
|
// For datetime format, check if scheduled time has passed
|
||||||
|
shouldPublish = now.After(scheduledTime) || now.Equal(scheduledTime)
|
||||||
|
} else {
|
||||||
|
// For date-only format, check if it's today
|
||||||
|
today := now.Truncate(24 * time.Hour)
|
||||||
|
shouldPublish = scheduledTime.Equal(today)
|
||||||
|
}
|
||||||
|
|
||||||
|
if shouldPublish {
|
||||||
isPublish := true
|
isPublish := true
|
||||||
statusIdTwo := 2
|
statusIdTwo := 2
|
||||||
|
|
||||||
|
|
@ -711,6 +752,10 @@ func (_i *articlesService) ExecuteScheduling() error {
|
||||||
_i.Log.Info().Str("timestamp", time.Now().
|
_i.Log.Info().Str("timestamp", time.Now().
|
||||||
Format(time.RFC3339)).Str("Service:articlesService", "Methods:ExecuteScheduling").
|
Format(time.RFC3339)).Str("Service:articlesService", "Methods:ExecuteScheduling").
|
||||||
Interface("Failed to publish Article ID : ", article.ID).Msg("")
|
Interface("Failed to publish Article ID : ", article.ID).Msg("")
|
||||||
|
} else {
|
||||||
|
_i.Log.Info().Str("timestamp", time.Now().
|
||||||
|
Format(time.RFC3339)).Str("Service:articlesService", "Methods:ExecuteScheduling").
|
||||||
|
Interface("Successfully published Article ID : ", article.ID).Msg("")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7240,7 +7240,7 @@ const docTemplate = `{
|
||||||
"Bearer": []
|
"Bearer": []
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "API for Publish Schedule of Article",
|
"description": "API for Publish Schedule of Article. Supports both date-only format (2006-01-02) and datetime format (2006-01-02 15:04:05)",
|
||||||
"tags": [
|
"tags": [
|
||||||
"Articles"
|
"Articles"
|
||||||
],
|
],
|
||||||
|
|
@ -7274,7 +7274,7 @@ const docTemplate = `{
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "publish date",
|
"description": "publish date/time (format: 2006-01-02 or 2006-01-02 15:04:05)",
|
||||||
"name": "date",
|
"name": "date",
|
||||||
"in": "query"
|
"in": "query"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7229,7 +7229,7 @@
|
||||||
"Bearer": []
|
"Bearer": []
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "API for Publish Schedule of Article",
|
"description": "API for Publish Schedule of Article. Supports both date-only format (2006-01-02) and datetime format (2006-01-02 15:04:05)",
|
||||||
"tags": [
|
"tags": [
|
||||||
"Articles"
|
"Articles"
|
||||||
],
|
],
|
||||||
|
|
@ -7263,7 +7263,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "publish date",
|
"description": "publish date/time (format: 2006-01-02 or 2006-01-02 15:04:05)",
|
||||||
"name": "date",
|
"name": "date",
|
||||||
"in": "query"
|
"in": "query"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6285,7 +6285,8 @@ paths:
|
||||||
- Articles
|
- Articles
|
||||||
/articles/publish-scheduling:
|
/articles/publish-scheduling:
|
||||||
post:
|
post:
|
||||||
description: API for Publish Schedule of Article
|
description: API for Publish Schedule of Article. Supports both date-only format
|
||||||
|
(2006-01-02) and datetime format (2006-01-02 15:04:05)
|
||||||
parameters:
|
parameters:
|
||||||
- description: Insert the X-Client-Key
|
- description: Insert the X-Client-Key
|
||||||
in: header
|
in: header
|
||||||
|
|
@ -6305,7 +6306,7 @@ paths:
|
||||||
in: query
|
in: query
|
||||||
name: id
|
name: id
|
||||||
type: integer
|
type: integer
|
||||||
- description: publish date
|
- description: 'publish date/time (format: 2006-01-02 or 2006-01-02 15:04:05)'
|
||||||
in: query
|
in: query
|
||||||
name: date
|
name: date
|
||||||
type: string
|
type: string
|
||||||
|
|
|
||||||
Binary file not shown.
Loading…
Reference in New Issue