func createWorkItemLink(ctx *workItemLinkContext, funcs createWorkItemLinkFuncs, payload *app.CreateWorkItemLinkPayload) error { // Convert payload from app to model representation model := link.WorkItemLink{} in := app.WorkItemLinkSingle{ Data: payload.Data, } err := link.ConvertLinkToModel(in, &model) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(err) return funcs.BadRequest(jerrors) } link, err := ctx.Application.WorkItemLinks().Create(ctx.Context, model.SourceID, model.TargetID, model.LinkTypeID) if err != nil { cause := errs.Cause(err) switch cause.(type) { case errors.NotFoundError: jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(err.Error())) return funcs.BadRequest(jerrors) case errors.BadParameterError: jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(err.Error())) return funcs.BadRequest(jerrors) default: jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } } if err := enrichLinkSingle(ctx, link); err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } ctx.ResponseData.Header().Set("Location", app.WorkItemLinkHref(link.Data.ID)) return funcs.Created(link) }
// List runs the list action func (c *WorkitemtypeController) List(ctx *app.ListWorkitemtypeContext) error { start, limit, err := parseLimit(ctx.Page) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(fmt.Sprintf("could not parse paging: %s", err.Error()))) return ctx.BadRequest(jerrors) } return application.Transactional(c.db, func(appl application.Application) error { result, err := appl.WorkItemTypes().List(ctx.Context, start, &limit) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(fmt.Sprintf("Error listing work item types: %s", err.Error()))) return ctx.BadRequest(jerrors) } return ctx.OK(result) }) }
// Update runs the update action. func (c *TrackerqueryController) Update(ctx *app.UpdateTrackerqueryContext) error { result := application.Transactional(c.db, func(appl application.Application) error { toSave := app.TrackerQuery{ ID: ctx.ID, Query: ctx.Payload.Query, Schedule: ctx.Payload.Schedule, TrackerID: ctx.Payload.TrackerID, } tq, err := appl.TrackerQueries().Save(ctx.Context, toSave) if err != nil { cause := errs.Cause(err) switch cause.(type) { case remoteworkitem.BadParameterError, remoteworkitem.ConversionError: jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(err.Error())) return ctx.BadRequest(jerrors) default: jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal(err.Error())) return ctx.InternalServerError(jerrors) } } return ctx.OK(tq) }) c.scheduler.ScheduleAllQueries() return result }
// Show returns the authorized user based on the provided Token func (c *UserController) Show(ctx *app.ShowUserContext) error { id, err := c.tokenManager.Locate(ctx) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(err.Error())) return ctx.BadRequest(jerrors) } return application.Transactional(c.db, func(appl application.Application) error { identity, err := appl.Identities().Load(ctx, id) if err != nil || identity == nil { log.Error(ctx, map[string]interface{}{ "identityID": id, }, "auth token containers id %s of unknown Identity", id) jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrUnauthorized(fmt.Sprintf("Auth token contains id %s of unknown Identity\n", id))) return ctx.Unauthorized(jerrors) } var user *account.User userID := identity.UserID if userID.Valid { user, err = appl.Users().Load(ctx.Context, userID.UUID) if err != nil { return jsonapi.JSONErrorResponse(ctx, errors.Wrap(err, fmt.Sprintf("Can't load user with id %s", userID.UUID))) } } return ctx.OK(ConvertUser(ctx.RequestData, identity, user)) }) }
// Create runs the create action. func (c *WorkItemRelationshipsLinksController) Create(ctx *app.CreateWorkItemRelationshipsLinksContext) error { return application.Transactional(c.db, func(appl application.Application) error { // Check that current work item does indeed exist if _, err := appl.WorkItems().Load(ctx.Context, ctx.ID); err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } // Check that the source ID of the link is the same as the current work // item ID. src, _ := getSrcTgt(ctx.Payload.Data) if src != nil && *src != ctx.ID { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(fmt.Sprintf("data.relationships.source.data.id is \"%s\" but must be \"%s\"", ctx.Payload.Data.Relationships.Source.Data.ID, ctx.ID))) return ctx.BadRequest(jerrors) } // If no source is specified we pre-fill the source field of the payload // with the current work item ID from the URL. This is for convenience. if src == nil { if ctx.Payload.Data.Relationships == nil { ctx.Payload.Data.Relationships = &app.WorkItemLinkRelationships{} } if ctx.Payload.Data.Relationships.Source == nil { ctx.Payload.Data.Relationships.Source = &app.RelationWorkItem{} } if ctx.Payload.Data.Relationships.Source.Data == nil { ctx.Payload.Data.Relationships.Source.Data = &app.RelationWorkItemData{} } ctx.Payload.Data.Relationships.Source.Data.ID = ctx.ID ctx.Payload.Data.Relationships.Source.Data.Type = link.EndpointWorkItems } return createWorkItemLink(newWorkItemLinkContext(ctx.Context, appl, c.db, ctx.RequestData, ctx.ResponseData, app.WorkItemLinkHref), ctx, ctx.Payload) }) }
// Create runs the create action. func (c *WorkItemLinkTypeController) Create(ctx *app.CreateWorkItemLinkTypeContext) error { // WorkItemLinkTypeController_Create: start_implement // Convert payload from app to model representation model := link.WorkItemLinkType{} in := app.WorkItemLinkTypeSingle{ Data: ctx.Payload.Data, } err := link.ConvertLinkTypeToModel(in, &model) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(err.Error())) return ctx.BadRequest(jerrors) } return application.Transactional(c.db, func(appl application.Application) error { linkType, err := appl.WorkItemLinkTypes().Create(ctx.Context, model.Name, model.Description, model.SourceTypeName, model.TargetTypeName, model.ForwardName, model.ReverseName, model.Topology, model.LinkCategoryID) if err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } // Enrich linkCtx := newWorkItemLinkContext(ctx.Context, appl, c.db, ctx.RequestData, ctx.ResponseData, app.WorkItemLinkTypeHref) err = enrichLinkTypeSingle(linkCtx, linkType) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal("Failed to enrich link type: %s", err.Error())) return ctx.InternalServerError(jerrors) } ctx.ResponseData.Header().Set("Location", app.WorkItemLinkTypeHref(linkType.Data.ID)) return ctx.Created(linkType) }) // WorkItemLinkTypeController_Create: end_implement }
// Spaces runs the space search action. func (c *SearchController) Spaces(ctx *app.SpacesSearchContext) error { q := ctx.Q if q == "" { return jsonapi.JSONErrorResponse(ctx, goa.ErrBadRequest(fmt.Errorf("Empty search query not allowed"))) } else if q == "*" { q = "" // Allow empty query if * specified } var result []*space.Space var count int var err error offset, limit := computePagingLimts(ctx.PageOffset, ctx.PageLimit) return application.Transactional(c.db, func(appl application.Application) error { var resultCount uint64 result, resultCount, err = appl.Spaces().Search(ctx, &q, &offset, &limit) count = int(resultCount) if err != nil { cause := errs.Cause(err) switch cause.(type) { case errors.BadParameterError: return jsonapi.JSONErrorResponse(ctx, goa.ErrBadRequest(fmt.Sprintf("Error listing spaces: %s", err.Error()))) default: log.Error(ctx, map[string]interface{}{ "query": q, "offset": offset, "limit": limit, "err": err, }, "unable to list spaces") return jsonapi.JSONErrorResponse(ctx, goa.ErrInternal(err.Error())) } } response := app.SearchSpaceList{ Links: &app.PagingLinks{}, Meta: &app.SpaceListMeta{TotalCount: count}, Data: ConvertSpaces(ctx.RequestData, result), } setPagingLinks(response.Links, buildAbsoluteURL(ctx.RequestData), len(result), offset, limit, count, "q="+q) return ctx.OK(&response) }) }
// List runs the list action. func (c *TrackerController) List(ctx *app.ListTrackerContext) error { exp, err := query.Parse(ctx.Filter) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(fmt.Sprintf("could not parse filter: %s", err.Error()))) return ctx.BadRequest(jerrors) } start, limit, err := parseLimit(ctx.Page) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(fmt.Sprintf("could not parse paging: %s", err.Error()))) return ctx.BadRequest(jerrors) } return application.Transactional(c.db, func(appl application.Application) error { result, err := appl.Trackers().List(ctx.Context, exp, start, &limit) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal(fmt.Sprintf("Error listing trackers: %s", err.Error()))) return ctx.InternalServerError(jerrors) } return ctx.OK(result) }) }
// Show runs the show action. func (c *SearchController) Show(ctx *app.ShowSearchContext) error { var offset int var limit int offset, limit = computePagingLimts(ctx.PageOffset, ctx.PageLimit) // ToDo : Keep URL registeration central somehow. hostString := ctx.RequestData.Host if hostString == "" { hostString = configuration.GetHTTPAddress() } urlRegexString := fmt.Sprintf("(?P<domain>%s)(?P<path>/work-item/list/detail/)(?P<id>\\d*)", hostString) search.RegisterAsKnownURL(search.HostRegistrationKeyForListWI, urlRegexString) urlRegexString = fmt.Sprintf("(?P<domain>%s)(?P<path>/work-item/board/detail/)(?P<id>\\d*)", hostString) search.RegisterAsKnownURL(search.HostRegistrationKeyForBoardWI, urlRegexString) return application.Transactional(c.db, func(appl application.Application) error { //return transaction.Do(c.ts, func() error { result, c, err := appl.SearchItems().SearchFullText(ctx.Context, ctx.Q, &offset, &limit) count := int(c) if err != nil { cause := errs.Cause(err) switch cause.(type) { case errors.BadParameterError: jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(fmt.Sprintf("Error listing work items: %s", err.Error()))) return ctx.BadRequest(jerrors) default: log.Error(ctx, map[string]interface{}{ "err": err, }, "unable to list the work items") jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal(err.Error())) return ctx.InternalServerError(jerrors) } } response := app.SearchWorkItemList{ Links: &app.PagingLinks{}, Meta: &app.WorkItemListResponseMeta{TotalCount: count}, Data: ConvertWorkItems(ctx.RequestData, result), } setPagingLinks(response.Links, buildAbsoluteURL(ctx.RequestData), len(result), offset, limit, count, "q="+ctx.Q) return ctx.OK(&response) }) }
// Create runs the create action. func (c *TrackerqueryController) Create(ctx *app.CreateTrackerqueryContext) error { result := application.Transactional(c.db, func(appl application.Application) error { tq, err := appl.TrackerQueries().Create(ctx.Context, ctx.Payload.Query, ctx.Payload.Schedule, ctx.Payload.TrackerID) if err != nil { cause := errs.Cause(err) switch cause.(type) { case remoteworkitem.BadParameterError, remoteworkitem.ConversionError: jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrBadRequest(err.Error())) return ctx.BadRequest(jerrors) default: jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal(err.Error())) return ctx.InternalServerError(jerrors) } } ctx.ResponseData.Header().Set("Location", app.TrackerqueryHref(tq.ID)) return ctx.Created(tq) }) c.scheduler.ScheduleAllQueries() return result }