Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
jannyHou opened this issue Jan 8, 2020 · 1 comment
Open

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

jannyHou opened this issue Jan 8, 2020 · 1 comment

Comments

@jannyHou
Copy link
Contributor

@jannyHou jannyHou commented Jan 8, 2020

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.
@jannyHou jannyHou added the feature label Jan 8, 2020
@dougal83

This comment has been minimized.

Copy link
Contributor

@dougal83 dougal83 commented Jan 8, 2020

Another possibility would be to assign weight variable to each enhancer for fine control. Not sure how necessary it is though.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
3 participants
You can’t perform that action at this time.