Beispiel #1
0
// Save app
func Save() echo.HandlerFunc {
	return func(c echo.Context) error {
		appPath := c.Param("app_path")
		if appPath == "" {
			return api.ErrorNotFound(c, nil)
		}

		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}

		input := &get3w.AppSaveInput{}
		err := api.LoadRequestInput(c, input)
		if err != nil {
			return api.ErrorBadRequest(c, err)
		}

		parser, err := storage.NewLocalParser(api.Owner(c), appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		err = parser.APISave(input.Payloads)
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		return c.JSON(http.StatusOK, &get3w.AppSaveOutput{
			LastModified: timeutils.ToString(time.Now()),
		})
	}
}
Beispiel #2
0
// Delete file
func Delete() echo.HandlerFunc {
	return func(c echo.Context) error {
		appPath := c.Param("app_path")
		if appPath == "" {
			return api.ErrorNotFound(c, nil)
		}
		path := c.P(1)

		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}

		app, err := api.GetApp(appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}
		if app == nil {
			return api.ErrorNotFound(c, nil)
		}

		parser, err := storage.NewLocalParser(api.Owner(c), appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		parser.Storage.Delete(parser.Storage.GetSourceKey(path))

		output := &get3w.FileDeleteOutput{
			LastModified: timeutils.ToString(time.Now()),
		}
		return c.JSON(http.StatusOK, output)
	}
}
Beispiel #3
0
// Push file content
func Push() echo.HandlerFunc {
	return func(c echo.Context) error {
		appPath := c.Param("app_path")
		if appPath == "" {
			return api.ErrorNotFound(c, nil)
		}

		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}

		input := &get3w.FilesPushInput{}
		err := api.LoadRequestInput(c, input)
		if err != nil {
			return api.ErrorBadRequest(c, err)
		}

		app, err := api.GetApp(appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}
		if app == nil {
			return api.ErrorNotFound(c, nil)
		}

		parser, err := storage.NewLocalParser(api.Owner(c), appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		data, err := base64.StdEncoding.DecodeString(input.Blob)
		if err != nil {
			return api.ErrorInternal(c, err)
		}
		pathBytesMap, err := ioutils.UnPack(data)
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		for _, addedPath := range input.Added {
			parser.Storage.Write(parser.Storage.GetSourceKey(addedPath), pathBytesMap[addedPath])
		}
		for _, modifiedPath := range input.Modified {
			parser.Storage.Write(parser.Storage.GetSourceKey(modifiedPath), pathBytesMap[modifiedPath])
		}
		for _, removedPath := range input.Removed {
			parser.Storage.Delete(parser.Storage.GetSourceKey(removedPath))
		}

		output := &get3w.FileEditOutput{
			LastModified: timeutils.ToString(time.Now()),
		}
		return c.JSON(http.StatusOK, output)
	}
}
Beispiel #4
0
// List return apps
func List() echo.HandlerFunc {
	return func(c echo.Context) error {
		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}

		config, err := home.LoadConfig()
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		return c.JSON(http.StatusOK, config.Apps)
	}
}
Beispiel #5
0
// Edit file content
func Edit() echo.HandlerFunc {
	return func(c echo.Context) error {
		appPath := c.Param("app_path")
		if appPath == "" {
			return api.ErrorNotFound(c, nil)
		}
		path := c.P(1)

		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}

		input := &get3w.FileEditInput{}
		err := api.LoadRequestInput(c, input)
		if err != nil {
			return api.ErrorBadRequest(c, err)
		}

		app, err := api.GetApp(appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}
		if app == nil {
			return api.ErrorNotFound(c, nil)
		}

		parser, err := storage.NewLocalParser(api.Owner(c), appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		data, err := base64.StdEncoding.DecodeString(input.Content)
		if err != nil {
			return api.ErrorInternal(c, err)
		}
		err = parser.Storage.Write(parser.Storage.GetSourceKey(path), data)
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		output := &get3w.FileEditOutput{
			LastModified: timeutils.ToString(time.Now()),
		}
		return c.JSON(http.StatusOK, output)
	}
}
Beispiel #6
0
// Delete app
func Delete() echo.HandlerFunc {
	return func(c echo.Context) error {
		appPath := c.Param("app_path")
		if appPath == "" {
			return api.ErrorNotFound(c, nil)
		}

		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}

		input := &get3w.AppDeleteInput{}
		err := api.LoadRequestInput(c, input)
		if err != nil {
			return api.ErrorBadRequest(c, err)
		}

		config, err := home.LoadConfig()
		var appToDelete *get3w.App
		index := -1
		for i, app := range config.Apps {
			if app.Path == appPath {
				appToDelete = app
				index = i
				break
			}
		}
		if appToDelete == nil {
			return api.ErrorNotFound(c, nil)
		}

		if !input.KeepFiles {
			err = os.RemoveAll(appPath)
			if err != nil {
				return api.ErrorBadRequest(c, err)
			}
		}

		config.Apps = append(config.Apps[:index], config.Apps[index+1:]...)
		config.Save()

		return c.JSON(http.StatusOK, appToDelete)
	}
}
Beispiel #7
0
// Sync app
func Sync() echo.HandlerFunc {
	return func(c echo.Context) error {
		appPath := c.Param("app_path")
		if appPath == "" {
			return api.ErrorNotFound(c, nil)
		}

		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}

		app, err := api.GetApp(appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}
		if app == nil {
			return api.ErrorNotFound(c, nil)
		}

		config, err := home.LoadConfig()
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		parser, err := storage.NewLocalParser(api.Owner(c), appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		buffer := bytes.NewBufferString("")
		shouldLogin, err := parser.Push(&config.AuthConfig, buffer)
		if shouldLogin {
			return api.ErrorUnauthorized(c, nil)
		}
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		return c.JSON(http.StatusOK, &get3w.AppSyncOutput{
			Log: strings.Replace(buffer.String(), "\n", "<br />", -1),
		})
	}
}
Beispiel #8
0
// Create create folder
func Create() echo.HandlerFunc {
	return func(c echo.Context) error {
		appPath := c.Param("app_path")
		if appPath == "" {
			return api.ErrorNotFound(c, nil)
		}

		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}

		input := &get3w.FolderCreateInput{}
		err := api.LoadRequestInput(c, input)
		if err != nil {
			return api.ErrorBadRequest(c, err)
		}
		if input.Path == "" {
			return api.ErrorBadRequest(c, nil)
		}

		app, err := api.GetApp(appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}
		if app == nil {
			return api.ErrorNotFound(c, nil)
		}

		parser, err := storage.NewLocalParser(api.Owner(c), appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		parser.Storage.NewFolder(parser.Storage.GetSourcePrefix(input.Path))

		output := &get3w.FolderCreateOutput{
			LastModified: timeutils.ToString(time.Now()),
		}
		return c.JSON(http.StatusOK, output)
	}
}
Beispiel #9
0
// Publish app
func Publish() echo.HandlerFunc {
	return func(c echo.Context) error {
		appPath := c.Param("app_path")
		if appPath == "" {
			return api.ErrorNotFound(c, nil)
		}

		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}

		parser, err := storage.NewLocalParser(api.Owner(c), appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		parser.Build(true)

		return c.String(http.StatusOK, "")
	}
}
Beispiel #10
0
// Load app
func Load() echo.HandlerFunc {
	return func(c echo.Context) error {
		appPath := c.Param("app_path")
		if appPath == "" {
			return api.ErrorNotFound(c, nil)
		}

		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}

		input := &get3w.AppLoadInput{}
		err := api.LoadRequestInput(c, input)
		if err != nil {
			return api.ErrorBadRequest(c, err)
		}

		app, err := api.GetApp(appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}
		if app == nil {
			return api.ErrorNotFound(c, nil)
		}

		parser, err := storage.NewLocalParser(api.Owner(c), appPath)
		if err != nil {
			return api.ErrorBadRequest(c, err)
		}
		parser.APILoad()

		output := &get3w.AppLoadOutput{
			LastModified: timeutils.ToString(time.Now()),
			App:          app,
			Config:       parser.Config,
			Sites:        parser.Sites,
		}
		return c.JSON(http.StatusOK, output)
	}
}
Beispiel #11
0
// Get app
func Get() echo.HandlerFunc {
	return func(c echo.Context) error {
		appPath := c.Param("app_path")
		if appPath == "" {
			return api.ErrorNotFound(c, nil)
		}

		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}

		app, err := api.GetApp(appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}
		if app == nil {
			return api.ErrorNotFound(c, nil)
		}

		return c.JSON(http.StatusOK, app)
	}
}
Beispiel #12
0
// Add app, for open and clone operation
func Add() echo.HandlerFunc {
	return func(c echo.Context) error {
		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}
		owner := api.Owner(c)

		input := &get3w.AppAddInput{}
		err := api.LoadRequestInput(c, input)
		if err != nil {
			return api.ErrorBadRequest(c, err)
		}

		dirPath := input.DirPath
		dirExists := true
		if dirPath == "" {
			dirExists = false
		} else {
			stat, err := os.Lstat(dirPath)
			if err != nil {
				dirExists = false
			} else if !stat.IsDir() {
				dirExists = false
			}
		}
		if !dirExists {
			return api.ErrorNotFound(c, nil)
		}

		config, err := home.LoadConfig()
		if err != nil {
			return api.ErrorBadRequest(c, err)
		}

		success := true
		configExists := true
		var app *get3w.App

		var appPath string
		if input.Origin != "" {
			appPath, err = addFromCloud(dirPath, input.Origin, &config.AuthConfig)
			if err != nil {
				return api.ErrorBadRequest(c, err)
			}
		} else {
			appPath, configExists, err = addFromLocal(dirPath, config)
			if err != nil {
				return api.ErrorBadRequest(c, err)
			}
		}

		if input.Check && !configExists {
			success = false
		}

		if success {
			parser, err := storage.NewLocalParser(config.AuthConfig.Username, appPath)
			if err != nil {
				return api.ErrorInternal(c, err)
			}

			app = &get3w.App{
				Owner:       owner,
				Name:        parser.Name,
				Description: parser.Config.Description,
				Tags:        "",
				Path:        appPath,
				Private:     false,
				CreatedAt:   timeutils.ToString(time.Now()),
				UpdatedAt:   timeutils.ToString(time.Now()),
			}

			exists := false
			for _, app := range config.Apps {
				if app.Path == appPath {
					exists = true
					break
				}
			}
			if !exists {
				config.Apps = append(config.Apps, app)
				config.Save()
			}
		}

		output := &get3w.AppAddOutput{
			Config: configExists,
			App:    app,
		}
		return c.JSON(http.StatusOK, output)
	}
}
Beispiel #13
0
// Upload files
func Upload() echo.HandlerFunc {
	return func(c echo.Context) error {
		appPath := c.Param("app_path")
		if appPath == "" {
			return api.ErrorNotFound(c, nil)
		}

		if api.IsAnonymous(c) {
			return api.ErrorUnauthorized(c, nil)
		}
		location := c.Query("location")

		app, err := api.GetApp(appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}
		if app == nil {
			return api.ErrorNotFound(c, nil)
		}

		parser, err := storage.NewLocalParser(api.Owner(c), appPath)
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		req := c.Request().(*standard.Request)
		mr, err := req.MultipartReader()
		if err != nil {
			return api.ErrorInternal(c, err)
		}

		files := []*get3w.File{}
		for {
			part, err := mr.NextPart()
			if err != nil {
				if err == io.EOF {
					break
				}
				return api.ErrorInternal(c, err)
			}
			defer part.Close()

			data, err := ioutil.ReadAll(part)
			if err != nil {
				return api.ErrorInternal(c, err)
			}

			filename := part.FileName()
			err = parser.Storage.Write(parser.Storage.GetSourceKey(location, filename), data)
			if err != nil {
				return api.ErrorInternal(c, err)
			}

			file := &get3w.File{
				IsDir:        false,
				Path:         strings.Trim(path.Join(location, filename), "/"),
				Name:         filename,
				Size:         0,
				Checksum:     "",
				LastModified: timeutils.ToString(time.Now()),
			}

			files = append(files, file)
		}

		return c.JSON(http.StatusOK, files)
	}
}