loopbackio / loopback-next

LoopBack makes it easy to build modern API applications that require complex integrations.
https://loopback.io
Other
4.96k stars 1.07k forks source link

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

Open jannyHou opened 4 years ago

jannyHou commented 4 years ago

Suggestion

See discussion in https://github.com/strongloop/loopback-next/pull/4258#discussion_r355542472, 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

dougal83 commented 4 years ago

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

dhmlau commented 4 years ago

Since this issue is nice-to-have, I'm going to remove this from the epic https://github.com/strongloop/loopback-next/issues/4391 which is target for Q2.

stale[bot] commented 3 years ago

This issue has been marked stale because it has not seen activity within six months. If you believe this to be in error, please contact one of the code owners, listed in the CODEOWNERS file at the top-level of this repository. This issue will be closed within 30 days of being stale.

stale[bot] commented 3 years ago

This issue has been marked stale because it has not seen activity within six months. If you believe this to be in error, please contact one of the code owners, listed in the CODEOWNERS file at the top-level of this repository. This issue will be closed within 30 days of being stale.