summaryrefslogtreecommitdiff
path: root/lib/database/helper.dart
blob: 54e415cda81a7aed20c8b1e78a340db981c1cd2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import 'dart:io';

// ignore: depend_on_referenced_packages
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:pmsna1/models/event.dart';
import 'package:pmsna1/models/popular.dart';
import 'package:pmsna1/models/post.dart';
import 'package:sqflite/sqflite.dart';

class DatabaseHelper {
  static const dbName = "tecstagram.sql";
  static const dbVersion = 2;

  static Database? _database;

  static Future<Database> _initDatabase() async {
    String dir = Platform.isIOS
        ? (await getLibraryDirectory()).path
        : await getDatabasesPath();
    String dbDir = join(dir, dbName);
    _database = await openDatabase(
      dbDir,
      version: dbVersion,
      onCreate: _onCreate,
      onUpgrade: ((db, oldVersion, newVersion) {
        _onCreate(db, newVersion);
      }),
      onOpen: (db) {
        _onCreate(db, 0);
      },
    );
    return _database!;
  }

  Future<Database> get database async => _database ?? await _initDatabase();

  static void _onCreate(Database db, int version) async {
    await db.execute("""CREATE TABLE IF NOT EXISTS posts (
  id INTEGER PRIMARY KEY,
  description VARCHAR(500) NOT NULL,
  date DATE NOT NULL
);""");

    await db.execute("""CREATE TABLE IF NOT EXISTS events (
  id INTEGER PRIMARY KEY,
  description VARCHAR(500),
  date DATE NOT NULL,
  completed INT DEFAULT 0
);""");

    await db.execute("""CREATE TABLE IF NOT EXISTS favorites (
  id INT PRIMARY KEY,
  title VARCHAR(128),
  posterPath VARCHAR(128),
  backdropPath VARCHAR(128),
  overview TEXT
);""");
  }

  Future<int> insert(String table, Map<String, dynamic> data) async {
    Database conn = await database;
    return conn.insert(table, data);
  }

  Future<int> update<T>(
      String table, Map<String, dynamic> data, String columnId, T id) async {
    Database conn = await database;
    return conn.update(
      table,
      data,
      where: "$columnId = ?",
      whereArgs: [id],
    );
  }

  Future<int> delete<T>(String table, String columnId, T id) async {
    Database conn = await database;
    return conn.delete(
      table,
      where: "$columnId = ?",
      whereArgs: [id],
    );
  }

  /*
  * Post specific functions
  */

  Future<List<Post>> getAllPost() async {
    Database conn = await database;
    List<Map<String, Object?>> result = await conn.query("posts");
    return result.map((post) => Post.fromMap(post)).toList();
  }

  /*
   * Event specific functions
   */
  Future<List<Event>> getAllEvent() async {
    Database conn = await database;
    List<Map<String, Object?>> result = await conn.query("events");
    return result.map((event) => Event.fromMap(event)).toList();
  }

  /*
   * Favorite specific functions
   */

  Future<List<Popular>> getAllFavorites() async {
    Database conn = await database;
    List<Map<String, Object?>> result = await conn.query("favorites");
    return result.map((p) {
      Popular popular = Popular.fromDb(p);
      popular.hasFavorite = true;
      return popular;
    }).toList();
  }

  Future<bool> hasFavorite(int id) async {
    Database conn = await database;
    List result =
        await conn.query("favorites", where: "id = ?", whereArgs: [id]);
    return result.isNotEmpty;
  }

  Future<int> favoritePopular(Popular popular) async {
    return insert('favorites', popular.toDb());
  }

  Future<int> unfavoritePopular(Popular popular) async {
    return delete('favorites', 'id', popular.id);
  }
}