import 'package:mobdr/db/box_user.dart'; import 'package:mobdr/db/box_log.dart'; import 'package:mobdr/db/box_etab.dart'; import 'package:mobdr/db/box_concurrent.dart'; import 'package:mobdr/db/box_visite.dart'; import 'package:mobdr/db/box_visite_tag.dart'; import 'package:mobdr/db/box_photo.dart'; import 'package:mobdr/db/box_photo_typology.dart'; import 'model.dart'; import 'package:mobdr/model/visite_model.dart'; import 'package:mobdr/model/photo_model.dart'; import 'objectbox.g.dart'; // created by `flutter pub run build_runner build` /// Provides access to the ObjectBox Store throughout the app. /// /// Create this in the apps main function. class ObjectBox { /// The Store of this app. late final Store store; /// A Box of notes. late final Box noteBox; /// A Box of "user" late final Box userBox; /// A Box of "Etablissement" late final Box etabBox; /// A Box of "Concurrent" late final Box concurrentBox; /// A Box of "Visite" late final Box visiteBox; /// A Box of "Visite tag" late final Box visiteTagBox; /// A Box of "Photo" late final Box photoBox; /// A Box of "Photo typology" late final Box photoTypologyBox; /// A Box of log. late final Box logBox; ObjectBox._create(this.store) { noteBox = Box(store); userBox = Box(store); etabBox = Box(store); concurrentBox = Box(store); visiteBox = Box(store); visiteTagBox = Box(store); photoBox = Box(store); photoTypologyBox = Box(store); logBox = Box(store); // Add some demo data if the box is empty. if (noteBox.isEmpty()) { _putDemoData(); } userBox.removeAll(); etabBox.removeAll(); concurrentBox.removeAll(); visiteBox.removeAll(); visiteTagBox.removeAll(); //photoBox.removeAll(); //photoTypologyBox.removeAll(); // Add some demo data if the box is empty. if (userBox.isEmpty()) { _putUserAdminData(); } } /// Create an instance of ObjectBox to use throughout the app. static Future create() async { // Future openStore() {...} is defined in the generated objectbox.g.dart final store = await openStore(); return ObjectBox._create(store); } void _putDemoData() { final demoNotes = [ Note('Quickly add a note by writing text and pressing Enter'), Note('Delete notes by tapping on one'), Note('Write a demo app for ObjectBox') ]; store.runInTransactionAsync(TxMode.write, _putNotesInTx, demoNotes); } void _putUserAdminData() { //addUSer(0, 'root', 'admim', 'admin', ''); } Stream> getNotes() { // Query for all notes, sorted by their date. // https://docs.objectbox.io/queries final builder = noteBox.query().order(Note_.date, flags: Order.descending); // Build and watch the query, // set triggerImmediately to emit the query immediately on listen. return builder .watch(triggerImmediately: true) // Map it to a list of notes to be used by a StreamBuilder. .map((query) => query.find()); } static void _putNotesInTx(Store store, List notes) => store.box().putMany(notes); /// Add a note within a transaction. /// /// To avoid frame drops, run ObjectBox operations that take longer than a /// few milliseconds, e.g. putting many objects, in an isolate with its /// own Store instance. /// For this example only a single object is put which would also be fine if /// done here directly. Future addNote(String text) => store.runInTransactionAsync(TxMode.write, _addNoteInTx, text); /// Note: due to [dart-lang/sdk#36983](https://github.com/dart-lang/sdk/issues/36983) /// not using a closure as it may capture more objects than expected. /// These might not be send-able to an isolate. See Store.runAsync for details. static void _addNoteInTx(Store store, String text) { // Perform ObjectBox operations that take longer than a few milliseconds // here. To keep it simple, this example just puts a single object. store.box().put(Note(text)); } /// USER --------------------------------------------------------------------- /// Future addUSer(int _id_utilisateur, String _login, String _nom, String _prenom, String _photo) => store.runInTransactionAsync( TxMode.write, _addUserInTx, User( id_utilisateur: _id_utilisateur, login: _login, nom: _nom, prenom: _prenom, photo: _photo)); static void _addUserInTx(Store store, _User) { store.box().put(_User); } String getUserAvatar(int id_utilisateur) { final query = userBox.query(User_.id_utilisateur.equals(id_utilisateur)).build(); var p = query.findFirst(); return p!.photo; } /// ETAB --------------------------------------------------------------------- /// // A function that converts a response body into a List. List parseEtabs(List responseDataList) { final parsed = responseDataList.cast>(); return parsed.map((json) => Etab.fromJson(json)).toList(); } Future addEtabs(List _listEtabs) => store.runInTransactionAsync( TxMode.write, _addEtabsInTx, parseEtabs(_listEtabs)); static void _addEtabsInTx(Store store, _Etabs) { store.box().putMany(_Etabs); } Future addEtab(int _id_etab, String _nom, String _mail, String _tel, String _photo_principale, String _longitude, String _latitude) => store.runInTransactionAsync( TxMode.write, _addEtabInTx, Etab( id_etab: _id_etab, nom: _nom, mail: _mail, tel: _tel, url_photo_principale: _photo_principale, longitude: _longitude, latitude: _latitude)); static void _addEtabInTx(Store store, _Etab) { store.box().put(_Etab); } String getEtabPhotoPrincipale(int _id_etab) { final query = etabBox.query(Etab_.id_etab.equals(_id_etab)).build(); var p = query.findFirst(); return p!.url_photo_principale; } int getEtabCount() { return etabBox.count(); } /// CONCURRENT --------------------------------------------------------------- /// // A function that converts a response body list into a List. List parseConcurrents(List responseDataList) { final parsed = responseDataList.cast>(); return parsed.map((json) => Concurrent.fromJson(json)).toList(); } Future addConcurrents(List _listConcurrents) => store.runInTransactionAsync(TxMode.write, _addConcurrentsInTx, parseConcurrents(_listConcurrents)); static void _addConcurrentsInTx(Store store, _Concurrents) { store.box().putMany(_Concurrents); } Future addConcurrent(int _id_concurrence_lien, int _id_etab, _nom) => store.runInTransactionAsync( TxMode.write, _addConcurrentInTx, Concurrent( id_concurrence_lien: _id_concurrence_lien, id_etab: _id_etab, nom: _nom, )); static void _addConcurrentInTx(Store store, _Concurrent) { store.box().put(_Concurrent); } int getConcurrentCount() { return concurrentBox.count(); } /// VISITE ------------------------------------------------------------------ /// Stream> getVisites() { // Query for all visites, sorted by their date. // https://docs.objectbox.io/queries final builder = visiteBox.query().order(Visite_.date_visite, flags: Order.descending); // Build and watch the query, // set triggerImmediately to emit the query immediately on listen. return builder .watch(triggerImmediately: true) // Map it to a list of notes to be used by a StreamBuilder. .map((query) => query.find()); } // A function that converts a response body list into a List. List parseVisites(List responseDataList) { final parsed = responseDataList.cast>(); return parsed.map((json) => Visite.fromJson(json)).toList(); } Future addVisites(List _listVisites) => store.runInTransactionAsync( TxMode.write, _addVisitesInTx, parseVisites(_listVisites)); static void _addVisitesInTx(Store store, _Visites) { store.box().putMany(_Visites); } Future addVisite( int _id_visite, DateTime _date_visite, String _type_visite, String _title, bool _allDay, String _start, int _id_distrib_visite, int _id_etab, int _abandon, String _end) => store.runInTransactionAsync( TxMode.write, _addVisiteInTx, Visite( id_visite: _id_visite, date_visite: _date_visite, type_visite: _type_visite, title: _title, allDay: _allDay, id_distrib_visite: _id_distrib_visite, id_etab: _id_etab, abandon: _abandon)); static void _addVisiteInTx(Store store, _Visite) { store.box().put(_Visite); } int getVisiteCount() { return visiteBox.count(); } /// VISITE TAG --------------------------------------------------------------- /// // A function that converts a response body list into a List. List parseVisiteTags(List responseDataList) { final parsed = responseDataList.cast>(); return parsed.map((json) => VisiteTag.fromJson(json)).toList(); } Future addVisiteTags(List _listVisiteTags) => store.runInTransactionAsync( TxMode.write, _addVisiteTagsInTx, parseVisiteTags(_listVisiteTags)); static void _addVisiteTagsInTx(Store store, _VisiteTags) { store.box().putMany(_VisiteTags); } Future addVisiteTag( int _id_visite_tag, int _id_distrib, String _libelle, String _langage, ) => store.runInTransactionAsync( TxMode.write, _addVisiteTagInTx, VisiteTag( id_visite_tag: _id_visite_tag, id_distrib: _id_distrib, libelle: _libelle, langage: _langage, )); static void _addVisiteTagInTx(Store store, _VisiteTag) { store.box().put(_VisiteTag); } int getVisiteTagCount() { return visiteTagBox.count(); } /// PHOTO -------------------------------------------------------------------- /// void addPhotos(List _listPhotos) { store.box().putManyAsync(_listPhotos); } Future addPhoto(int id_visite, int id_photo_typologie, String image, String image_name) => store.runInTransactionAsync( TxMode.write, _addPhotoInTx, Photo( id_visite: id_visite, id_photo_typologie: id_photo_typologie, image: image, image_name: image_name)); static void _addPhotoInTx(Store store, _Photo) { // Perform ObjectBox operations that take longer than a few milliseconds // here. To keep it simple, this example just puts a single object. store.box().put(_Photo); } List getPhotos2() { // Query for all photos, sorted by their date. // https://docs.objectbox.io/queries final query = photoBox .query() .order(Photo_.date_photo, flags: Order.descending) .build(); return query.find(); } Stream> getPhotos() { // Query for all photos, sorted by their date. // https://docs.objectbox.io/queries final builder = photoBox.query().order(Photo_.date_photo, flags: Order.descending); // Build and watch the query, // set triggerImmediately to emit the query immediately on listen. return builder .watch(triggerImmediately: true) // Map it to a list of notes to be used by a StreamBuilder. .map((query) => query.find()); } void delPhoto(String _name) { final query = photoBox.query(Photo_.image_name.equals(_name)).build(); final results = query.find(); if (results.isNotEmpty) { final photoToDelete = results.first; photoBox.removeAsync(photoToDelete.id); } } int getVisitPhotoCount(int _id_visite, int _id_Photo_typologie) { final builder = photoBox .query(Photo_.id_visite.equals(_id_visite) & Photo_.id_photo_typologie.equals(_id_Photo_typologie)) .build(); return builder.count(); } /// PHOTO TYPOLOGY ----------------------------------------------------------- /// List parsePhotoTypologies(List responseDataList) { final parsed = responseDataList.cast>(); return parsed .map((json) => PhotoTypology.fromJson(json)) .toList(); } Future addPhotoTypologies(List _listPhotoTypologies) => store.runInTransactionAsync(TxMode.write, _addPhotoTypologiesInTx, parsePhotoTypologies(_listPhotoTypologies)); static void _addPhotoTypologiesInTx(Store store, _PhotoTypologies) { store.box().putMany(_PhotoTypologies); } Future addPhotoTypology( int id_photo_typologie, String libelle, int ordre) => store.runInTransactionAsync( TxMode.write, _addPhotoTypologyInTx, PhotoTypology( id_photo_typologie: id_photo_typologie, libelle: libelle, ordre: ordre)); static void _addPhotoTypologyInTx(Store store, _PhotoTypology) { // Perform ObjectBox operations that take longer than a few milliseconds // here. To keep it simple, this example just puts a single object. store.box().put(_PhotoTypology); } Stream> getPhotoTypologies() { // Query for all Typologies, sorted by their order. // https://docs.objectbox.io/queries final builder = photoTypologyBox.query().order(PhotoTypology_.ordre); // Build and watch the query, // set triggerImmediately to emit the query immediately on listen. return builder .watch(triggerImmediately: true) // Map it to a list of notes to be used by a StreamBuilder. .map((query) => query.find()); } /// LOG ---------------------------------------------------------------------- /// Future addLog(String type, String module, String libelle, int duree) => store.runInTransactionAsync( TxMode.write, _addLogInTx, Log( type, module, libelle, duree, )); static void _addLogInTx(Store store, _Log) { // Perform ObjectBox operations that take longer than a few milliseconds // here. To keep it simple, this example just puts a single object. store.box().put(_Log); } Stream> getLogs() { // Query for all logs, sorted by their date. // https://docs.objectbox.io/queries final builder = logBox.query().order(Log_.date, flags: Order.descending); // Build and watch the query, // set triggerImmediately to emit the query immediately on listen. return builder .watch(triggerImmediately: true) // Map it to a list of notes to be used by a StreamBuilder. .map((query) => query.find()); } }