amplify-codegen icon indicating copy to clipboard operation
amplify-codegen copied to clipboard

Generated dart client code has a type error

Open sisygoboom opened this issue 1 year ago • 1 comments

Environment information

System:
  OS: Windows 10 10.0.19045
  CPU: (12) x64 AMD Ryzen 5 3600 6-Core Processor
  Memory: 11.76 GB / 31.93 GB
Binaries:
  Node: 18.18.2 - C:\Program Files\nodejs\node.EXE
  Yarn: undefined - undefined
  npm: 9.8.1 - C:\Program Files\nodejs\npm.CMD
  pnpm: 8.10.5 - C:\Program Files\nodejs\pnpm.CMD
NPM Packages:
  @aws-amplify/auth-construct: 1.3.0
  @aws-amplify/backend: 1.2.0
  @aws-amplify/backend-auth: 1.1.3
  @aws-amplify/backend-cli: 1.2.5
  @aws-amplify/backend-data: 1.1.3
  @aws-amplify/backend-deployer: 1.1.0
  @aws-amplify/backend-function: 1.3.4
  @aws-amplify/backend-output-schemas: 1.2.0
  @aws-amplify/backend-output-storage: 1.1.1
  @aws-amplify/backend-secret: 1.1.0
  @aws-amplify/backend-storage: 1.1.2
  @aws-amplify/cli-core: 1.1.2
  @aws-amplify/client-config: 1.3.0
  @aws-amplify/deployed-backend-client: 1.4.0
  @aws-amplify/form-generator: 1.0.1
  @aws-amplify/model-generator: 1.0.5
  @aws-amplify/platform-core: 1.0.7
  @aws-amplify/plugin-types: 1.2.1
  @aws-amplify/sandbox: 1.2.0
  @aws-amplify/schema-generator: 1.2.1
  aws-amplify: 6.5.3
  aws-cdk: 2.155.0
  aws-cdk-lib: 2.155.0
  typescript: 5.5.4
AWS environment variables:
  AWS_NODEJS_CONNECTION_REUSE_ENABLED = 1
  AWS_SDK_LOAD_CONFIG = 1
  AWS_STS_REGIONAL_ENDPOINTS = regional
No CDK environment variables

Describe the bug

when generating client code for dart, using this command:

npx ampx generate graphql-client-code --format modelgen --model-target dart --out ./lib/models

The generated code consistently has this error:

Missing concrete implementation of 'ModelProviderInterface.getModelTypeByModelName'.
Try implementing the missing method, or make the class abstract.

My theory is its because I haven't declared any models in my data resource as I've used mongo and single table design. This is not the standard way and doesn't follow the documentation but is perfectly valid.

ModelProvider.dart:

