@@ -4,15 +4,20 @@ import (
44 "context"
55 "errors"
66 "fmt"
7+ "io"
78 "os"
9+ "path"
810 "sort"
911 "text/tabwriter"
1012 "time"
1113
14+ "github.com/obalunenko/instadiff-cli/internal/utils"
15+
1216 "github.com/urfave/cli/v2"
1317
1418 log "github.com/obalunenko/logger"
1519
20+ "github.com/obalunenko/instadiff-cli/internal/media"
1621 "github.com/obalunenko/instadiff-cli/internal/models"
1722 "github.com/obalunenko/instadiff-cli/internal/service"
1823)
@@ -51,9 +56,7 @@ func executeCmd(ctx context.Context, f cmdFunc) cli.ActionFunc {
5156 }
5257
5358 defer func () {
54- if err = svc .Stop (ctx ); err != nil {
55- log .WithError (ctx , err ).Warn ("Error occurred during the service stop" )
56- }
59+ utils .LogError (ctx , svc .Stop (ctx ), "Error occurred during the service stop" )
5760 }()
5861
5962 return f (c , svc )
@@ -387,3 +390,61 @@ func cmdListUseless(c *cli.Context, svc *service.Service) error {
387390
388391 return printUsersList (c , bots )
389392}
393+
394+ var errEmptyFilePath = errors .New ("path is empty" )
395+
396+ func cmdUploadMedia (c * cli.Context , svc * service.Service ) error {
397+ ctx := c .Context
398+
399+ p := c .String (filePath )
400+
401+ file , err := getMediaFile (ctx , p )
402+ if err != nil {
403+ return fmt .Errorf ("get media file: %w" , err )
404+ }
405+
406+ if err = svc .UploadMedia (ctx , file , getMediaType (c )); err != nil {
407+ return fmt .Errorf ("upload media: %w" , err )
408+ }
409+
410+ return nil
411+ }
412+
413+ func getMediaFile (ctx context.Context , fpath string ) (io.Reader , error ) {
414+ if fpath == "" {
415+ return nil , errEmptyFilePath
416+ }
417+
418+ f , err := os .Open (path .Clean (fpath ))
419+ if err != nil {
420+ return nil , fmt .Errorf ("open file: %w" , err )
421+ }
422+
423+ defer func () {
424+ utils .LogError (ctx , f .Close (), "Failed to close file descriptor" )
425+ }()
426+
427+ return f , nil
428+ }
429+
430+ //go:generate stringer -type=mediaTypeFlag -trimprefix=mediaTypeFlag -linecomment
431+
432+ type mediaTypeFlag uint
433+
434+ const (
435+ mediaTypeUndefined mediaTypeFlag = iota // undefined
436+
437+ mediaTypeStoryPhoto // story_photo
438+
439+ mediaTypeSentinel // sentinel
440+ )
441+
442+ func getMediaType (c * cli.Context ) media.Type {
443+ mt := media .TypeUndefined
444+
445+ if c .Bool (mediaTypeStoryPhoto .String ()) {
446+ mt = media .TypeStoryPhoto
447+ }
448+
449+ return mt
450+ }
0 commit comments