Skip to content

Commit 96fcae0

Browse files
authored
refactor(llc): improve openapi generation (#5)
* use json_serializable for models * improve API generator with dio * Cleanup generated code * update generated code * added todo * use git dependency for stream_core * Solve basic analysis issues * add ignore coverage on generated models * update stream_core * Add codecov settings * Add some feeds client tests * downgrade build_runner version * Add discriminator files to codecov ignore * Add tests for FeedsClient * Add common models * Add activity data mapping test * make feedsRepository internal
1 parent 5164312 commit 96fcae0

File tree

563 files changed

+33768
-25406
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

563 files changed

+33768
-25406
lines changed

analysis_options.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ analyzer:
1414
todo: ignore
1515
exclude:
1616
# exclude all the generated files
17-
# - packages/*/lib/**/*.*.dart
17+
- packages/*/lib/**/*.g.dart
1818

1919
linter:
2020
rules:
@@ -89,3 +89,7 @@ linter:
8989

9090
# There are situations where we use default in enums on purpose
9191
no_default_cases: false
92+
93+
# Temporarily disabled to find more important issues
94+
public_member_api_docs: false
95+
avoid_print: false

codecov.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
coverage:
2+
status:
3+
project:
4+
default: # default is the status check's name, not default settings
5+
target: auto
6+
threshold: 5
7+
base: auto
8+
patch:
9+
default:
10+
target: 80%

melos.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ command:
1313
environment:
1414
sdk: ^3.6.2
1515
flutter: ">=3.27.4"
16+
dev_dependencies:
17+
build_runner: ^2.4.15
1618

1719
scripts:
1820
postclean:

packages/stream_feeds/build.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
targets:
2+
$default:
3+
builders:
4+
json_serializable:
5+
options:
6+
explicit_to_json: true
7+
field_rename: snake
Lines changed: 62 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import 'dart:async';
22

3+
import 'package:meta/meta.dart';
34
import 'package:rxdart/rxdart.dart';
45
import 'package:stream_core/stream_core.dart';
5-
import 'package:uuid/uuid.dart';
66

77
import '../stream_feeds.dart';
8-
import 'generated/api/api.g.dart' as api;
8+
import 'generated/api/api.dart' as api;
99
import 'repositories.dart';
1010
import 'utils/endpoint_config.dart';
1111
import 'ws/feeds_ws_event.dart';
@@ -14,20 +14,38 @@ class FeedsClient {
1414
FeedsClient({
1515
required this.apiKey,
1616
required this.user,
17-
required this.userToken,
17+
String? userToken,
18+
TokenProvider? userTokenProvider,
1819
this.config = const FeedsConfig(),
19-
this.userTokenProvider,
20-
this.networkMonitor,
21-
}) {
20+
FeedsClientEnvironment environment = const FeedsClientEnvironment(),
21+
}) : assert(
22+
userToken != null || userTokenProvider != null,
23+
'Provide either a user token or a user token provider, or both',
24+
) {
25+
tokenManager = userTokenProvider != null
26+
? TokenManager.provider(
27+
user: user,
28+
provider: userTokenProvider,
29+
token: userToken,
30+
)
31+
: TokenManager.static(user: user, token: userToken ?? '');
32+
33+
// TODO: fill with correct values
34+
final systemEnvironmentManager = SystemEnvironmentManager(
35+
environment: const SystemEnvironment(
36+
sdkName: 'stream-feeds-dart',
37+
sdkIdentifier: 'dart',
38+
sdkVersion: '0.1.0',
39+
),
40+
);
41+
2242
apiClient = api.DefaultApi(
23-
api.ApiClient(
24-
basePath: endpointConfig.baseFeedsUrl,
25-
authentication: _Authentication(
26-
apiKey: apiKey,
27-
user: user,
28-
getToken: () async => userToken,
29-
getConnectionId: () => webSocketClient.connectionId,
30-
),
43+
CoreHttpClient(
44+
apiKey,
45+
systemEnvironmentManager: systemEnvironmentManager,
46+
options: HttpClientOptions(baseUrl: endpointConfig.baseFeedsUrl),
47+
connectionIdProvider: () => webSocketClient.connectionId,
48+
tokenManager: tokenManager,
3149
),
3250
);
3351
final websocketUri = Uri.parse(endpointConfig.wsEndpoint).replace(
@@ -38,7 +56,7 @@ class FeedsClient {
3856
},
3957
);
4058

41-
webSocketClient = WebSocketClient(
59+
webSocketClient = environment.createWebSocketClient(
4260
url: websocketUri.toString(),
4361
eventDecoder: FeedsWsEvent.fromEventObject,
4462
onConnectionEstablished: _authenticate,
@@ -49,15 +67,15 @@ class FeedsClient {
4967

5068
final String apiKey;
5169
final User user;
52-
final String userToken;
70+
late final TokenManager tokenManager;
5371
final FeedsConfig config;
54-
final UserTokenProvider? userTokenProvider;
55-
final NetworkMonitor? networkMonitor;
5672

5773
late final api.DefaultApi apiClient;
74+
75+
@internal
5876
late final FeedsRepository feedsRepository;
5977

60-
static final endpointConfig = EndpointConfig.production;
78+
static const endpointConfig = EndpointConfig.production;
6179
late final WebSocketClient webSocketClient;
6280
ConnectionRecoveryHandler? connectionRecoveryHandler;
6381
Stream<FeedsWsEvent> get feedsEvents =>
@@ -77,7 +95,7 @@ class FeedsClient {
7795

7896
connectionRecoveryHandler = DefaultConnectionRecoveryHandler(
7997
client: webSocketClient,
80-
networkMonitor: networkMonitor,
98+
networkMonitor: config.networkMonitor,
8199
);
82100

83101
_connectionCompleter = Completer<void>();
@@ -114,10 +132,10 @@ class FeedsClient {
114132
}
115133
}
116134

117-
void _authenticate() {
135+
Future<void> _authenticate() async {
118136
final connectUserRequest = WsAuthMessageRequest(
119137
products: ['feeds'],
120-
token: userToken,
138+
token: await tokenManager.loadToken(),
121139
userDetails: ConnectUserDetailsRequest(
122140
id: user.id,
123141
name: user.originalName,
@@ -142,49 +160,28 @@ class FeedsClient {
142160
}
143161

144162
class FeedsConfig {
145-
const FeedsConfig();
146-
// TODO: Add config for feeds
147-
}
148-
149-
typedef ConnectionIdProvider = String? Function();
150-
typedef UserTokenProvider = Future<String> Function();
151-
152-
// TODO: Migrate the API to dio for authentication and refresh of user tokens
153-
class _Authentication extends api.Authentication {
154-
_Authentication({
155-
required this.apiKey,
156-
required this.user,
157-
required this.getToken,
158-
required this.getConnectionId,
163+
const FeedsConfig({
164+
this.networkMonitor,
159165
});
160166

161-
final String apiKey;
162-
final User user;
163-
final UserTokenProvider getToken;
164-
final ConnectionIdProvider getConnectionId;
165-
166-
@override
167-
Future<void> applyToParams(
168-
List<api.QueryParam> queryParams,
169-
Map<String, String> headerParams,
170-
) async {
171-
queryParams.add(api.QueryParam('api_key', apiKey));
172-
final connectionId = getConnectionId();
173-
final userToken = await getToken();
174-
switch (user.type) {
175-
case UserAuthType.regular || UserAuthType.guest:
176-
if (connectionId != null) {
177-
queryParams.add(api.QueryParam('connection_id', connectionId));
178-
}
179-
headerParams['stream-auth-type'] = 'jwt';
180-
headerParams['Authorization'] = userToken;
181-
case UserAuthType.anonymous:
182-
headerParams['stream-auth-type'] = 'anonymous';
183-
if (userToken.isNotEmpty) {
184-
headerParams['Authorization'] = userToken;
185-
}
186-
}
187-
headerParams['X-Stream-Client'] = 'stream-feeds-dart';
188-
headerParams['x-client-request-id'] = const Uuid().v4();
189-
}
167+
final NetworkMonitor? networkMonitor;
168+
}
169+
170+
class FeedsClientEnvironment {
171+
const FeedsClientEnvironment();
172+
173+
WebSocketClient createWebSocketClient({
174+
required String url,
175+
required EventDecoder eventDecoder,
176+
PingReguestBuilder? pingReguestBuilder,
177+
VoidCallback? onConnectionEstablished,
178+
VoidCallback? onConnected,
179+
}) =>
180+
WebSocketClient(
181+
url: url,
182+
eventDecoder: FeedsWsEvent.fromEventObject,
183+
pingReguestBuilder: pingReguestBuilder,
184+
onConnectionEstablished: onConnectionEstablished,
185+
onConnected: onConnected,
186+
);
190187
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// Code generated by GetStream internal OpenAPI code generator. DO NOT EDIT.
2+
3+
export 'api/default_api.dart';
4+
export 'models.dart';

0 commit comments

Comments
 (0)