// title: app create // path: /apps // method: POST // consume: application/x-www-form-urlencoded // produce: application/json // responses: // 201: App created // 400: Invalid data // 401: Unauthorized // 403: Quota exceeded // 409: App already exists func createApp(w http.ResponseWriter, r *http.Request, t auth.Token) (err error) { err = r.ParseForm() if err != nil { return &errors.HTTP{Code: http.StatusBadRequest, Message: err.Error()} } var ia inputApp dec := form.NewDecoder(nil) dec.IgnoreCase(true) dec.IgnoreUnknownKeys(true) dec.DecodeValues(&ia, r.Form) a := app.App{ TeamOwner: ia.TeamOwner, Platform: ia.Platform, Plan: app.Plan{Name: ia.Plan}, Name: ia.Name, Description: ia.Description, Pool: ia.Pool, RouterOpts: ia.RouterOpts, } if a.TeamOwner == "" { a.TeamOwner, err = permission.TeamForPermission(t, permission.PermAppCreate) if err != nil { if err != permission.ErrTooManyTeams { return err } teams, listErr := auth.ListTeams() if listErr != nil { return listErr } if len(teams) != 1 { return err } a.TeamOwner = teams[0].Name } } canCreate := permission.Check(t, permission.PermAppCreate, permission.Context(permission.CtxTeam, a.TeamOwner), ) if !canCreate { return permission.ErrUnauthorized } u, err := t.User() if err != nil { return err } platform, err := app.GetPlatform(a.Platform) if err != nil { return err } if platform.Disabled { canUsePlat := permission.Check(t, permission.PermPlatformUpdate) || permission.Check(t, permission.PermPlatformCreate) if !canUsePlat { return &errors.HTTP{Code: http.StatusBadRequest, Message: app.InvalidPlatformError.Error()} } } evt, err := event.New(&event.Opts{ Target: appTarget(a.Name), Kind: permission.PermAppCreate, Owner: t, CustomData: event.FormToCustomData(r.Form), Allowed: event.Allowed(permission.PermAppReadEvents, contextsForApp(&a)...), }) if err != nil { return err } defer func() { evt.Done(err) }() err = app.CreateApp(&a, u) if err != nil { log.Errorf("Got error while creating app: %s", err) if e, ok := err.(*errors.ValidationError); ok { return &errors.HTTP{Code: http.StatusBadRequest, Message: e.Message} } if _, ok := err.(app.NoTeamsError); ok { return &errors.HTTP{ Code: http.StatusBadRequest, Message: "In order to create an app, you should be member of at least one team", } } if e, ok := err.(*app.AppCreationError); ok { if e.Err == app.ErrAppAlreadyExists { return &errors.HTTP{Code: http.StatusConflict, Message: e.Error()} } if _, ok := e.Err.(*quota.QuotaExceededError); ok { return &errors.HTTP{ Code: http.StatusForbidden, Message: "Quota exceeded", } } } if err == app.InvalidPlatformError { return &errors.HTTP{Code: http.StatusBadRequest, Message: err.Error()} } return err } repo, err := repository.Manager().GetRepository(a.Name) if err != nil { return err } msg := map[string]string{ "status": "success", "repository_url": repo.ReadWriteURL, "ip": a.Ip, } jsonMsg, err := json.Marshal(msg) if err != nil { return err } w.WriteHeader(http.StatusCreated) w.Header().Set("Content-Type", "application/json") w.Write(jsonMsg) return nil }
func createApp(w http.ResponseWriter, r *http.Request, t auth.Token) error { var a app.App defer r.Body.Close() body, err := ioutil.ReadAll(r.Body) if err != nil { return err } if err = json.Unmarshal(body, &a); err != nil { return err } teamContexts := permission.ContextsForPermission(t, permission.PermAppCreate, permission.CtxTeam) if a.TeamOwner == "" && len(teamContexts) == 1 { a.TeamOwner = teamContexts[0].Value } canCreate := permission.Check(t, permission.PermAppCreate, permission.Context(permission.CtxTeam, a.TeamOwner), ) if !canCreate { return permission.ErrUnauthorized } u, err := t.User() if err != nil { return err } platform, err := app.GetPlatform(a.Platform) if err != nil { return err } if platform.Disabled { canUsePlat := permission.Check(t, permission.PermPlatformUpdate) || permission.Check(t, permission.PermPlatformCreate) if !canUsePlat { return app.InvalidPlatformError{} } } rec.Log(u.Email, "create-app", "app="+a.Name, "platform="+a.Platform, "plan="+a.Plan.Name) err = app.CreateApp(&a, u) if err != nil { log.Errorf("Got error while creating app: %s", err) if e, ok := err.(*errors.ValidationError); ok { return &errors.HTTP{Code: http.StatusBadRequest, Message: e.Message} } if _, ok := err.(app.NoTeamsError); ok { return &errors.HTTP{ Code: http.StatusBadRequest, Message: "In order to create an app, you should be member of at least one team", } } if e, ok := err.(*app.AppCreationError); ok { if e.Err == app.ErrAppAlreadyExists { return &errors.HTTP{Code: http.StatusConflict, Message: e.Error()} } if _, ok := e.Err.(*quota.QuotaExceededError); ok { return &errors.HTTP{ Code: http.StatusForbidden, Message: "Quota exceeded", } } } if e, ok := err.(app.InvalidPlatformError); ok { return &errors.HTTP{Code: http.StatusNotFound, Message: e.Error()} } return err } repo, _ := repository.Manager().GetRepository(a.Name) msg := map[string]string{ "status": "success", "repository_url": repo.ReadWriteURL, "ip": a.Ip, } jsonMsg, err := json.Marshal(msg) if err != nil { return err } fmt.Fprintf(w, "%s", jsonMsg) return nil }