Skip to content

Commit c2628dd

Browse files
authored
refactor(cloud_hub): Mix in CloudAuthDatabase to the CloudHubDatabase (#290)
Instead of managing two database classes, merge Cloud Auth tables and accessors into the main `CloudHubDatabase` class. Adds E2E tests as well.
1 parent 0ec0033 commit c2628dd

16 files changed

+4435
-3477
lines changed

services/celest_cloud_hub/bin/cloud_hub.dart

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,6 @@ Future<void> main() async {
3434

3535
context.logger.config('Starting Cloud Hub');
3636

37-
context.logger.config('Configuring Auth database');
38-
final authDb = await connect(
39-
Context.current,
40-
name: 'AuthDatabase',
41-
factory: AuthDatabase.new,
42-
hostnameVariable: const env('AUTH_DATABASE_HOST'),
43-
tokenSecret: const secret('AUTH_DATABASE_TOKEN'),
44-
);
45-
await authDb.ping();
46-
47-
final issuer = EntityUid.of('Celest::Service', 'cloud-hub');
48-
final authorizer = Authorizer(db: authDb);
49-
final cryptoKeys = await CryptoKeyRepository.create(db: authDb);
50-
5137
context.logger.config('Configuring Cloud Hub database');
5238
final db = await connect(
5339
Context.current,
@@ -59,9 +45,13 @@ Future<void> main() async {
5945
);
6046
await db.ping();
6147

48+
final issuer = EntityUid.of('Celest::Service', 'cloud-hub');
49+
final authorizer = Authorizer(db: db);
50+
final cryptoKeys = await CryptoKeyRepository.create(db: db);
51+
6252
final authMiddleware = AuthorizationMiddleware(
63-
corks: CorksRepository(issuer: issuer, db: authDb, cryptoKeys: cryptoKeys),
64-
db: authDb,
53+
corks: CorksRepository(issuer: issuer, db: db, cryptoKeys: cryptoKeys),
54+
db: db.cloudAuth,
6555
);
6656

6757
final server = grpc.Server.create(
@@ -91,7 +81,7 @@ Future<void> main() async {
9181
);
9282

9383
final gateway = await Gateway.create(
94-
authDb: authDb,
84+
db: db,
9585
grpcAddress: grpcAddress,
9686
port: switch (Platform.environment['PORT']) {
9787
final port? =>
@@ -117,7 +107,7 @@ Future<void> main() async {
117107
},
118108
);
119109

120-
context.logger.info('Serving on http://0.0.0.0:${gateway.port}');
110+
print('Serving on http://0.0.0.0:${gateway.port}');
121111

122112
final signal =
123113
await StreamGroup.merge([
@@ -128,7 +118,6 @@ Future<void> main() async {
128118

129119
await server.shutdown();
130120
await gateway.close();
131-
await authDb.close();
132121
await db.close();
133122
context.logger.fine('Server stopped');
134123
}

services/celest_cloud_hub/build.yaml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,22 @@ targets:
22
$default:
33
builders:
44
drift_dev:
5-
options:
5+
# disable drift's default builder, we're using the modular setup
6+
# instead.
7+
enabled: false
8+
9+
# Instead, enable drift_dev:analyzer and drift_dev:modular manually:
10+
drift_dev:analyzer:
11+
enabled: true
12+
options: &options
613
sql:
714
dialect: sqlite
815
options:
916
version: "3.38"
1017

1118
named_parameters: true
1219
store_date_time_values_as_text: false
20+
drift_dev:modular:
21+
enabled: true
22+
# We use yaml anchors to give the two builders the same options
23+
options: *options

services/celest_cloud_hub/lib/src/auth/auth_interceptor.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import 'package:cedar/cedar.dart';
1+
import 'package:celest_cloud_auth/celest_cloud_auth.dart';
22
import 'package:celest_cloud_auth/src/authorization/corks_repository.dart';
33
import 'package:celest_cloud_auth/src/context.dart';
4-
import 'package:celest_cloud_auth/src/database/auth_database.dart';
54
import 'package:celest_cloud_auth/src/model/cookie.dart';
65
import 'package:celest_cloud_auth/src/model/interop.dart';
76
import 'package:celest_core/celest_core.dart' as core;
@@ -11,7 +10,7 @@ import 'package:corks_cedar/corks_cedar.dart';
1110
import 'package:grpc/grpc.dart';
1211
import 'package:meta/meta.dart';
1312

14-
typedef _Deps = ({CorksRepository corks, AuthDatabase db});
13+
typedef _Deps = ({CorksRepository corks, CloudAuthDatabaseAccessors db});
1514

1615
/// {@template celest_cloud_auth.request_authorizer}
1716
/// A middleware that authorizes requests based on the current policy set.
@@ -20,11 +19,11 @@ extension type AuthorizationMiddleware._(_Deps _deps) implements Object {
2019
/// {@macro celest_cloud_auth.request_authorizer}
2120
AuthorizationMiddleware({
2221
required CorksRepository corks,
23-
required AuthDatabase db,
22+
required CloudAuthDatabaseAccessors db,
2423
}) : this._((corks: corks, db: db));
2524

2625
CorksRepository get _corks => _deps.corks;
27-
AuthDatabase get _db => _deps.db;
26+
CloudAuthDatabaseAccessors get _db => _deps.db;
2827

2928
/// Authenticates the request and returns the user if the request is
3029
/// authorized.

services/celest_cloud_hub/lib/src/database/cloud_hub_database.dart

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,41 @@
1+
import 'dart:io';
2+
3+
import 'package:celest_cloud_auth/celest_cloud_auth.dart';
14
import 'package:celest_cloud_hub/src/database/db_functions.dart';
2-
import 'package:celest_cloud_hub/src/model/lifecycle_state.dart';
5+
import 'package:celest_cloud_hub/src/project.dart';
36
import 'package:drift/drift.dart';
47
import 'package:drift/native.dart';
58

6-
part 'cloud_hub_database.g.dart';
9+
import 'cloud_hub_database.drift.dart';
710

811
@DriftDatabase(
9-
include: {'schema/operations.drift', 'schema/project_environments.drift'},
12+
include: {
13+
'schema/operations.drift',
14+
'schema/project_environments.drift',
15+
16+
// Cloud Auth
17+
...CloudAuthDatabaseMixin.includes,
18+
},
1019
)
11-
final class CloudHubDatabase extends _$CloudHubDatabase {
20+
final class CloudHubDatabase extends $CloudHubDatabase
21+
with CloudAuthDatabaseMixin {
1222
CloudHubDatabase(super.e);
1323

1424
CloudHubDatabase.memory()
1525
: this(NativeDatabase.memory(setup: (db) => db.addHelperFunctions()));
1626

27+
factory CloudHubDatabase.localFile(String path, {bool verbose = false}) {
28+
return CloudHubDatabase(
29+
NativeDatabase(
30+
File(path),
31+
logStatements: verbose,
32+
setup: (db) => db.addHelperFunctions(),
33+
cachePreparedStatements: true,
34+
enableMigrations: true,
35+
),
36+
);
37+
}
38+
1739
@override
1840
int get schemaVersion => 1;
1941

@@ -22,6 +44,15 @@ final class CloudHubDatabase extends _$CloudHubDatabase {
2244
onCreate: (m) async {
2345
await m.createAll();
2446
},
47+
onUpgrade: (m, from, to) async {
48+
await cloudAuth.onUpgrade(m);
49+
},
50+
beforeOpen: (details) async {
51+
if (details.wasCreated) {
52+
await cloudAuth.seed();
53+
}
54+
await cloudAuth.upsertProject(project: project);
55+
},
2556
);
2657

2758
Future<void> ping() async {

0 commit comments

Comments
 (0)