function convertResourceCreateOrReplaceOperation()

in packages/extensions/openapi-to-typespec/src/transforms/transform-arm-resources.ts [318:414]


function convertResourceCreateOrReplaceOperation(
  resourceMetadata: ArmResource,
  operations: Record<string, Operation>,
): TspArmResourceOperation[] {
  if (resourceMetadata.CreateOperation) {
    const operation = resourceMetadata.CreateOperation;
    const swaggerOperation = operations[operation.OperationID];
    const isLongRunning = swaggerOperation.extensions?.["x-ms-long-running-operation"] ?? false;
    const armOperation = buildNewArmOperation(
      resourceMetadata,
      operation,
      swaggerOperation,
      isLongRunning ? "ArmResourceCreateOrReplaceAsync" : "ArmResourceCreateOrReplaceSync",
    );

    const bodyParam = swaggerOperation.requests?.[0].parameters?.find((p) => p.protocol.http?.in === "body");
    if (!bodyParam) {
      armOperation.fixMe = [
        "// FIXME: (ArmResourceCreateOrReplace): ArmResourceCreateOrReplaceAsync/ArmResourceCreateOrReplaceSync should have a body parameter.",
      ];
    }

    const finalStateVia =
      swaggerOperation.extensions?.["x-ms-long-running-operation-options"]?.["final-state-via"] ?? "location";
    armOperation.lroHeaders = isLongRunning && finalStateVia === "location" ? "Location" : undefined;

    buildBodyDecorator(bodyParam, armOperation, resourceMetadata, "resource", "Resource create parameters.");

    const asyncNames: NamesOfResponseTemplate = {
      _200Name: "ArmResourceUpdatedResponse",
      _200NameNoBody: "OkResponse",
      _201Name: "ArmResourceCreatedResponse",
      _201NameNoBody: "CreatedResponse",
      _202Name: "ArmAcceptedLroResponse",
      _202NameNoBody: "ArmAcceptedLroResponse",
      _204Name: "ArmNoContentResponse",
    };
    const syncNames: NamesOfResponseTemplate = {
      _200Name: "ArmResourceUpdatedResponse",
      _200NameNoBody: "OkResponse",
      _201Name: "ArmResourceCreatedSyncResponse",
      _201NameNoBody: "CreatedResponse",
      _202Name: "AcceptedResponse",
      _202NameNoBody: "AcceptedResponse",
      _204Name: "ArmNoContentResponse",
    };
    let responses: TypespecTemplateModel[] = isLongRunning
      ? getTemplateResponses(swaggerOperation, asyncNames)
      : getTemplateResponses(swaggerOperation, syncNames);
    const templateAsyncResponses: TypespecTemplateModel[] = [
      {
        kind: "template",
        name: asyncNames._200Name,
        arguments: [{ kind: "object", name: resourceMetadata.SwaggerModelName }],
      },
      {
        kind: "template",
        name: asyncNames._201Name,
        arguments: [{ kind: "object", name: resourceMetadata.SwaggerModelName }],
      },
    ];
    const templateSyncResponses: TypespecTemplateModel[] = [
      {
        kind: "template",
        name: syncNames._200Name,
        arguments: [{ kind: "object", name: resourceMetadata.SwaggerModelName }],
      },
      {
        kind: "template",
        name: syncNames._201Name,
        arguments: [{ kind: "object", name: resourceMetadata.SwaggerModelName }],
      },
    ];
    if (isLongRunning && isSameResponses(responses, templateAsyncResponses)) responses = [];
    if (!isLongRunning && isSameResponses(responses, templateSyncResponses)) responses = [];
    if (responses.length > 0) armOperation.response = responses;
    if (armOperation.lroHeaders && responses) {
      let _201Response = responses.find((r) => r.name === asyncNames._201Name);
      if (_201Response) {
        _201Response.arguments!.push({
          kind: "object",
          name: "ArmLroLocationHeader & Azure.Core.Foundations.RetryAfterHeader",
        }); //TO-DO: do it in a better way
        armOperation.lroHeaders = undefined;
      }

      _201Response = responses.find((r) => r.name === syncNames._201NameNoBody);
      if (_201Response) {
        _201Response.additionalTemplateModel = "ArmLroLocationHeader & Azure.Core.Foundations.RetryAfterHeader";
      }
    }

    buildSuppressionsForArmOperation(armOperation, asyncNames, syncNames);
    return [armOperation as TspArmResourceLifeCycleOperation];
  }
  return [];
}