// 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)) }) }
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) }
// 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 }
// 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 }
func showWorkItemLink(ctx *workItemLinkContext, funcs showWorkItemLinkFuncs, linkID string) error { link, err := ctx.Application.WorkItemLinks().Load(ctx.Context, linkID) if err != nil { 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) } return funcs.OK(link) }
func updateWorkItemLink(ctx *workItemLinkContext, funcs updateWorkItemLinkFuncs, payload *app.UpdateWorkItemLinkPayload) error { toSave := app.WorkItemLinkSingle{ Data: payload.Data, } link, err := ctx.Application.WorkItemLinks().Save(ctx.Context, toSave) if err != nil { 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) } return funcs.OK(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) }) }
// Show runs the show action. func (c *WorkItemLinkCategoryController) Show(ctx *app.ShowWorkItemLinkCategoryContext) error { return application.Transactional(c.db, func(appl application.Application) error { res, err := appl.WorkItemLinkCategories().Load(ctx.Context, ctx.ID) if err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } linkCtx := newWorkItemLinkContext(ctx.Context, appl, c.db, ctx.RequestData, ctx.ResponseData, app.WorkItemLinkCategoryHref) err = enrichLinkCategorySingle(linkCtx, res) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal("Failed to enrich link category: %s", err.Error())) return ctx.InternalServerError(jerrors) } return ctx.OK(res) }) }
func deleteWorkItemLink(ctx *workItemLinkContext, funcs deleteWorkItemLinkFuncs, linkID string) error { err := ctx.Application.WorkItemLinks().Delete(ctx.Context, linkID) if err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } return funcs.OK([]byte{}) }
// Create runs the create action. func (c *WorkItemLinkCategoryController) Create(ctx *app.CreateWorkItemLinkCategoryContext) error { return application.Transactional(c.db, func(appl application.Application) error { cat, err := appl.WorkItemLinkCategories().Create(ctx.Context, ctx.Payload.Data.Attributes.Name, ctx.Payload.Data.Attributes.Description) if err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } linkCtx := newWorkItemLinkContext(ctx.Context, appl, c.db, ctx.RequestData, ctx.ResponseData, app.WorkItemLinkCategoryHref) err = enrichLinkCategorySingle(linkCtx, cat) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal("Failed to enrich link category: %s", err.Error())) return ctx.InternalServerError(jerrors) } ctx.ResponseData.Header().Set("Location", app.WorkItemLinkCategoryHref(cat.Data.ID)) return ctx.Created(cat) }) }
// 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) }) }
func listWorkItemLink(ctx *workItemLinkContext, funcs listWorkItemLinkFuncs, wiIDStr *string) error { var linkArr *app.WorkItemLinkList var err error if wiIDStr != nil { linkArr, err = ctx.Application.WorkItemLinks().ListByWorkItemID(ctx.Context, *wiIDStr) } else { linkArr, err = ctx.Application.WorkItemLinks().List(ctx.Context) } if err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } if err := enrichLinkList(ctx, linkArr); err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } return funcs.OK(linkArr) }
// List runs the list action. func (c *WorkItemLinkTypeController) List(ctx *app.ListWorkItemLinkTypeContext) error { // WorkItemLinkTypeController_List: start_implement return application.Transactional(c.db, func(appl application.Application) error { result, err := appl.WorkItemLinkTypes().List(ctx.Context) 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 = enrichLinkTypeList(linkCtx, result) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal("Failed to enrich link types: %s", err.Error())) return ctx.InternalServerError(jerrors) } return ctx.OK(result) }) // WorkItemLinkTypeController_List: end_implement }
// Delete runs the delete action. func (c *WorkItemLinkCategoryController) Delete(ctx *app.DeleteWorkItemLinkCategoryContext) error { return application.Transactional(c.db, func(appl application.Application) error { err := appl.WorkItemLinkCategories().Delete(ctx.Context, ctx.ID) if err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } return ctx.OK([]byte{}) }) }
// Delete runs the delete action. func (c *TrackerqueryController) Delete(ctx *app.DeleteTrackerqueryContext) error { result := application.Transactional(c.db, func(appl application.Application) error { err := appl.TrackerQueries().Delete(ctx.Context, ctx.ID) if err != nil { cause := errs.Cause(err) switch cause.(type) { case remoteworkitem.NotFoundError: jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrNotFound(err.Error())) return ctx.NotFound(jerrors) default: jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal(err.Error())) return ctx.InternalServerError(jerrors) } } return ctx.OK([]byte{}) }) c.scheduler.ScheduleAllQueries() return result }
// List runs the list action. func (c *IdentityController) List(ctx *app.ListIdentityContext) error { return application.Transactional(c.db, func(appl application.Application) error { result, err := appl.Identities().List(ctx.Context) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal(fmt.Sprintf("Error listing identities: %s", err.Error()))) return ctx.InternalServerError(jerrors) } return ctx.OK(result) }) }
// Update runs the update action. func (c *WorkItemLinkCategoryController) Update(ctx *app.UpdateWorkItemLinkCategoryContext) error { return application.Transactional(c.db, func(appl application.Application) error { toSave := app.WorkItemLinkCategorySingle{ Data: ctx.Payload.Data, } linkCategory, err := appl.WorkItemLinkCategories().Save(ctx.Context, toSave) 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.WorkItemLinkCategoryHref) err = enrichLinkCategorySingle(linkCtx, linkCategory) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal("Failed to enrich link category: %s", err.Error())) return ctx.InternalServerError(jerrors) } return ctx.OK(linkCategory) }) }
// 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 }
// Show runs the show action. func (c *TrackerController) Show(ctx *app.ShowTrackerContext) error { return application.Transactional(c.db, func(appl application.Application) error { t, err := appl.Trackers().Load(ctx.Context, ctx.ID) if err != nil { cause := errs.Cause(err) switch cause.(type) { case remoteworkitem.NotFoundError: log.Error(ctx, map[string]interface{}{ "trackerID": ctx.ID, }, "tracker controller not found") jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrNotFound(err.Error())) return ctx.NotFound(jerrors) default: jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(goa.ErrInternal(err.Error())) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } } return ctx.OK(t) }) }
// 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 *UsersController) Show(ctx *app.ShowUsersContext) error { return application.Transactional(c.db, func(appl application.Application) error { id, err := uuid.FromString(ctx.ID) if err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } identity, err := appl.Identities().Load(ctx.Context, id) if err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, 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("User ID %s not valid", userID.UUID))) } } return ctx.OK(ConvertUser(ctx.RequestData, identity, user)) }) }
// Show runs the show action. func (c *CommentsController) Show(ctx *app.ShowCommentsContext) error { return application.Transactional(c.db, func(appl application.Application) error { c, err := appl.Comments().Load(ctx, ctx.CommentID) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrUnauthorized(err.Error())) return ctx.NotFound(jerrors) } res := &app.CommentSingle{} res.Data = ConvertComment( ctx.RequestData, c, CommentIncludeParentWorkItem()) return ctx.OK(res) }) }
// Create runs the create action. func (c *WorkitemtypeController) Create(ctx *app.CreateWorkitemtypeContext) error { return application.Transactional(c.db, func(appl application.Application) error { var fields = map[string]app.FieldDefinition{} for key, fd := range ctx.Payload.Fields { fields[key] = *fd } wit, err := appl.WorkItemTypes().Create(ctx.Context, ctx.Payload.ExtendedTypeName, ctx.Payload.Name, fields) if err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } ctx.ResponseData.Header().Set("Location", app.WorkitemtypeHref(wit.Name)) return ctx.Created(wit) }) }
// enrichLinkTypeSingle includes related resources in the single's "included" array func enrichLinkTypeSingle(ctx *workItemLinkContext, single *app.WorkItemLinkTypeSingle) error { // Add "links" element selfURL := rest.AbsoluteURL(ctx.RequestData, ctx.LinkFunc(*single.Data.ID)) single.Data.Links = &app.GenericLinks{ Self: &selfURL, } // Now include the optional link category data in the work item link type "included" array linkCat, err := ctx.Application.WorkItemLinkCategories().Load(ctx.Context, single.Data.Relationships.LinkCategory.Data.ID) if err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } single.Included = append(single.Included, linkCat.Data) return nil }
// Show runs the show action. func (c *TrackerqueryController) Show(ctx *app.ShowTrackerqueryContext) error { return application.Transactional(c.db, func(appl application.Application) error { tq, err := appl.TrackerQueries().Load(ctx.Context, ctx.ID) if err != nil { cause := errs.Cause(err) switch cause.(type) { case remoteworkitem.NotFoundError: log.Error(ctx, map[string]interface{}{ "trackerID": ctx.ID, }, "tracker query controller not found") jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrNotFound(err.Error())) return ctx.NotFound(jerrors) default: return errs.WithStack(err) } } return ctx.OK(tq) }) }
// Generate obtain the access token from Keycloak for the test user func (c *LoginController) Generate(ctx *app.GenerateLoginContext) error { if !configuration.IsPostgresDeveloperModeEnabled() { log.Error(ctx, map[string]interface{}{ "method": "Generate", }, "Postgres developer mode not enabled") jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrUnauthorized("Postgres developer mode not enabled")) return ctx.Unauthorized(jerrors) } var scopes []account.Identity scopes = append(scopes, test.TestIdentity) scopes = append(scopes, test.TestObserverIdentity) client := &http.Client{Timeout: 10 * time.Second} username := configuration.GetKeycloakTestUserName() res, err := client.PostForm(configuration.GetKeycloakEndpointToken(), url.Values{ "client_id": {configuration.GetKeycloakClientID()}, "client_secret": {configuration.GetKeycloakSecret()}, "username": {username}, "password": {configuration.GetKeycloakTestUserSecret()}, "grant_type": {"password"}, }) if err != nil { return jsonapi.JSONErrorResponse(ctx, errors.NewInternalError("error when obtaining token "+err.Error())) } token, err := readToken(res, ctx) if err != nil { log.Error(ctx, map[string]interface{}{ "tokenEndpoint": res, "err": err, }, "Error when unmarshal json with access token") return jsonapi.JSONErrorResponse(ctx, e.Wrap(err, "Error when unmarshal json with access token")) } var tokens app.AuthTokenCollection tokens = append(tokens, &app.AuthToken{Token: token}) // Creates the testuser user and identity if they don't yet exist c.auth.CreateKeycloakUser(*token.AccessToken, ctx) return ctx.OK(tokens) }
// Create does POST workitem func (c *WorkitemController) Create(ctx *app.CreateWorkitemContext) error { currentUser, err := login.ContextIdentity(ctx) if err != nil { jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrUnauthorized(err.Error())) return ctx.Unauthorized(jerrors) } var wit *string if ctx.Payload.Data != nil && ctx.Payload.Data.Relationships != nil && ctx.Payload.Data.Relationships.BaseType != nil && ctx.Payload.Data.Relationships.BaseType.Data != nil { wit = &ctx.Payload.Data.Relationships.BaseType.Data.ID } if wit == nil { // TODO Figure out path source etc. Should be a required relation return jsonapi.JSONErrorResponse(ctx, errors.NewBadParameterError("Data.Relationships.BaseType.Data.ID", err)) } wi := app.WorkItem{ Fields: make(map[string]interface{}), } return application.Transactional(c.db, func(appl application.Application) error { err := ConvertJSONAPIToWorkItem(appl, *ctx.Payload.Data, &wi) if err != nil { return jsonapi.JSONErrorResponse(ctx, errs.Wrap(err, fmt.Sprintf("Error creating work item"))) } wi, err := appl.WorkItems().Create(ctx, *wit, wi.Fields, currentUser) if err != nil { return jsonapi.JSONErrorResponse(ctx, errs.Wrap(err, fmt.Sprintf("Error creating work item"))) } wi2 := ConvertWorkItem(ctx.RequestData, wi) resp := &app.WorkItem2Single{ Data: wi2, Links: &app.WorkItemLinks{ Self: buildAbsoluteURL(ctx.RequestData), }, } ctx.ResponseData.Header().Set("Location", app.WorkitemHref(wi2.ID)) return ctx.Created(resp) }) }
// enrichLinkTypeList includes related resources in the list's "included" array func enrichLinkTypeList(ctx *workItemLinkContext, list *app.WorkItemLinkTypeList) error { // Add "links" element for _, data := range list.Data { selfURL := rest.AbsoluteURL(ctx.RequestData, ctx.LinkFunc(*data.ID)) data.Links = &app.GenericLinks{ Self: &selfURL, } } // Build our "set" of distinct category IDs already converted as strings categoryIDMap := map[string]bool{} for _, typeData := range list.Data { categoryIDMap[typeData.Relationships.LinkCategory.Data.ID] = true } // Now include the optional link category data in the work item link type "included" array for categoryID := range categoryIDMap { linkCat, err := ctx.Application.WorkItemLinkCategories().Load(ctx.Context, categoryID) if err != nil { jerrors, httpStatusCode := jsonapi.ErrorToJSONAPIErrors(err) return ctx.ResponseData.Service.Send(ctx.Context, httpStatusCode, jerrors) } list.Included = append(list.Included, linkCat.Data) } return nil }
// Perform performs authenticatin func (keycloak *KeycloakOAuthProvider) Perform(ctx *app.AuthorizeLoginContext) error { state := ctx.Params.Get("state") code := ctx.Params.Get("code") referer := ctx.RequestData.Header.Get("Referer") if code != "" { // After redirect from oauth provider // validate known state var knownReferer string defer func() { delete(stateReferer, state) }() knownReferer = stateReferer[state] if state == "" || knownReferer == "" { log.Error(ctx, map[string]interface{}{ "state": state, "referer": knownReferer, }, "state or known referer was empty") jerrors, _ := jsonapi.ErrorToJSONAPIErrors(goa.ErrUnauthorized("State or known referer was empty")) return ctx.Unauthorized(jerrors) } keycloakToken, err := keycloak.config.Exchange(ctx, code) if err != nil || keycloakToken.AccessToken == "" { log.Error(ctx, map[string]interface{}{ "code": code, "err": err, }, "keycloak exchange operation failed") return redirectWithError(ctx, knownReferer, InvalidCodeError) } _, _, err = keycloak.CreateKeycloakUser(keycloakToken.AccessToken, ctx) if err != nil { log.Error(ctx, map[string]interface{}{ "token": keycloakToken.AccessToken, "err": err, }, "failed to create a user and KeyCloak identity using the access token") return redirectWithError(ctx, knownReferer, err.Error()) } referelURL, err := url.Parse(knownReferer) if err != nil { return redirectWithError(ctx, knownReferer, err.Error()) } err = encodeToken(referelURL, keycloakToken) if err != nil { return redirectWithError(ctx, knownReferer, err.Error()) } ctx.ResponseData.Header().Set("Location", referelURL.String()) return ctx.TemporaryRedirect() } // First time access, redirect to oauth provider // store referer id to state for redirect later log.Info(ctx, map[string]interface{}{ "pkg": "login", "referer": referer, }, "Got Request from!") state = uuid.NewV4().String() mapLock.Lock() defer mapLock.Unlock() stateReferer[state] = referer keycloak.config.RedirectURL = rest.AbsoluteURL(ctx.RequestData, "/api/login/authorize") redirectURL := keycloak.config.AuthCodeURL(state, oauth2.AccessTypeOnline) ctx.ResponseData.Header().Set("Location", redirectURL) return ctx.TemporaryRedirect() }