Skip to content

Ordering the enhancers by group name for OpenAPI spec enhancer service #4385

@jannyHou

Description

@jannyHou

Suggestion

See discussion in #4258 (comment), when load spec enhancers, people should be able to specify order for them.

A proposal would be using a combination of group and alphabet order like how we load observers group by group in https://loopback.io/doc/en/lb4/Life-cycle.html#observer-groups.

Use Cases

When define an enhancer, you can specify the tag in the binding template like @bind(asSpecEnhancer({CoreTags.OAS_SPEC_ENHANCER_GROUP: 'path'}))

Then specify the enhancer order like:

app
  .bind(CoreBindings.OAS_SPEC_ENHANCER_OPTIONS)
  .to({orderedGroups: ['path', 'component', 'info']});

please note this is just a proposal, the story owner can think of better design to provide the group name and specify the group order through options

For enhancers in the same group, they are loaded according to the name(alphabetically)

Examples

Define a path spec enhancers with tag path and a component enhancer with tag component

@bind(asSpecEnhancer({CoreTags.OAS_SPEC_ENHANCER_GROUP: 'path'}))
export class PathSpecEnhancer implements OASEnhancer {
  name = 'path';
  modifySpec(spec: OpenApiSpec): OpenApiSpec {
    const PathPatchSpec = {
      // some spec
    };
    const mergedSpec = mergeOpenAPISpec(spec, PathPatchSpec);
    return mergedSpec;
  }
}

@bind(asSpecEnhancer({CoreTags.OAS_SPEC_ENHANCER_GROUP: 'component'}))
export class ComponentSpecEnhancer implements OASEnhancer {
  name = 'component';
  modifySpec(spec: OpenApiSpec): OpenApiSpec {
    const ComponentPatchSpec = {
      // some spec
    };
    const mergedSpec = mergeOpenAPISpec(spec, ComponentPatchSpec);
    return mergedSpec;
  }
}

Then specify the enhancer order like:

app
  .bind(CoreBindings.OAS_SPEC_ENHANCER_OPTIONS)
  .to({orderedGroups: ['path', 'component', 'info']});

Acceptance criteria

  • Allow the OAI spec enhancer service to load enhancers by group names.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions