github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/web/file.go (about)

     1  package web
     2  
     3  import (
     4  	"net/http"
     5  	"sync"
     6  
     7  	"github.com/ngocphuongnb/tetua/app/entities"
     8  	"github.com/ngocphuongnb/tetua/app/fs"
     9  	"github.com/ngocphuongnb/tetua/app/repositories"
    10  	"github.com/ngocphuongnb/tetua/app/server"
    11  	"github.com/ngocphuongnb/tetua/app/utils"
    12  	"github.com/ngocphuongnb/tetua/views"
    13  )
    14  
    15  func FileList(c server.Context) error {
    16  	paginate, err := repositories.File.Paginate(c.Context(), &entities.FileFilter{
    17  		UserIDs: []int{c.User().ID},
    18  		Filter: &entities.Filter{
    19  			BaseUrl:         utils.Url("/files"),
    20  			Page:            c.QueryInt("page"),
    21  			Limit:           12,
    22  			IgnoreUrlParams: []string{"user"},
    23  		},
    24  	})
    25  
    26  	if err != nil {
    27  		c.Logger().Error(err)
    28  		return c.Status(http.StatusInternalServerError).Render(views.Error("Something went wrong"))
    29  	}
    30  
    31  	return c.Render(views.FileList(paginate))
    32  }
    33  
    34  func FileDelete(c server.Context) (err error) {
    35  	var wg sync.WaitGroup
    36  	var err1, err2 error
    37  	wg.Add(2)
    38  
    39  	go func(wg *sync.WaitGroup) {
    40  		defer wg.Done()
    41  		err1 = repositories.File.DeleteByID(c.Context(), c.ParamInt("id"))
    42  	}(&wg)
    43  
    44  	go func(wg *sync.WaitGroup) {
    45  		defer wg.Done()
    46  		if file, ok := c.Locals("file").(*entities.File); ok && file != nil {
    47  			err2 = file.Delete(c.Context())
    48  		}
    49  	}(&wg)
    50  
    51  	wg.Wait()
    52  
    53  	if err := utils.FirstError(err1, err2); err != nil {
    54  		c.Logger().Error(err)
    55  		return c.Status(http.StatusBadRequest).Json(&entities.Message{
    56  			Type:    "error",
    57  			Message: "Error deleting file",
    58  		})
    59  	}
    60  
    61  	return c.Status(http.StatusOK).Json(&entities.Message{
    62  		Type:    "success",
    63  		Message: "File deleted",
    64  	})
    65  }
    66  
    67  func Upload(c server.Context) error {
    68  	if uploadFile, err := c.File("file"); err == nil {
    69  		if uploadedFile, err := fs.Disk().PutMultipart(c.Context(), uploadFile); err != nil {
    70  			c.Logger().Error(err)
    71  		} else {
    72  			f, err := repositories.File.Create(c.Context(), &entities.File{
    73  				Disk:   uploadedFile.Disk,
    74  				Path:   uploadedFile.Path,
    75  				Type:   uploadedFile.Type,
    76  				Size:   uploadedFile.Size,
    77  				UserID: c.User().ID,
    78  			})
    79  
    80  			if err != nil {
    81  				c.Logger().Error(err)
    82  				return c.Status(http.StatusInternalServerError).Json(entities.Map{
    83  					"error": "Error saving file",
    84  				})
    85  			}
    86  
    87  			return c.Json(entities.Map{
    88  				"size": f.Size,
    89  				"type": f.Type,
    90  				"url":  f.Url(),
    91  			})
    92  		}
    93  	} else {
    94  		c.Logger().Error(err)
    95  	}
    96  
    97  	return c.Status(http.StatusInternalServerError).Json(entities.Map{
    98  		"error": "Error saving file",
    99  	})
   100  }