Skip to content

Commit

Permalink
feat(gogs): setup (#170)
Browse files Browse the repository at this point in the history
closes #117
  • Loading branch information
shreyas1599 committed Jan 23, 2021
1 parent cb9bc89 commit 4f1e044
Show file tree
Hide file tree
Showing 18 changed files with 1,165 additions and 1 deletion.
17 changes: 17 additions & 0 deletions lib/home.dart
Expand Up @@ -8,6 +8,8 @@ import 'package:git_touch/screens/bb_teams.dart';
import 'package:git_touch/screens/bb_user.dart';
import 'package:git_touch/screens/ge_user.dart';
import 'package:git_touch/screens/gl_search.dart';
import 'package:git_touch/screens/go_search.dart';
import 'package:git_touch/screens/go_user.dart';
import 'package:git_touch/screens/gt_orgs.dart';
import 'package:git_touch/screens/gt_user.dart';
import 'package:git_touch/screens/gl_explore.dart';
Expand Down Expand Up @@ -98,6 +100,13 @@ class _HomeState extends State<Home> {
return GeUserScreen(auth.activeAccount.login, isViewer: true);
}
break;
case PlatformType.gogs:
switch (index) {
case 0:
return GoSearchScreen();
case 1:
return GoUserScreen(auth.activeAccount.login, isViewer: true);
}
}
}

Expand Down Expand Up @@ -206,6 +215,14 @@ class _HomeState extends State<Home> {
icon: Icon(Icons.person), label: S.of(context).me),
];
break;
case PlatformType.gogs:
navigationItems = [
BottomNavigationBarItem(
icon: Icon(Icons.search), label: S.of(context).search),
BottomNavigationBarItem(
icon: Icon(Icons.person), label: S.of(context).me),
];
break;
}

switch (theme.theme) {
Expand Down
5 changes: 4 additions & 1 deletion lib/main.dart
Expand Up @@ -66,7 +66,10 @@ void main() async {
themeModel.router.define(GiteeRouter.prefix + screen.path,
handler: Handler(handlerFunc: screen.handler));
});

GogsRouter.routes.forEach((screen) {
themeModel.router.define(GogsRouter.prefix + screen.path,
handler: Handler(handlerFunc: screen.handler));
});
// To match status bar color to app bar color
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
Expand Down
105 changes: 105 additions & 0 deletions lib/models/auth.dart
Expand Up @@ -20,6 +20,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import '../utils/utils.dart';
import 'account.dart';
import 'gitlab.dart';
import 'gogs.dart';

const clientId = 'df930d7d2e219f26142a';

Expand All @@ -29,6 +30,7 @@ class PlatformType {
static const bitbucket = 'bitbucket';
static const gitea = 'gitea';
static const gitee = 'gitee';
static const gogs = 'gogs';
}

class DataWithPage<T> {
Expand Down Expand Up @@ -320,6 +322,109 @@ class AuthModel with ChangeNotifier {
);
}

Future loginToGogs(String domain, String token) async {
domain = domain.trim();
token = token.trim();
try {
loading = true;
notifyListeners();
final res = await http.get('$domain/api/v1/user',
headers: {'Authorization': 'token $token'});
final info = json.decode(res.body);
if (info['message'] != null) {
throw info['message'];
}
final user = GogsUser.fromJson(info);

await _addAccount(Account(
platform: PlatformType.gogs,
domain: domain,
token: token,
login: user.username,
avatarUrl: user.avatarUrl,
));
} finally {
loading = false;
notifyListeners();
}
}

// TODO: refactor
Future fetchGogs(
String p, {
requestType = 'GET',
Map<String, dynamic> body = const {},
}) async {
http.Response res;
Map<String, String> headers = {
'Authorization': 'token $token',
HttpHeaders.contentTypeHeader: 'application/json'
};
switch (requestType) {
case 'DELETE':
{
await http.delete(
'${activeAccount.domain}/api/v1$p',
headers: headers,
);
break;
}
case 'POST':
{
res = await http.post(
'${activeAccount.domain}/api/v1$p',
headers: headers,
body: jsonEncode(body),
);
break;
}
case 'PATCH':
{
res = await http.patch(
'${activeAccount.domain}/api/v1$p',
headers: headers,
body: jsonEncode(body),
);
break;
}
default:
{
res = await http.get('${activeAccount.domain}/api/v1$p',
headers: headers);
break;
}
}
if (requestType != 'DELETE') {
final info = json.decode(utf8.decode(res.bodyBytes));
return info;
}
return;
}

