// ConvertIteration converts between internal and external REST representation func ConvertIteration(request *goa.RequestData, itr *iteration.Iteration, additional ...IterationConvertFunc) *app.Iteration { iterationType := iteration.APIStringTypeIteration spaceType := "spaces" spaceID := itr.SpaceID.String() selfURL := rest.AbsoluteURL(request, app.IterationHref(itr.ID)) spaceSelfURL := rest.AbsoluteURL(request, app.SpaceHref(spaceID)) workitemsRelatedURL := rest.AbsoluteURL(request, app.WorkitemHref("?filter[iteration]="+itr.ID.String())) i := &app.Iteration{ Type: iterationType, ID: &itr.ID, Attributes: &app.IterationAttributes{ Name: &itr.Name, StartAt: itr.StartAt, EndAt: itr.EndAt, Description: itr.Description, State: &itr.State, }, Relationships: &app.IterationRelations{ Space: &app.RelationGeneric{ Data: &app.GenericData{ Type: &spaceType, ID: &spaceID, }, Links: &app.GenericLinks{ Self: &spaceSelfURL, }, }, Workitems: &app.RelationGeneric{ Links: &app.GenericLinks{ Related: &workitemsRelatedURL, }, }, }, Links: &app.GenericLinks{ Self: &selfURL, }, } if itr.ParentID != uuid.Nil { parentSelfURL := rest.AbsoluteURL(request, app.IterationHref(itr.ParentID)) parentID := itr.ParentID.String() i.Relationships.Parent = &app.RelationGeneric{ Data: &app.GenericData{ Type: &iterationType, ID: &parentID, }, Links: &app.GenericLinks{ Self: &parentSelfURL, }, } } for _, add := range additional { add(request, itr, i) } return i }
// Create runs the create action. func (c *SpaceIterationsController) Create(ctx *app.CreateSpaceIterationsContext) error { _, err := login.ContextIdentity(ctx) if err != nil { return jsonapi.JSONErrorResponse(ctx, goa.ErrUnauthorized(err.Error())) } spaceID, err := uuid.FromString(ctx.ID) if err != nil { return jsonapi.JSONErrorResponse(ctx, goa.ErrNotFound(err.Error())) } // Validate Request if ctx.Payload.Data == nil { return jsonapi.JSONErrorResponse(ctx, errors.NewBadParameterError("data", nil).Expected("not nil")) } reqIter := ctx.Payload.Data if reqIter.Attributes.Name == nil { return jsonapi.JSONErrorResponse(ctx, errors.NewBadParameterError("data.attributes.name", nil).Expected("not nil")) } return application.Transactional(c.db, func(appl application.Application) error { _, err = appl.Spaces().Load(ctx, spaceID) if err != nil { return jsonapi.JSONErrorResponse(ctx, goa.ErrNotFound(err.Error())) } newItr := iteration.Iteration{ SpaceID: spaceID, Name: *reqIter.Attributes.Name, StartAt: reqIter.Attributes.StartAt, EndAt: reqIter.Attributes.EndAt, } if reqIter.Attributes.Description != nil { newItr.Description = reqIter.Attributes.Description } err = appl.Iterations().Create(ctx, &newItr) if err != nil { return jsonapi.JSONErrorResponse(ctx, err) } res := &app.IterationSingle{ Data: ConvertIteration(ctx.RequestData, &newItr), } ctx.ResponseData.Header().Set("Location", rest.AbsoluteURL(ctx.RequestData, app.IterationHref(res.Data.ID))) return ctx.Created(res) }) }
func createIterationLinks(request *goa.RequestData, id interface{}) *app.GenericLinks { selfURL := rest.AbsoluteURL(request, app.IterationHref(id)) return &app.GenericLinks{ Self: &selfURL, } }