swagger-api / swagger-api/swagger-codegen

Generated type with OneOf should use base model

Open
#10,492 0 comments 4 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Mustache
Stars
17.8k
Forks
6k
PR merge metrics
No merged PRs in 30d

Description

Description

I'm trying to generate a code for models with OneOf. It generates code, but it's unusable without changes. If I specify a type, that inside it has OneOf, so it generates this type, but it's empty. If I specify a property, that consists of OneOf, it generates models starting OneOfModelName, but not sure how to use it. I've search the Internet for answers, but haven't found yet.

Ideal situation is, that OneOf should end up with Base implementation for types and several types, that will be inherit this base model, e.g.:
BaseTestItemWithDiscriminator is a base model
ImplementationFirstWithDiscriminator inherits BaseTestItemWithDiscriminator
ImplementationSecondWithDiscriminator inherits BaseTestItemWithDiscriminator

And property in code should look like
public BaseTestItemWithDiscriminator TestItem { get; set; }

Not:
public FinalOverrideModel TestItem { get; set; } or
public OneOfModelToReturnTestItemWithDiscriminator TestItemWithDiscriminator { get; set; }

Is it an issue, or I have something wrong in the schema?

Swagger-codegen version

3.0.21

Swagger declaration file content or url
x-generator: NSwag v13.0.6.0 (NJsonSchema v10.0.23.0 (Newtonsoft.Json v11.0.0.0))
openapi: 3.0.0
info:
  title: APIs
  version: 1.0.0
paths:
  /api/testmodel:
    get:
      summary: Returns test model.
      responses:
        '200':
          description: TestModel
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelToReturn'
      security:
        - Basic: []
components:
  schemas:
    ModelToReturn:
      type: object
      additionalProperties: false
      properties:
        testItem:
          $ref: '#/components/schemas/FinalOverrideModel'
        testItemWithDiscriminator:
          oneOf:
            - $ref: '#/components/schemas/ImplementationFirstWithDiscriminator'
            - $ref: '#/components/schemas/ImplementationSecondWithDiscriminator'
          discriminator:
            propertyName: itemType
            mapping:
              highQ: '#/components/schemas/ImplementationFirstWithDiscriminator'
              iManage: '#/components/schemas/ImplementationSecondWithDiscriminator'
    BaseTestItemWithDiscriminator:
      type: object
      required:
        - itemType
      properties:
        itemType:
          type: string
          nullable: true
          enum:
            - type1
            - type2
      discriminator:
        propertyName: itemType
        mapping:
          type1: '#/components/schemas/ImplementationFirstWithDiscriminator'
          type2: '#/components/schemas/ImplementationSecondWithDiscriminator'
    ImplementationFirstWithDiscriminator:
      type: object
      allOf:
        - $ref: '#/components/schemas/BaseTestItemWithDiscriminator'
        - type: object
          properties:
            name:
              type: string
              nullable: true
    ImplementationSecondWithDiscriminator:
      type: object
      allOf:
        - $ref: '#/components/schemas/BaseTestItemWithDiscriminator'
        - type: object
          properties:
            title:
              type: string
              nullable: true
    FinalOverrideModel:
      oneOf:
        - $ref: '#/components/schemas/ImplementationFirstWithDiscriminator'
        - $ref: '#/components/schemas/ImplementationSecondWithDiscriminator'
      discriminator:
        propertyName: itemType
        mapping:
          highQ: '#/components/schemas/ImplementationFirstWithDiscriminator'
          iManage: '#/components/schemas/ImplementationSecondWithDiscriminator'
  securitySchemes:
    Basic:
      type: http
      scheme: basic
Command line used for generation

java -jar swagger-codegen-cli-3.0.21.jar generate -i openapi_b.json -l csharp -o f:\csharp

Steps to reproduce

Just use code generation on the model provided

Related issues/PRs

None found

Suggest a fix/enhancement

No suggestions

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the Java CLI command with the supplied OpenAPI YAML and inspect the C# generator's handling of oneOf, allOf, and discriminators. Compare the generated properties for FinalOverrideModel and testItemWithDiscriminator with the requested BaseTestItemWithDiscriminator type and derived implementations; done means the generated model exposes the base type while retaining the concrete implementations.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp, java, openapi
Domain
api, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.