diff --git a/dart/generate_pdf/.gitignore b/dart/generate_pdf/.gitignore new file mode 100644 index 00000000..dc259f50 --- /dev/null +++ b/dart/generate_pdf/.gitignore @@ -0,0 +1,27 @@ +# See https://www.dartlang.org/guides/libraries/private-files + +# Files and directories created by pub +.dart_tool/ +.packages +build/ +# If you're building an application, you may want to check-in your pubspec.lock +pubspec.lock + +# Directory created by dartdoc +# If you don't generate documentation locally you can remove this line. +doc/api/ + +# dotenv environment variables file +.env* + +# Avoid committing generated Javascript files: +*.dart.js +*.info.json # Produced by the --dump-info flag. +*.js # When generated by dart2js. Don't specify *.js if your + # project includes source files written in JavaScript. +*.js_ +*.js.deps +*.js.map + +.flutter-plugins +.flutter-plugins-dependencies \ No newline at end of file diff --git a/dart/generate_pdf/README.md b/dart/generate_pdf/README.md new file mode 100644 index 00000000..f77a225e --- /dev/null +++ b/dart/generate_pdf/README.md @@ -0,0 +1,48 @@ +# ⚡ Dart Starter Function + +A simple starter function. Edit `lib/main.dart` to get started and create something awesome! 🚀 + +## 🧰 Usage + +### GET / + +- Returns a "Hello, World!" message. + +**Response** + +Sample `200` Response: + +```text +Hello, World! +``` + +### POST, PUT, PATCH, DELETE / + +- Returns a "Learn More" JSON response. + +**Response** + +Sample `200` Response: + +```json +{ + "motto": "Build like a team of hundreds_", + "learn": "https://appwrite.io/docs", + "connect": "https://appwrite.io/discord", + "getInspired": "https://builtwith.appwrite.io" +} +``` + +## ⚙️ Configuration + +| Setting | Value | +|-------------------|-----------------| +| Runtime | Dart (2.17) | +| Entrypoint | `lib/main.dart` | +| Build Commands | `dart pub get` | +| Permissions | `any` | +| Timeout (Seconds) | 15 | + +## 🔒 Environment Variables + +No environment variables required. diff --git a/dart/generate_pdf/analysis_options.yaml b/dart/generate_pdf/analysis_options.yaml new file mode 100644 index 00000000..ea2c9e94 --- /dev/null +++ b/dart/generate_pdf/analysis_options.yaml @@ -0,0 +1 @@ +include: package:lints/recommended.yaml \ No newline at end of file diff --git a/dart/generate_pdf/lib/fake_order.dart b/dart/generate_pdf/lib/fake_order.dart new file mode 100644 index 00000000..2fb58cbe --- /dev/null +++ b/dart/generate_pdf/lib/fake_order.dart @@ -0,0 +1,38 @@ +import 'package:faker/faker.dart'; +import 'models/models.dart'; + +class FakeOrder { + final Faker _faker; + FakeOrder() : _faker = Faker(); + + List createFakeItems([items = 10]) { + final List items = []; + for (var i = 0; i < 10; i++) { + final item = Item( + id: _faker.guid.guid(), + name: _faker.lorem.word(), + price: _faker.currency.random.amount((i) => i, 10).first, + ); + items.add(item); + } + return items; + } + + Order createFakeOrder() { + final items = createFakeItems(); + int totalPrice = 0; + + for (var item in items) { + totalPrice = totalPrice + item.price; + } + + final order = Order( + id: _faker.guid.guid(), + date: _faker.date.dateTime(), + name: _faker.person.name(), + items: createFakeItems(), + total: totalPrice, + ); + return order; + } +} diff --git a/dart/generate_pdf/lib/main.dart b/dart/generate_pdf/lib/main.dart new file mode 100644 index 00000000..e74d8aa8 --- /dev/null +++ b/dart/generate_pdf/lib/main.dart @@ -0,0 +1,21 @@ +import 'dart:async'; +import 'dart:typed_data'; +import 'package:generate_pdf/pdf.dart'; +import 'fake_order.dart'; + +Future main(final context) async { + final pdf = PDF(); + final order = FakeOrder(); + var fakeOrder = order.createFakeOrder(); + context.log(fakeOrder.toJson().toString()); + final Uint8List? bytes = await pdf.createAndSave(fakeOrder); + + if (bytes != null) { + context.log('PDF created.'); + context.log(bytes); + + return context.res.send(bytes, 200, {'Content-Type': 'application/pdf'}); + } + + return context.error("Someting gone wrong"); +} diff --git a/dart/generate_pdf/lib/models/item.dart b/dart/generate_pdf/lib/models/item.dart new file mode 100644 index 00000000..7fab7d80 --- /dev/null +++ b/dart/generate_pdf/lib/models/item.dart @@ -0,0 +1,23 @@ +class Item { + String id; + String name; + int price; + + Item({ + required this.id, + required this.name, + required this.price, + }); + + factory Item.fromJson(Map json) => Item( + id: json["id"], + name: json["name"], + price: json["price"]?.toDouble(), + ); + + Map toJson() => { + "id": id, + "name": name, + "price": price, + }; +} diff --git a/dart/generate_pdf/lib/models/models.dart b/dart/generate_pdf/lib/models/models.dart new file mode 100644 index 00000000..45c1bbb6 --- /dev/null +++ b/dart/generate_pdf/lib/models/models.dart @@ -0,0 +1,2 @@ +export 'order.dart'; +export 'item.dart'; diff --git a/dart/generate_pdf/lib/models/order.dart b/dart/generate_pdf/lib/models/order.dart new file mode 100644 index 00000000..3f2cd4c9 --- /dev/null +++ b/dart/generate_pdf/lib/models/order.dart @@ -0,0 +1,33 @@ +import 'item.dart'; + +class Order { + String id; + DateTime date; + String name; + List items; + int total; + + Order({ + required this.id, + required this.date, + required this.name, + required this.items, + required this.total, + }); + + factory Order.fromJson(Map json) => Order( + id: json["id"], + date: json["date"], + name: json["name"], + items: List.from(json["items"].map((x) => x)), + total: json["total"]?.toDouble(), + ); + + Map toJson() => { + "id": id, + "date": date, + "name": name, + "items": List.from(items.map((x) => x)), + "total": total, + }; +} diff --git a/dart/generate_pdf/lib/pdf.dart b/dart/generate_pdf/lib/pdf.dart new file mode 100644 index 00000000..08266d53 --- /dev/null +++ b/dart/generate_pdf/lib/pdf.dart @@ -0,0 +1,43 @@ +import 'dart:typed_data'; +import 'package:pdf/widgets.dart'; +import 'models/models.dart'; + +class PDF { + late Document pdf; + PDF() : pdf = Document(); + + Future createAndSave(Order order) async { + try { + pdf.addPage( + Page( + build: (Context context) => Column( + children: [ + Row(children: [ + Text("Invoice"), + SizedBox(width: 100), + Text(order.id) + ]), + ...order.items + .map((e) => Row(children: [ + Text(e.id), + SizedBox(width: 50), + Text(e.name), + SizedBox(width: 50), + Text(e.price.toString()), + ])) + .toList() + ], + ), + ), + ); + return await _save(order.id); + } catch (e) { + return null; + } + } + + Future _save(String name) async { + var x = await pdf.save(); + return x; + } +} diff --git a/dart/generate_pdf/pubspec.yaml b/dart/generate_pdf/pubspec.yaml new file mode 100644 index 00000000..2e3e4a0c --- /dev/null +++ b/dart/generate_pdf/pubspec.yaml @@ -0,0 +1,13 @@ +name: generate_pdf +version: 1.0.0 + +environment: + sdk: ^3.0.0 + +dependencies: + dart_appwrite: ^10.0.0 + pdf: ^3.10.4 + faker: ^2.1.0 + +dev_dependencies: + lints: ^2.0.0