diff --git a/backend_dart/.gitignore b/backend_dart/.gitignore new file mode 100644 index 0000000..3a85790 --- /dev/null +++ b/backend_dart/.gitignore @@ -0,0 +1,3 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ diff --git a/backend_dart/CHANGELOG.md b/backend_dart/CHANGELOG.md new file mode 100644 index 0000000..effe43c --- /dev/null +++ b/backend_dart/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +- Initial version. diff --git a/backend_dart/README.md b/backend_dart/README.md new file mode 100644 index 0000000..3816eca --- /dev/null +++ b/backend_dart/README.md @@ -0,0 +1,2 @@ +A sample command-line application with an entrypoint in `bin/`, library code +in `lib/`, and example unit test in `test/`. diff --git a/backend_dart/analysis_options.yaml b/backend_dart/analysis_options.yaml new file mode 100644 index 0000000..dee8927 --- /dev/null +++ b/backend_dart/analysis_options.yaml @@ -0,0 +1,30 @@ +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +# linter: +# rules: +# - camel_case_types + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/backend_dart/bin/backend_dart.dart b/backend_dart/bin/backend_dart.dart new file mode 100644 index 0000000..30a6399 --- /dev/null +++ b/backend_dart/bin/backend_dart.dart @@ -0,0 +1,11 @@ +import 'package:backend_dart/backend_dart.dart' as backend_dart; +import 'package:backend_dart/infrastructure/config/config.dart'; +import 'package:backend_dart/interfaces/http/server.dart'; + +void main() async { + final config = await Config.load(); + final server = Server(config); + + print('Starting ActaTempus server on port ${config.port}...'); + await server.start(); +} diff --git a/backend_dart/lib/application/usecases/register_user.dart b/backend_dart/lib/application/usecases/register_user.dart new file mode 100644 index 0000000..cbbfc9f --- /dev/null +++ b/backend_dart/lib/application/usecases/register_user.dart @@ -0,0 +1,19 @@ +import 'package:backend_dart/domain/entities/user.dart'; +import 'package:backend_dart/domain/repositories/user_repository.dart'; + +class RegisterUserUseCase { + final UserRepository userRepository; + + RegisterUserUseCase(this.userRepository); + + Future execute(String name, String email, String password) async { + final user = User( + id: 'generated-id', // Eine Methode zur ID-Erzeugung einfügen + name: name, + email: email, + password: password, // In der Realität: Passwörter hashen + ); + + await userRepository.create(user); + } +} diff --git a/backend_dart/lib/backend_dart.dart b/backend_dart/lib/backend_dart.dart new file mode 100644 index 0000000..f64ad72 --- /dev/null +++ b/backend_dart/lib/backend_dart.dart @@ -0,0 +1,3 @@ +int calculate() { + return 6 * 7; +} diff --git a/backend_dart/lib/domain/entities/user.dart b/backend_dart/lib/domain/entities/user.dart new file mode 100644 index 0000000..94948b5 --- /dev/null +++ b/backend_dart/lib/domain/entities/user.dart @@ -0,0 +1,13 @@ +class User { + final String id; + final String name; + final String email; + final String password; + + User({ + required this.id, + required this.name, + required this.email, + required this.password, + }); +} diff --git a/backend_dart/lib/domain/repositories/user_repository.dart b/backend_dart/lib/domain/repositories/user_repository.dart new file mode 100644 index 0000000..4dfc622 --- /dev/null +++ b/backend_dart/lib/domain/repositories/user_repository.dart @@ -0,0 +1,7 @@ +import 'package:backend_dart/domain/entities/user.dart'; + +abstract class UserRepository { + Future create(User user); + Future findByEmail(String email); + Future findById(String id); +} diff --git a/backend_dart/lib/infrastructure/config/config.dart b/backend_dart/lib/infrastructure/config/config.dart new file mode 100644 index 0000000..747f0fa --- /dev/null +++ b/backend_dart/lib/infrastructure/config/config.dart @@ -0,0 +1,20 @@ +import 'dart:io'; +import 'package:yaml/yaml.dart'; + +class Config { + final String databaseUrl; + final String port; + + Config({required this.databaseUrl, required this.port}); + + static Future load() async { + final file = File('config.yaml'); + final content = await file.readAsString(); + final config = loadYaml(content); + + return Config( + databaseUrl: config['database']['url'], + port: config['server']['port'], + ); + } +} diff --git a/backend_dart/lib/infrastructure/persistence/postgres_user_repository.dart b/backend_dart/lib/infrastructure/persistence/postgres_user_repository.dart new file mode 100644 index 0000000..62846b2 --- /dev/null +++ b/backend_dart/lib/infrastructure/persistence/postgres_user_repository.dart @@ -0,0 +1,60 @@ +import 'package:backend_dart/domain/entities/user.dart'; +import 'package:backend_dart/domain/repositories/user_repository.dart'; +import 'package:postgres/postgres.dart'; + +class PostgresUserRepository implements UserRepository { + final PostgreSQLConnection connection; + + PostgresUserRepository(this.connection); + + @override + Future create(User user) async { + await connection.query( + 'INSERT INTO users (id, name, email, password) VALUES (@id, @name, @mail, @pwd)', + substitutionValues: { + 'id': user.id, + 'name': user.name, + 'mail': user.email, + 'pwd': user.password, + }, + ); + } + + @override + Future findByEmail(String email) async { + final results = await connection.query( + 'SELECT id, name, email, password FROM users WHERE email = @mail', + substitutionValues: {'mail': email}, + ); + + if (results.isNotEmpty) { + final row = results.first; + return User( + id: row[0], + name: row[1], + email: row[2], + password: row[3], + ); + } + return null; + } + + @override + Future findById(String id) async { + final results = await connection.query( + 'SELECT id, name, email, password FROM users WHERE id = @id', + substitutionValues: {'id': id}, + ); + + if (results.isNotEmpty) { + final row = results.first; + return User( + id: row[0], + name: row[1], + email: row[2], + password: row[3], + ); + } + return null; + } +} diff --git a/backend_dart/lib/interfaces/http/server.dart b/backend_dart/lib/interfaces/http/server.dart new file mode 100644 index 0000000..cc895b8 --- /dev/null +++ b/backend_dart/lib/interfaces/http/server.dart @@ -0,0 +1,21 @@ +import 'dart:io'; + +import 'package:backend_dart/infrastructure/config/config.dart'; + +class Server { + final Config config; + + Server(this.config); + + Future start() async { + final server = + await HttpServer.bind(InternetAddress.anyIPv4, int.parse(config.port)); + print('Listening on port ${config.port}'); + + await for (HttpRequest request in server) { + request.response + ..write('Welcome to ActaTempus!') + ..close(); + } + } +} diff --git a/backend_dart/pubspec.lock b/backend_dart/pubspec.lock new file mode 100644 index 0000000..6d37c62 --- /dev/null +++ b/backend_dart/pubspec.lock @@ -0,0 +1,437 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + url: "https://pub.dev" + source: hosted + version: "67.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + args: + dependency: transitive + description: + name: args + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + url: "https://pub.dev" + source: hosted + version: "2.6.0" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + buffer: + dependency: transitive + description: + name: buffer + sha256: "389da2ec2c16283c8787e0adaede82b1842102f8c8aae2f49003a766c5c6b3d1" + url: "https://pub.dev" + source: hosted + version: "1.2.3" + charcode: + dependency: transitive + description: + name: charcode + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://pub.dev" + source: hosted + version: "1.3.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + coverage: + dependency: transitive + description: + name: coverage + sha256: "3945034e86ea203af7a056d98e98e42a5518fff200d6e8e6647e1886b07e936e" + url: "https://pub.dev" + source: hosted + version: "1.8.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + url: "https://pub.dev" + source: hosted + version: "0.7.1" + lints: + dependency: "direct dev" + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + postgres: + dependency: "direct main" + description: + name: postgres + sha256: f8e4f14734d096277f77ed5dddefcbc1ce18f8f7db5b7ff4b5dd6df2d9db2730 + url: "https://pub.dev" + source: hosted + version: "2.6.4" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + sasl_scram: + dependency: transitive + description: + name: sasl_scram + sha256: a47207a436eb650f8fdcf54a2e2587b850dc3caef9973ce01f332b07a6fc9cb9 + url: "https://pub.dev" + source: hosted + version: "0.1.1" + saslprep: + dependency: transitive + description: + name: saslprep + sha256: "3d421d10be9513bf4459c17c5e70e7b8bc718c9fc5ad4ba5eb4f5fd27396f740" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" + source: hosted + version: "0.10.12" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "0bd04f5bb74fcd6ff0606a888a30e917af9bd52820b178eaa464beb11dca84b6" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test: + dependency: "direct dev" + description: + name: test + sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" + url: "https://pub.dev" + source: hosted + version: "1.25.7" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + test_core: + dependency: transitive + description: + name: test_core + sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" + url: "https://pub.dev" + source: hosted + version: "0.6.4" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + unorm_dart: + dependency: transitive + description: + name: unorm_dart + sha256: "23d8bf65605401a6a32cff99435fed66ef3dab3ddcad3454059165df46496a3b" + url: "https://pub.dev" + source: hosted + version: "0.3.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + url: "https://pub.dev" + source: hosted + version: "14.3.1" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + yaml: + dependency: "direct main" + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.3.0 <4.0.0" diff --git a/backend_dart/pubspec.yaml b/backend_dart/pubspec.yaml new file mode 100644 index 0000000..99eee27 --- /dev/null +++ b/backend_dart/pubspec.yaml @@ -0,0 +1,17 @@ +name: backend_dart +description: A sample command-line application. +version: 1.0.0 +# repository: https://github.com/my_org/my_repo + +environment: + sdk: ^3.3.0 + +# Add regular dependencies here. +dependencies: + # path: ^1.8.0 + postgres: ^2.4.1 + yaml: ^3.1.0 + +dev_dependencies: + lints: ^3.0.0 + test: ^1.24.0 diff --git a/backend_dart/test/backend_dart_test.dart b/backend_dart/test/backend_dart_test.dart new file mode 100644 index 0000000..3e41441 --- /dev/null +++ b/backend_dart/test/backend_dart_test.dart @@ -0,0 +1,8 @@ +import 'package:backend_dart/backend_dart.dart'; +import 'package:test/test.dart'; + +void main() { + test('calculate', () { + expect(calculate(), 42); + }); +}