Skip to content

Commit c1b1286

Browse files
committed
check is image
1 parent 0f82900 commit c1b1286

File tree

6 files changed

+290
-99
lines changed

6 files changed

+290
-99
lines changed

cmd/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,17 @@ func main() {
4949

5050
awsService = service.NewAwsService()
5151
minioClient = service.MinioClient()
52+
imageService := &service.ImageService{
53+
MinioClient: minioClient,
54+
}
5255

5356
// Initialize cache service
5457
cacheService, err := service.NewCacheService("")
5558
if err != nil {
5659
logger.Fatal().Err(err).Msg("Failed to initialize cache service")
5760
}
5861

59-
imageHandler = handler.NewImage(minioClient, awsService)
62+
imageHandler = handler.NewImage(minioClient, awsService, imageService)
6063
awsHandler = handler.NewAwsHandler(awsService)
6164
minioHandler = handler.NewMinioHandler(minioClient)
6265

handler/image.go

Lines changed: 49 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ type Image interface {
3838
}
3939

4040
type image struct {
41-
minioClient *minio.Client
42-
awsService service.AwsService
43-
workerPool *worker.Pool
44-
batchProc *batch.BatchProcessor
45-
cache service.CacheService
41+
minioClient *minio.Client
42+
awsService service.AwsService
43+
imageService *service.ImageService
44+
workerPool *worker.Pool
45+
batchProc *batch.BatchProcessor
46+
cache service.CacheService
4647
}
4748

4849
// ImageProcessRequest represents an image processing request
@@ -62,56 +63,37 @@ type UploadUrlRequest struct {
6263
AWSUpload bool `json:"aws_upload"`
6364
}
6465

65-
func NewImage(minioClient *minio.Client, awsService service.AwsService) Image {
66+
func NewImage(minioClient *minio.Client, awsService service.AwsService, imageService *service.ImageService) Image {
6667
// Initialize worker pool with 5 workers
6768
workerConfig := worker.DefaultConfig()
6869
workerConfig.Workers = 5
6970
wp := worker.NewPool(workerConfig)
7071
wp.Start()
7172

73+
img := &image{
74+
minioClient: minioClient,
75+
awsService: awsService,
76+
imageService: imageService,
77+
workerPool: wp,
78+
cache: nil,
79+
}
80+
7281
// Initialize batch processor with default config
7382
batchConfig := batch.DefaultConfig()
7483
batchConfig.BatchSize = 10
7584
batchConfig.FlushTimeout = 5 * time.Second
76-
bp := batch.NewBatchProcessor(batchConfig, processBatch)
85+
bp := batch.NewBatchProcessor(batchConfig, img.processBatch)
7786
bp.Start()
7887

7988
// Initialize cache service
8089
cacheService, err := service.NewCacheService("redis://localhost:6379")
8190
if err != nil {
8291
log.Printf("Failed to initialize cache service: %v", err)
8392
}
93+
img.cache = cacheService
94+
img.batchProc = bp
8495

85-
return &image{
86-
minioClient: minioClient,
87-
awsService: awsService,
88-
workerPool: wp,
89-
batchProc: bp,
90-
cache: cacheService,
91-
}
92-
}
93-
94-
// processBatch handles batch processing of items
95-
func processBatch(items []batch.BatchItem) []batch.BatchItem {
96-
// Process items in parallel using goroutines
97-
var wg sync.WaitGroup
98-
for i := range items {
99-
wg.Add(1)
100-
go func(item *batch.BatchItem) {
101-
defer wg.Done()
102-
103-
// Process the item based on its type
104-
switch data := item.Data.(type) {
105-
case *ImageProcessRequest:
106-
// Process image
107-
err := processImage(data)
108-
item.Error = err
109-
item.Success = err == nil
110-
}
111-
}(&items[i])
112-
}
113-
wg.Wait()
114-
return items
96+
return img
11597
}
11698

11799
func (i image) GetImage(c *fiber.Ctx) error {
@@ -150,15 +132,15 @@ func (i image) GetImage(c *fiber.Ctx) error {
150132
return c.SendFile("./public/notfound.png")
151133
}
152134

153-
if err, orjWidth, orjHeight := service.ImagickGetWidthHeight(getByte); err == nil {
135+
if err, orjWidth, orjHeight := i.imageService.ImagickGetWidthHeight(getByte); err == nil {
154136
c.Set("Width", strconv.Itoa(int(orjWidth)))
155137
c.Set("Height", strconv.Itoa(int(orjHeight)))
156138
}
157139

158140
c.Set("Content-Type", http.DetectContentType(getByte))
159141

160142
if resize {
161-
resizedImage := service.ImagickResize(getByte, width, height)
143+
resizedImage := i.imageService.ImagickResize(getByte, width, height)
162144
// Cache the resized image
163145
if err := i.cache.SetResizedImage(bucket, objectName, width, height, resizedImage); err != nil {
164146
log.Printf("Failed to cache resized image: %v", err)
@@ -254,7 +236,7 @@ func (i image) UploadImage(c *fiber.Ctx) error {
254236
orjWidth uint
255237
orjHeight uint
256238
)
257-
if err, orjWidth, orjHeight = service.ImagickGetWidthHeight(fileContent); err == nil {
239+
if err, orjWidth, orjHeight = i.imageService.ImagickGetWidthHeight(fileContent); err == nil {
258240
c.Set("Width", strconv.Itoa(int(orjWidth)))
259241
c.Set("Height", strconv.Itoa(int(orjHeight)))
260242
}
@@ -263,7 +245,7 @@ func (i image) UploadImage(c *fiber.Ctx) error {
263245
resize, width, height := service.GetWidthAndHeight(c, service.FormsType)
264246
if resize && orjWidth > 0 && orjHeight > 0 {
265247
width, height = service.RatioWidthHeight(orjWidth, orjHeight, width, height)
266-
fileContent = service.ImagickResize(fileContent, width, height)
248+
fileContent = i.imageService.ImagickResize(fileContent, width, height)
267249
if tempFile, err := service.CreateFile(fileContent); err == nil {
268250
defer func() {
269251
_ = tempFile.Close()
@@ -497,7 +479,7 @@ func (i *image) ResizeImage(c *fiber.Ctx) error {
497479
ContentType: file.Header.Get("Content-Type"),
498480
Filename: file.Filename,
499481
}
500-
return processImage(req)
482+
return processImage(req, i)
501483
},
502484
Response: respChan,
503485
}
@@ -512,10 +494,33 @@ func (i *image) ResizeImage(c *fiber.Ctx) error {
512494
return service.Response(c, fiber.StatusOK, true, "Image processed successfully", nil)
513495
}
514496

497+
// processBatch handles batch processing of items
498+
func (i *image) processBatch(items []batch.BatchItem) []batch.BatchItem {
499+
// Process items in parallel using goroutines
500+
var wg sync.WaitGroup
501+
for idx := range items {
502+
wg.Add(1)
503+
go func(item *batch.BatchItem) {
504+
defer wg.Done()
505+
506+
// Process the item based on its type
507+
switch data := item.Data.(type) {
508+
case *ImageProcessRequest:
509+
// Process image
510+
err := processImage(data, i)
511+
item.Error = err
512+
item.Success = err == nil
513+
}
514+
}(&items[idx])
515+
}
516+
wg.Wait()
517+
return items
518+
}
519+
515520
// processImage handles the actual image processing
516-
func processImage(req *ImageProcessRequest) error {
521+
func processImage(req *ImageProcessRequest, i *image) error {
517522
if service.IsImageFile(req.Filename) {
518-
resized := service.ImagickResize(req.File, req.Width, req.Height)
523+
resized := i.imageService.ImagickResize(req.File, req.Width, req.Height)
519524
if resized == nil {
520525
return fmt.Errorf("image processing failed")
521526
}

handler/image_test.go

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package handler
22

33
import (
4-
"reflect"
54
"strconv"
65
"testing"
76

@@ -10,27 +9,6 @@ import (
109
"github.com/mstgnz/cdn/service"
1110
)
1211

13-
func TestNewImage(t *testing.T) {
14-
type args struct {
15-
minioService *minio.Client
16-
awsService service.AwsService
17-
}
18-
tests := []struct {
19-
args args
20-
want Image
21-
}{
22-
// TODO: Add test cases.
23-
{},
24-
}
25-
for i, tt := range tests {
26-
t.Run(strconv.Itoa(i), func(t *testing.T) {
27-
if got := NewImage(tt.args.minioService, tt.args.awsService); !reflect.DeepEqual(got, tt.want) {
28-
t.Errorf("NewImage() = %v, want %v", got, tt.want)
29-
}
30-
})
31-
}
32-
}
33-
3412
func Test_image_DeleteImage(t *testing.T) {
3513
type fields struct {
3614
minioClient *minio.Client

0 commit comments

Comments
 (0)