blob: f0ba4a2fbdefb7cfd528a9adf7769d93090d11c8 [file] [log] [blame] [edit]
// Copyright 2022 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:convert';
import 'package:json_annotation/json_annotation.dart';
part 'auto_submit_query_result.g.dart';
/// The classes in this file are used to serialize/deserialize graphql results.
/// Using classes rather than complex maps improves the readability of the code
/// and makes possible to define an extensible interface for the validations.
@JsonSerializable()
class Author {
Author({
this.login,
});
final String? login;
factory Author.fromJson(Map<String, dynamic> json) => _$AuthorFromJson(json);
Map<String, dynamic> toJson() => _$AuthorToJson(this);
}
@JsonSerializable()
class ReviewNode {
ReviewNode({
this.author,
this.authorAssociation,
this.state,
});
final Author? author;
@JsonKey(name: 'authorAssociation')
final String? authorAssociation;
final String? state;
factory ReviewNode.fromJson(Map<String, dynamic> json) => _$ReviewNodeFromJson(json);
Map<String, dynamic> toJson() => _$ReviewNodeToJson(this);
}
@JsonSerializable()
class Reviews {
Reviews({this.nodes});
List<ReviewNode>? nodes;
factory Reviews.fromJson(Map<String, dynamic> json) => _$ReviewsFromJson(json);
Map<String, dynamic> toJson() => _$ReviewsToJson(this);
}
@JsonSerializable()
class CommitNode {
CommitNode({this.commit});
Commit? commit;
factory CommitNode.fromJson(Map<String, dynamic> json) => _$CommitNodeFromJson(json);
Map<String, dynamic> toJson() => _$CommitNodeToJson(this);
}
@JsonSerializable()
class Commits {
Commits({this.nodes});
List<CommitNode>? nodes;
factory Commits.fromJson(Map<String, dynamic> json) => _$CommitsFromJson(json);
Map<String, dynamic> toJson() => _$CommitsToJson(this);
}
enum MergeableState {
CONFLICTING,
MERGEABLE,
UNKNOWN,
}
@JsonSerializable()
class ContextNode {
ContextNode({
this.createdAt,
this.context,
this.state,
this.targetUrl,
});
@JsonKey(name: 'createdAt')
DateTime? createdAt;
String? context;
String? state;
@JsonKey(name: 'targetUrl')
String? targetUrl;
factory ContextNode.fromJson(Map<String, dynamic> json) => _$ContextNodeFromJson(json);
Map<String, dynamic> toJson() => _$ContextNodeToJson(this);
@override
String toString() => jsonEncode(_$ContextNodeToJson(this));
}
@JsonSerializable()
class Status {
Status({this.contexts});
List<ContextNode>? contexts;
factory Status.fromJson(Map<String, dynamic> json) => _$StatusFromJson(json);
Map<String, dynamic> toJson() => _$StatusToJson(this);
}
@JsonSerializable()
class Commit {
Commit({
this.abbreviatedOid,
this.oid,
this.committedDate,
this.pushedDate,
this.status,
});
@JsonKey(name: 'abbreviatedOid')
final String? abbreviatedOid;
final String? oid;
@JsonKey(name: 'committedDate')
final DateTime? committedDate;
@JsonKey(name: 'pushedDate')
final DateTime? pushedDate;
final Status? status;
factory Commit.fromJson(Map<String, dynamic> json) => _$CommitFromJson(json);
Map<String, dynamic> toJson() => _$CommitToJson(this);
}
@JsonSerializable(fieldRename: FieldRename.none)
class PullRequest {
PullRequest({
this.author,
this.authorAssociation,
this.id,
this.title,
this.body,
this.reviews,
this.commits,
this.number,
this.mergeable,
this.isInMergeQueue = false,
});
final Author? author;
final String? authorAssociation;
final String? id;
final String? title;
final String? body;
final Reviews? reviews;
final Commits? commits;
final int? number;
// https://docs.github.com/en/graphql/reference/enums#mergeablestate
final MergeableState? mergeable;
final bool isInMergeQueue;
factory PullRequest.fromJson(Map<String, dynamic> json) => _$PullRequestFromJson(json);
Map<String, dynamic> toJson() => _$PullRequestToJson(this);
}
@JsonSerializable()
class Repository {
Repository({
this.pullRequest,
});
@JsonKey(name: 'pullRequest')
PullRequest? pullRequest;
factory Repository.fromJson(Map<String, dynamic> json) => _$RepositoryFromJson(json);
Map<String, dynamic> toJson() => _$RepositoryToJson(this);
}
// TODO(yjbanov): rename to AutosubmitQueryResult to avoid name clash with graphql.dart/QueryResult
@JsonSerializable()
class QueryResult {
QueryResult({
this.repository,
});
Repository? repository;
factory QueryResult.fromJson(Map<String, dynamic> json) => _$QueryResultFromJson(json);
Map<String, dynamic> toJson() => _$QueryResultToJson(this);
}
/// The reason for this funky naming scheme can be blamed on GitHub.
///
/// See: https://docs.github.com/en/graphql/reference/mutations#revertpullrequest
/// The enclosing object is called RevertPullRequest and has a nested field also
/// called RevertPullRequest.
@JsonSerializable()
class RevertPullRequest {
RevertPullRequest({
this.clientMutationId,
this.pullRequest,
this.revertPullRequest,
});
@JsonKey(name: 'clientMutationId')
String? clientMutationId;
@JsonKey(name: 'pullRequest')
PullRequest? pullRequest;
@JsonKey(name: 'revertPullRequest')
PullRequest? revertPullRequest;
factory RevertPullRequest.fromJson(Map<String, dynamic> json) => _$RevertPullRequestFromJson(json);
Map<String, dynamic> toJson() => _$RevertPullRequestToJson(this);
}
/// This is needed since the data we get is buried within this outer object and
/// to simplify the deserialization need this wrapper.
///
/// The return data is nested as such:
/// "data": {
/// "revertPullRequest": {
/// "clientMutationId": xxx,
/// "pullRequest": { ... },
/// "revertPullRequest": { ... }
/// }
/// }
@JsonSerializable()
class RevertPullRequestData {
RevertPullRequestData({this.revertPullRequest});
@JsonKey(name: 'revertPullRequest')
RevertPullRequest? revertPullRequest;
factory RevertPullRequestData.fromJson(Map<String, dynamic> json) => _$RevertPullRequestDataFromJson(json);
Map<String, dynamic> toJson() => _$RevertPullRequestDataToJson(this);
}