Skip to content

Commit 28663ef

Browse files
committed
Fix: stop unnecessarily removing fields from belongsTo models
1 parent 8e59511 commit 28663ef

File tree

5 files changed

+62
-20
lines changed

5 files changed

+62
-20
lines changed

packages/appsync-modelgen-plugin/src/__tests__/utils/process-connections-v2.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ describe('GraphQL V2 process connections tests', () => {
403403
expect(connectionInfo).toBeDefined();
404404
expect(connectionInfo.kind).toEqual(CodeGenConnectionType.BELONGS_TO);
405405
expect(connectionInfo.connectedModel).toEqual(belongsToModelMap.Project2);
406-
expect(connectionInfo.isConnectingFieldAutoCreated).toEqual(true);
406+
expect(connectionInfo.isConnectingFieldAutoCreated).toEqual(false);
407407
});
408408
});
409409

@@ -546,7 +546,7 @@ describe('GraphQL V2 process connections tests', () => {
546546
expect(connectionInfo).toBeDefined();
547547
expect(connectionInfo.kind).toEqual(CodeGenConnectionType.BELONGS_TO);
548548
expect(connectionInfo.connectedModel).toEqual(hasManyModelMap.Blog);
549-
expect(connectionInfo.isConnectingFieldAutoCreated).toEqual(true);
549+
expect(connectionInfo.isConnectingFieldAutoCreated).toEqual(false);
550550
});
551551

552552
it('Should detect second belongsTo', () => {
@@ -555,7 +555,7 @@ describe('GraphQL V2 process connections tests', () => {
555555
expect(connectionInfo).toBeDefined();
556556
expect(connectionInfo.kind).toEqual(CodeGenConnectionType.BELONGS_TO);
557557
expect(connectionInfo.connectedModel).toEqual(hasManyModelMap.Post);
558-
expect(connectionInfo.isConnectingFieldAutoCreated).toEqual(true);
558+
expect(connectionInfo.isConnectingFieldAutoCreated).toEqual(false);
559559
});
560560
});
561561
});

packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-dart-visitor.test.ts.snap

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,6 +1279,8 @@ class _TagModelType extends ModelType<Tag> {
12791279
class PostTags extends Model {
12801280
static const classType = const _PostTagsModelType();
12811281
final String id;
1282+
final String postID;
1283+
final String tagID;
12821284
final Post post;
12831285
final Tag tag;
12841286

@@ -1291,11 +1293,24 @@ class PostTags extends Model {
12911293
}
12921294

12931295
const PostTags._internal(
1294-
{@required this.id, @required this.post, @required this.tag});
1296+
{@required this.id,
1297+
@required this.postID,
1298+
@required this.tagID,
1299+
@required this.post,
1300+
@required this.tag});
12951301

1296-
factory PostTags({String id, @required Post post, @required Tag tag}) {
1302+
factory PostTags(
1303+
{String id,
1304+
@required String postID,
1305+
@required String tagID,
1306+
@required Post post,
1307+
@required Tag tag}) {
12971308
return PostTags._internal(
1298-
id: id == null ? UUID.getUUID() : id, post: post, tag: tag);
1309+
id: id == null ? UUID.getUUID() : id,
1310+
postID: postID,
1311+
tagID: tagID,
1312+
post: post,
1313+
tag: tag);
12991314
}
13001315

13011316
bool equals(Object other) {
@@ -1307,6 +1322,8 @@ class PostTags extends Model {
13071322
if (identical(other, this)) return true;
13081323
return other is PostTags &&
13091324
id == other.id &&
1325+
postID == other.postID &&
1326+
tagID == other.tagID &&
13101327
post == other.post &&
13111328
tag == other.tag;
13121329
}
@@ -1320,31 +1337,47 @@ class PostTags extends Model {
13201337

13211338
buffer.write(\\"PostTags {\\");
13221339
buffer.write(\\"id=\\" + \\"$id\\" + \\", \\");
1340+
buffer.write(\\"postID=\\" + \\"$postID\\" + \\", \\");
1341+
buffer.write(\\"tagID=\\" + \\"$tagID\\" + \\", \\");
13231342
buffer.write(\\"post=\\" + (post != null ? post.toString() : \\"null\\") + \\", \\");
13241343
buffer.write(\\"tag=\\" + (tag != null ? tag.toString() : \\"null\\"));
13251344
buffer.write(\\"}\\");
13261345

13271346
return buffer.toString();
13281347
}
13291348

1330-
PostTags copyWith({String id, Post post, Tag tag}) {
1349+
PostTags copyWith(
1350+
{String id, String postID, String tagID, Post post, Tag tag}) {
13311351
return PostTags(
1332-
id: id ?? this.id, post: post ?? this.post, tag: tag ?? this.tag);
1352+
id: id ?? this.id,
1353+
postID: postID ?? this.postID,
1354+
tagID: tagID ?? this.tagID,
1355+
post: post ?? this.post,
1356+
tag: tag ?? this.tag);
13331357
}
13341358

13351359
PostTags.fromJson(Map<String, dynamic> json)
13361360
: id = json['id'],
1361+
postID = json['postID'],
1362+
tagID = json['tagID'],
13371363
post = json['post'] != null
13381364
? Post.fromJson(new Map<String, dynamic>.from(json['post']))
13391365
: null,
13401366
tag = json['tag'] != null
13411367
? Tag.fromJson(new Map<String, dynamic>.from(json['tag']))
13421368
: null;
13431369

1344-
Map<String, dynamic> toJson() =>
1345-
{'id': id, 'post': post?.toJson(), 'tag': tag?.toJson()};
1370+
Map<String, dynamic> toJson() => {
1371+
'id': id,
1372+
'postID': postID,
1373+
'tagID': tagID,
1374+
'post': post?.toJson(),
1375+
'tag': tag?.toJson()
1376+
};
13461377

13471378
static final QueryField ID = QueryField(fieldName: \\"postTags.id\\");
1379+
static final QueryField POSTID = QueryField(fieldName: \\"postID\\");
1380+
static final QueryField TAGID = QueryField(fieldName: \\"tagID\\");
13481381
static final QueryField POST = QueryField(
13491382
fieldName: \\"post\\",
13501383
fieldType: ModelFieldType(ModelFieldTypeEnum.model,
@@ -1360,6 +1393,16 @@ class PostTags extends Model {
13601393

13611394
modelSchemaDefinition.addField(ModelFieldDefinition.id());
13621395

1396+
modelSchemaDefinition.addField(ModelFieldDefinition.field(
1397+
key: PostTags.POSTID,
1398+
isRequired: true,
1399+
ofType: ModelFieldType(ModelFieldTypeEnum.string)));
1400+
1401+
modelSchemaDefinition.addField(ModelFieldDefinition.field(
1402+
key: PostTags.TAGID,
1403+
isRequired: true,
1404+
ofType: ModelFieldType(ModelFieldTypeEnum.string)));
1405+
13631406
modelSchemaDefinition.addField(ModelFieldDefinition.belongsTo(
13641407
key: PostTags.POST,
13651408
isRequired: true,

packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-visitor.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -833,10 +833,10 @@ describe('AppSyncModelVisitor', () => {
833833
expect(visitor.models.Human.fields[2].directives[0].arguments.fields[0]).toEqual('governmentID');
834834
expect(visitor.models.Human.fields[2].directives[0].arguments.indexName).toEqual('byHuman');
835835
expect(visitor.models.PetFriend).toBeDefined();
836-
expect(visitor.models.PetFriend.fields.length).toEqual(5);
837-
expect(visitor.models.PetFriend.fields[2].directives[0].name).toEqual('belongsTo');
838-
expect(visitor.models.PetFriend.fields[2].directives[0].arguments.fields.length).toEqual(1);
839-
expect(visitor.models.PetFriend.fields[2].directives[0].arguments.fields[0]).toEqual('animalID');
836+
expect(visitor.models.PetFriend.fields.length).toEqual(7);
837+
expect(visitor.models.PetFriend.fields[4].directives[0].name).toEqual('belongsTo');
838+
expect(visitor.models.PetFriend.fields[4].directives[0].arguments.fields.length).toEqual(1);
839+
expect(visitor.models.PetFriend.fields[4].directives[0].arguments.fields[0]).toEqual('animalID');
840840
expect(visitor.models.Animal.fields.length).toEqual(5);
841841
expect(visitor.models.Animal.fields[2].type).toEqual('PetFriend');
842842
expect(visitor.models.Animal.fields[2].directives.length).toEqual(1);
@@ -856,7 +856,7 @@ describe('AppSyncModelVisitor', () => {
856856
expect(visitor.models.ModelA.fields[1].directives[0].arguments.indexName).toEqual('byModelA');
857857

858858
expect(visitor.models.Models).toBeDefined();
859-
expect(visitor.models.Models.fields.length).toEqual(5);
859+
expect(visitor.models.Models.fields.length).toEqual(7);
860860

861861
const modelA = visitor.models.Models.fields.find(f => f.name === 'modelA');
862862
expect(modelA).toBeDefined();

packages/appsync-modelgen-plugin/src/utils/process-belongs-to.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,15 @@ export function processBelongsToConnection(
4545
// track the connection and that field is not part of the selection set
4646
// but if the field are connected using fields argument in connection directive
4747
// we are reusing the field and it should be preserved in selection set
48-
const isConnectingFieldAutoCreated = connectionFields.length === 0;
48+
const otherSideHasMany = otherSideField.isList;
49+
const isConnectingFieldAutoCreated = false;
4950

5051
return {
5152
kind: CodeGenConnectionType.BELONGS_TO,
5253
connectedModel: otherSide,
5354
isConnectingFieldAutoCreated,
54-
targetName: connectionFields[0] || makeConnectionAttributeName(model.name, field.name),
55+
targetName: connectionFields[0] || (otherSideHasMany ? makeConnectionAttributeName(otherSide.name, otherSideField.name) :
56+
makeConnectionAttributeName(model.name, field.name)),
5557
};
5658
}
5759

packages/appsync-modelgen-plugin/src/visitors/appsync-visitor.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -693,9 +693,6 @@ export class AppSyncModelVisitor<
693693
isList: false,
694694
isNullable: field.isNullable,
695695
});
696-
} else if (connectionInfo.targetName !== 'id') {
697-
// Need to remove the field that is targetName
698-
removeFieldFromModel(model, connectionInfo.targetName);
699696
}
700697
field.connectionInfo = connectionInfo;
701698
}

0 commit comments

Comments
 (0)