@@ -15,6 +15,7 @@ import (
1515 "github.com/getarcaneapp/arcane/backend/pkg/pagination"
1616 "github.com/getarcaneapp/arcane/types/base"
1717 "github.com/getarcaneapp/arcane/types/image"
18+ "github.com/getarcaneapp/arcane/types/system"
1819 "gorm.io/gorm"
1920)
2021
@@ -114,6 +115,8 @@ type PruneImagesInput struct {
114115 EnvironmentID string `path:"id" doc:"Environment ID"`
115116 Dangling bool `query:"dangling" doc:"Only remove dangling images"`
116117 Body * struct {
118+ Mode * string `json:"mode,omitempty"`
119+ Until * string `json:"until,omitempty"`
117120 Dangling * bool `json:"dangling,omitempty"`
118121 Filters map [string ][]string `json:"filters,omitempty"`
119122 }
@@ -549,21 +552,13 @@ func (h *ImageHandler) PruneImages(ctx context.Context, input *PruneImagesInput)
549552 return nil , huma .Error500InternalServerError ("service not available" )
550553 }
551554
552- dangling := input .Dangling
553- if input .Body != nil {
554- if input .Body .Dangling != nil {
555- dangling = * input .Body .Dangling
556- } else if vals , ok := input .Body .Filters ["dangling" ]; ok {
557- for _ , v := range vals {
558- if v == "true" || v == "1" {
559- dangling = true
560- break
561- }
562- }
563- }
564- }
555+ mode := resolvePruneImageModeInternal (input )
556+ until := resolvePruneImageUntilInternal (input )
565557
566- report , err := h .imageService .PruneImages (ctx , dangling )
558+ report , err := h .imageService .PruneImages (ctx , system.PruneImagesOptions {
559+ Mode : system .PruneImageMode (mode ),
560+ Until : until ,
561+ })
567562 if err != nil {
568563 return nil , huma .Error500InternalServerError ((& common.ImagePruneError {Err : err }).Error ())
569564 }
@@ -578,6 +573,58 @@ func (h *ImageHandler) PruneImages(ctx context.Context, input *PruneImagesInput)
578573 }, nil
579574}
580575
576+ func resolvePruneImageModeInternal (input * PruneImagesInput ) string {
577+ mode := resolveLegacyPruneImageModeInternal (input .Dangling )
578+ if input .Body == nil {
579+ return mode
580+ }
581+
582+ if input .Body .Mode != nil && strings .TrimSpace (* input .Body .Mode ) != "" {
583+ return strings .TrimSpace (* input .Body .Mode )
584+ }
585+
586+ if input .Body .Dangling != nil {
587+ return resolveLegacyPruneImageModeInternal (* input .Body .Dangling )
588+ }
589+
590+ if vals , ok := input .Body .Filters ["dangling" ]; ok {
591+ for _ , value := range vals {
592+ switch value {
593+ case "true" , "1" :
594+ return "dangling"
595+ case "false" , "0" :
596+ return "all"
597+ }
598+ }
599+ }
600+
601+ return mode
602+ }
603+
604+ func resolvePruneImageUntilInternal (input * PruneImagesInput ) string {
605+ if input .Body == nil {
606+ return ""
607+ }
608+
609+ if input .Body .Until != nil {
610+ return strings .TrimSpace (* input .Body .Until )
611+ }
612+
613+ if vals , ok := input .Body .Filters ["until" ]; ok && len (vals ) > 0 {
614+ return strings .TrimSpace (vals [0 ])
615+ }
616+
617+ return ""
618+ }
619+
620+ func resolveLegacyPruneImageModeInternal (dangling bool ) string {
621+ if dangling {
622+ return "dangling"
623+ }
624+
625+ return "all"
626+ }
627+
581628// GetImageUsageCounts returns counts of images by usage status.
582629func (h * ImageHandler ) GetImageUsageCounts (ctx context.Context , input * GetImageUsageCountsInput ) (* GetImageUsageCountsOutput , error ) {
583630 if h .dockerService == nil || h .imageService == nil {
0 commit comments