func TestIsMarkupSupported(t *testing.T) { assert.True(t, rendering.IsMarkupSupported(rendering.SystemMarkupDefault)) assert.True(t, rendering.IsMarkupSupported(rendering.SystemMarkupPlainText)) assert.True(t, rendering.IsMarkupSupported(rendering.SystemMarkupMarkdown)) assert.False(t, rendering.IsMarkupSupported("")) assert.False(t, rendering.IsMarkupSupported("foo")) }
// Create creates a new work item in the repository // returns BadParameterError, ConversionError or InternalError func (r *GormWorkItemRepository) Create(ctx context.Context, typeID string, fields map[string]interface{}, creator string) (*app.WorkItem, error) { wiType, err := r.wir.LoadTypeFromDB(ctx, typeID) if err != nil { return nil, errors.NewBadParameterError("type", typeID) } wi := WorkItem{ Type: typeID, Fields: Fields{}, } fields[SystemCreator] = creator for fieldName, fieldDef := range wiType.Fields { if fieldName == SystemCreatedAt { continue } fieldValue := fields[fieldName] var err error wi.Fields[fieldName], err = fieldDef.ConvertToModel(fieldName, fieldValue) if err != nil { return nil, errors.NewBadParameterError(fieldName, fieldValue) } if fieldName == SystemDescription && wi.Fields[fieldName] != nil { description := rendering.NewMarkupContentFromMap(wi.Fields[fieldName].(map[string]interface{})) if !rendering.IsMarkupSupported(description.Markup) { return nil, errors.NewBadParameterError(fieldName, fieldValue) } } } tx := r.db if err = tx.Create(&wi).Error; err != nil { return nil, errors.NewInternalError(err.Error()) } return convertWorkItemModelToApp(wiType, &wi) }
// Render runs the render action. func (c *RenderController) Render(ctx *app.RenderRenderContext) error { content := ctx.Payload.Data.Attributes.Content markup := ctx.Payload.Data.Attributes.Markup if !rendering.IsMarkupSupported(markup) { return jsonapi.JSONErrorResponse(ctx, errors.NewBadParameterError("Unsupported markup type", markup)) } htmlResult := rendering.RenderMarkupToHTML(content, markup) res := &app.MarkupRenderingSingle{Data: &app.MarkupRenderingData{ ID: uuid.NewV4().String(), Type: RenderingType, Attributes: &app.MarkupRenderingDataAttributes{ RenderedContent: htmlResult, }}} return ctx.OK(res) }
// ConvertJSONAPIToWorkItem is responsible for converting given WorkItem model object into a // response resource object by jsonapi.org specifications func ConvertJSONAPIToWorkItem(appl application.Application, source app.WorkItem2, target *app.WorkItem) error { // construct default values from input WI version, err := getVersion(source.Attributes["version"]) if err != nil { return err } target.Version = version if source.Relationships != nil && source.Relationships.Assignees != nil { if source.Relationships.Assignees.Data == nil { delete(target.Fields, workitem.SystemAssignees) } else { var ids []string for _, d := range source.Relationships.Assignees.Data { assigneeUUID, err := uuid.FromString(*d.ID) if err != nil { return errors.NewBadParameterError("data.relationships.assignees.data.id", *d.ID) } if ok := appl.Identities().IsValid(context.Background(), assigneeUUID); !ok { return errors.NewBadParameterError("data.relationships.assignees.data.id", *d.ID) } ids = append(ids, assigneeUUID.String()) } target.Fields[workitem.SystemAssignees] = ids } } if source.Relationships != nil && source.Relationships.Iteration != nil { if source.Relationships.Iteration.Data == nil { delete(target.Fields, workitem.SystemIteration) } else { d := source.Relationships.Iteration.Data iterationUUID, err := uuid.FromString(*d.ID) if err != nil { return errors.NewBadParameterError("data.relationships.iteration.data.id", *d.ID) } if _, err = appl.Iterations().Load(context.Background(), iterationUUID); err != nil { return errors.NewBadParameterError("data.relationships.iteration.data.id", *d.ID) } target.Fields[workitem.SystemIteration] = iterationUUID.String() } } if source.Relationships != nil && source.Relationships.Area != nil { if source.Relationships.Area.Data == nil { delete(target.Fields, workitem.SystemArea) } else { d := source.Relationships.Area.Data areaUUID, err := uuid.FromString(*d.ID) if err != nil { return errors.NewBadParameterError("data.relationships.area.data.id", *d.ID) } if _, err = appl.Areas().Load(context.Background(), areaUUID); err != nil { return errors.NewBadParameterError("data.relationships.area.data.id", *d.ID) } target.Fields[workitem.SystemArea] = areaUUID.String() } } if source.Relationships != nil && source.Relationships.BaseType != nil { if source.Relationships.BaseType.Data != nil { target.Type = source.Relationships.BaseType.Data.ID } } for key, val := range source.Attributes { // convert legacy description to markup content if key == workitem.SystemDescription { if m := rendering.NewMarkupContentFromValue(val); m != nil { target.Fields[key] = *m } } else { target.Fields[key] = val } } if description, ok := target.Fields[workitem.SystemDescription].(rendering.MarkupContent); ok { // verify the description markup if !rendering.IsMarkupSupported(description.Markup) { return errors.NewBadParameterError("data.relationships.attributes[system.description].markup", description.Markup) } } return nil }