Future<DataWithPage> fetchGogsWithPage(String path,
{int page, int limit}) async {
page = page ?? 1;
limit = limit ?? pageSize;

var uri = Uri.parse('${activeAccount.domain}/api/v1$path');
uri = uri.replace(
queryParameters: {
'page': page.toString(),
'limit': limit.toString(),
...uri.queryParameters,
},
);
final res = await http.get(uri, headers: {'Authorization': 'token $token'});
final info = json.decode(utf8.decode(res.bodyBytes));

return DataWithPage(
data: info,
cursor: page + 1,
hasMore: info is List && info.length > 0,
total: int.tryParse(res.headers['x-total-count'] ?? ''),
);
}

Future fetchGitee(
String p, {
requestType = 'GET',
Expand Down
133 changes: 133 additions & 0 deletions lib/models/gogs.dart
@@ -0,0 +1,133 @@
import 'package:json_annotation/json_annotation.dart';

part 'gogs.g.dart';

@JsonSerializable(fieldRename: FieldRename.snake)
class GogsUser {
int id;
String username;
String fullName;
String avatarUrl;
String email;
GogsUser();
factory GogsUser.fromJson(Map<String, dynamic> json) =>
_$GogsUserFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GogsRepository {
int id;
String fullName;
bool private;
GogsUser owner;
String htmlUrl;
String description;
String defaultBranch;
DateTime createdAt;
DateTime updatedAt;
int starsCount;
int forksCount;
String website;
int watchersCount;
GogsRepository();
factory GogsRepository.fromJson(Map<String, dynamic> json) =>
_$GogsRepositoryFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GogsOrg {
int id;
String username;
String fullName;
String avatarUrl;
String description;
String location;
String website;
GogsOrg();
factory GogsOrg.fromJson(Map<String, dynamic> json) =>
_$GogsOrgFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GogsTree {
String type;
String name;
String path;
int size;
String downloadUrl;
GogsTree();
factory GogsTree.fromJson(Map<String, dynamic> json) =>
_$GogsTreeFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GogsBlob extends GogsTree {
String content;
GogsBlob();
factory GogsBlob.fromJson(Map<String, dynamic> json) =>
_$GogsBlobFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GogsBranch {
String name;
GogsBranch();
factory GogsBranch.fromJson(Map<String, dynamic> json) =>
_$GogsBranchFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GogsCommit {
GogsUser author;
GogsCommitDetail commit;
String sha;
String htmlUrl;
GogsCommit();
factory GogsCommit.fromJson(Map<String, dynamic> json) =>
_$GogsCommitFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GogsCommitDetail {
String message;
GogsCommitAuthor author;
GogsCommitAuthor committer;
GogsCommitDetail();
factory GogsCommitDetail.fromJson(Map<String, dynamic> json) =>
_$GogsCommitDetailFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GogsCommitAuthor {
String name;
String email;
DateTime date;
GogsCommitAuthor();
factory GogsCommitAuthor.fromJson(Map<String, dynamic> json) =>
_$GogsCommitAuthorFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GogsIssue {
int number;
String state;
String title;
String body;
GogsUser user;
List<GogsLabel> labels;
DateTime createdAt;
DateTime updatedAt;
int comments;
GogsIssue();
factory GogsIssue.fromJson(Map<String, dynamic> json) =>
_$GogsIssueFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GogsLabel {
String name;
String color;
GogsLabel();
factory GogsLabel.fromJson(Map<String, dynamic> json) =>
_$GogsLabelFromJson(json);
}

0 comments on commit 4f1e044

Please sign in to comment.