/*
* Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
*  http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/

// NOTE: This file is generated and may not follow lint rules defined in your app
// Generated files can be excluded from analysis in analysis_options.yaml
// For more info, see: https://dart.dev/guides/language/analysis-options#excluding-code-from-analysis

// ignore_for_file: public_member_api_docs, annotate_overrides, dead_code, dead_codepublic_member_api_docs, depend_on_referenced_packages, file_names, library_private_types_in_public_api, no_leading_underscores_for_library_prefixes, no_leading_underscores_for_local_identifiers, non_constant_identifier_names, null_check_on_nullable_type_parameter, override_on_non_overriding_member, prefer_adjacent_string_concatenation, prefer_const_constructors, prefer_if_null_operators, prefer_interpolation_to_compose_strings, slash_for_doc_comments, sort_child_properties_last, unnecessary_const, unnecessary_constructor_name, unnecessary_late, unnecessary_new, unnecessary_null_aware_assignments, unnecessary_nullable_for_final_variable_declarations, unnecessary_string_interpolations, use_build_context_synchronously

import 'package:amplify_core/amplify_core.dart' as amplify_core;
import 'Conversation.dart';
import 'Message.dart';
import 'MongoUser.dart';
import 'MongoUserLocation.dart';
import 'ProfileMedia.dart';
import 'UserProfile.dart';

export 'Conversation.dart';
export 'Message.dart';
export 'MongoUser.dart';
export 'MongoUserLocation.dart';
export 'ProfileMedia.dart';
export 'ProfileMediaType.dart';
export 'UserProfile.dart';

class ModelProvider implements amplify_core.ModelProviderInterface {
  @override
  String version = "65c55a040a40c5530448407cc0ee4f94";
  @override
  List<amplify_core.ModelSchema> modelSchemas = [];
  @override
  List<amplify_core.ModelSchema> customTypeSchemas = [Conversation.schema, Message.schema, MongoUser.schema, MongoUserLocation.schema, ProfileMedia.schema, UserProfile.schema];
  static final ModelProvider _instance = ModelProvider();

  static ModelProvider get instance => _instance;
}


class ModelFieldValue<T> {
  const ModelFieldValue.value(this.value);

  final T value;
}

Reproduction steps

For more context, here is my data/resource.ts :

import { type ClientSchema, a, defineData } from '@aws-amplify/backend';
import { getMessagesByConversationId } from '../functions/getMessagesByConversationId/resource';
import { sendMessage } from '../functions/sendMessage/resource';
import { swipe } from '../functions/swipe/resource';
import { getConversationsByUserId } from '../functions/getConversationsByUserId/resource';
import { updateLocation } from '../functions/updateLocation/resource';
import { getMatchableProfiles } from '../functions/getMatchableProfiles/resource';
import { updateProfile } from '../functions/updateProfile/resource';
import { getProfile } from '../functions/getProfile/resource';

const schema = a.schema({
  Message: a.customType({
    message: a.string(),
    userId: a.string(),
    timestamp: a.timestamp(),
  }),
  Conversation: a.customType({
    latestMessage: a.string(),
    lastUpdated: a.timestamp(),
    members: a.json().required(),  // Members stored as JSON
  }),
  MongoUser: a.customType({
    name: a.string().required(),
    location: a.customType({
      type: a.string().required(),
      coordinates: a.float().array().required(),
    }),
    birthdate: a.integer().required(),
    media: a.ref('ProfileMedia').array().required(),
  }),
  ProfileMedia: a.customType({
    url: a.string(),
    type: a.enum(['picture', 'video', 'audio', 'text']),
    prompt: a.string(),
    body: a.string(),
  }),
  UserProfile: a.customType({
    name: a.string(),
    distance: a.float(),
    userId: a.string(),
    age: a.integer(),
    media: a.ref('ProfileMedia').array(),
  }),
  getMessagesByConversationId: a
    .query()
    .arguments({
      conversationId: a.string().required(),
      lastKey: a.string(),
    })
    .returns(a.ref('Message').array())
    .handler(a.handler.function(getMessagesByConversationId))
    .authorization(allow => [allow.publicApiKey()]),
  sendMessage: a
    .mutation()
    .arguments({
      userId: a.string().required(),
      message: a.string().required(),
      conversationId: a.string().required(),
      recipients: a.string().array().required()
    })
    .returns(a.ref('Message'))
    .handler(a.handler.function(sendMessage))
    .authorization(allow => [allow.publicApiKey()]),
  swipe: a
    .mutation()
    .arguments({
      userId: a.string().required(),
      targetUserId: a.string().required(),
      swipeRight: a.boolean().required(),
    })
    .returns(a.ref('Conversation'))
    .handler(a.handler.function(swipe))
    .authorization(allow => [allow.publicApiKey()]),
  getConversationsByUserId: a
    .query()
    .arguments({
      userId: a.string().required(),
    })
    .returns(a.ref('Conversation').array())
    .handler(a.handler.function(getConversationsByUserId))
    .authorization(allow => [allow.publicApiKey()]),
  updateLocation: a
    .mutation()
    .arguments({
      userId: a.string().required(),
      latitude: a.float().required(),
      longitude: a.float().required(),
    })
    .returns(a.string())
    .handler(a.handler.function(updateLocation))
    .authorization(allow => [allow.publicApiKey()]),
  getMatchableProfiles: a
    .query()
    .arguments({
      userId: a.string().required(),
      latitude: a.float().required(),
      longitude: a.float().required(),
      kmRadius: a.float().required(),
    })
    .returns(a.ref('UserProfile').array())
    .handler(a.handler.function(getMatchableProfiles))
    .authorization(allow => [allow.publicApiKey()]),
  updateProfile: a
    .mutation()
    .arguments({
      userId: a.string().required(),
      media: a.json().array(),
    })
    .returns(a.ref('UserProfile'))
    .handler(a.handler.function(updateProfile))
    .authorization(allow => [allow.publicApiKey()]),
  getProfile: a
    .query()
    .arguments({
      userId: a.string().required(),
    })
    .returns(a.ref('UserProfile'))
    .handler(a.handler.function(getProfile))
    .authorization(allow => [allow.publicApiKey()]),
});

export type Schema = ClientSchema<typeof schema>;

export const data = defineData({
  schema,
  authorizationModes: {
    defaultAuthorizationMode: 'apiKey',
    apiKeyAuthorizationMode: {
      expiresInDays: 30,
    },
  },
  functions: {
    getMessagesByConversationId,
    sendMessage,
    swipe,
    getConversationsByUserId,
    updateLocation,
    getMatchableProfiles,
    updateProfile,
    getProfile
  },
});

sisygoboom avatar Sep 11 '24 20:09 sisygoboom

Hey, thanks for raising this! I'm going to transfer this over to our codegen repository for better assistance.

ykethan avatar Sep 12 '24 14:09 ykethan

I wasn't able to reproduce this error. Your codegen packages may be out of date. Can you run the following and share the results?

npm list @aws-amplify/graphql-generator @aws-amplify/appsync-modelgen-plugin

npm update should bring you to the latest available version.

dpilch avatar Oct 04 '24 14:10 dpilch

Hey @sisygoboom 👋 , This issue is being closed due to inactivity. If you are still experiencing the same problem and need further assistance, please feel free to leave a comment. This will enable us to reopen the issue and provide you with the necessary support.

AnilMaktala avatar Jan 15 '25 19:01 AnilMaktala

This issue is now closed. Comments on closed issues are hard for our team to see. If you need more assistance, please open a new issue that references this one.

github-actions[bot] avatar Jan 15 '25 19:01 github-actions[bot]