Skip to content

Commit b774221

Browse files
committed
api: Add routes subscribeToChannel, unsubscribeFromChannel
1 parent 766f071 commit b774221

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

lib/api/route/channels.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,42 @@ import '../core.dart';
44
import '../model/model.dart';
55
part 'channels.g.dart';
66

7+
/// https://zulip.com/api/subscribe
8+
///
9+
/// [subscriptions] is a list of channel names.
10+
/// (This is one of the few remaining areas where the Zulip API hasn't migrated
11+
/// to using IDs.)
12+
Future<void> subscribeToChannel(ApiConnection connection, {
13+
// TODO(server-future): This should use a stream ID, not stream name.
14+
// (Keep dartdoc up to date.)
15+
// Server issue: https://github.com/zulip/zulip/issues/10744
16+
required List<String> subscriptions,
17+
List<int>? principals,
18+
}) {
19+
return connection.post('subscribeToChannel', (_) {}, 'users/me/subscriptions', {
20+
'subscriptions': subscriptions.map((name) => {'name': name}).toList(),
21+
if (principals != null) 'principals': principals,
22+
});
23+
}
24+
25+
/// https://zulip.com/api/unsubscribe
26+
///
27+
/// [subscriptions] is a list of channel names.
28+
/// (This is one of the few remaining areas where the Zulip API hasn't migrated
29+
/// to using IDs.)
30+
Future<void> unsubscribeFromChannel(ApiConnection connection, {
31+
// TODO(server-future): This should use a stream ID, not stream name.
32+
// (Keep dartdoc up to date.)
33+
// Server issue: https://github.com/zulip/zulip/issues/10744
34+
required List<String> subscriptions,
35+
List<int>? principals,
36+
}) {
37+
return connection.delete('unsubscribeFromChannel', (_) {}, 'users/me/subscriptions', {
38+
'subscriptions': subscriptions,
39+
if (principals != null) 'principals': principals,
40+
});
41+
}
42+
743
/// https://zulip.com/api/get-stream-topics
844
Future<GetStreamTopicsResult> getStreamTopics(ApiConnection connection, {
945
required int streamId,

test/api/route/channels_test.dart

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:convert';
2+
13
import 'package:checks/checks.dart';
24
import 'package:http/http.dart' as http;
35
import 'package:flutter_test/flutter_test.dart';
@@ -8,6 +10,38 @@ import '../../stdlib_checks.dart';
810
import '../fake_api.dart';
911

1012
void main() {
13+
test('smoke subscribeToChannel', () {
14+
return FakeApiConnection.with_((connection) async {
15+
connection.prepare(json: {});
16+
await subscribeToChannel(connection,
17+
subscriptions: ['foo'],
18+
principals: [1]);
19+
check(connection.takeRequests()).single.isA<http.Request>()
20+
..method.equals('POST')
21+
..url.path.equals('/api/v1/users/me/subscriptions')
22+
..bodyFields.deepEquals({
23+
'subscriptions': jsonEncode([{'name': 'foo'}]),
24+
'principals': jsonEncode([1]),
25+
});
26+
});
27+
});
28+
29+
test('smoke unsubscribeFromChannel', () {
30+
return FakeApiConnection.with_((connection) async {
31+
connection.prepare(json: {});
32+
await unsubscribeFromChannel(connection,
33+
subscriptions: ['foo'],
34+
principals: [1]);
35+
check(connection.takeRequests()).single.isA<http.Request>()
36+
..method.equals('DELETE')
37+
..url.path.equals('/api/v1/users/me/subscriptions')
38+
..bodyFields.deepEquals({
39+
'subscriptions': jsonEncode(['foo']),
40+
'principals': jsonEncode([1]),
41+
});
42+
});
43+
});
44+
1145
test('smoke updateUserTopic', () {
1246
return FakeApiConnection.with_((connection) async {
1347
connection.prepare(json: {});

0 commit comments

Comments
 (0)