본문 바로가기

1인 어플 개발/개발 썰

Supabase 안녕! Firebase

반응형

 

 

저는 일기월장의 백엔드 서비스를 Supabase를 선택했습니다. 이유는 Sql 때문이죠. 

하지만 문제가 너무 많았습니다. 

 

소셜로그인을 이틀 동안 작업을 해보았는데 결국 Supabase 서버 문제였습니다. 

 

Supabase 문서대로 Google로그인을 진행해보았습니다. Google 로그인은 문제없이 진행되었고 토큰까지 받았지만 이 정보가 Supabase에서 새로운 유저로 등록할 때 전달이 안되었습니다. 

기존에 잘 사용하던 Email 로그인조차 안되는 것을 보고 바로 Supabase를 포기했습니다. 

 

 

 

해서 바로 Firebase를 연동했습니다. 

오늘까지 한 작업은 가계부 데이터를 안드로이드 기기, IOS 기기로 바로 연동이 가능하게 하는 것이었습니다. 

Firebase로 Google 로그인만 구현했고, Storage 기능까지 추가했습니다. 

 

Firebase로 Google 로그인 구현 중에 12500에러를 만나서 또 3~4시간을 날려먹었습니다.. ㅠㅠ

결국은 debugkey를 새로 만들어서 성공시켰네요...

 

후아 정말 힘든 하루네요. 

 

 

 

 

파베 Dbhelper 클래스입니다. 

 

import 'dart:io';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:path_provider/path_provider.dart';
import 'package:restart_app/restart_app.dart';

class FirebaseStorageService {
  static final FirebaseAuth _auth = FirebaseAuth.instance;
  static final FirebaseStorage _storage = FirebaseStorage.instance;

  static Future<List<String>> listFiles() async {
    final User? user = _auth.currentUser;
    if (user == null) throw Exception("User is not logged in");

    try {
      ListResult result = await _storage.ref('db_data/${user.uid}').listAll();
      return result.items.map((item) => item.name).toList();
    } catch (e) {
      print('Error listing files: $e');
      throw Exception("Error listing files: ${e.toString()}");
    }
  }


  static Future<String> getDatabasePathIOS() async {
    Directory appDocDir = await getApplicationDocumentsDirectory();
    String appDocPath = appDocDir.path;
    return '$appDocPath/moneytracker.db';
  }

  static Future<String> getDatabasePath() async {
    if (Platform.isAndroid) {
      return getDatabasePathAndroid();
    } else if (Platform.isIOS) {
      return getDatabasePathIOS();
    } else {
      throw UnsupportedError('이 플랫폼은 지원되지 않습니다.');
    }
  }

  static Future<String?> uploadDatabaseToStorage() async {
    final User? user = _auth.currentUser;
    if (user == null) throw Exception("User is not logged in");

    try {
      String dbPath = await getDatabasePath();
      File dbFile = File(dbPath);

      final now = DateTime.now();
      final formatter = DateFormat('yy.MM.dd.HHmmss');
      final String formattedDate = formatter.format(now);
      final String fileName = "${formattedDate}_moneytracker.db";

      if (await dbFile.exists()) {
        await _storage.ref('db_data/${user.uid}/$fileName').putFile(dbFile);
        print('Database uploaded to Firebase Storage');
        return fileName;
      } else {
        print('Database file does not exist');
        return null;
      }
    } catch (e) {
      print('Error uploading database to Firebase Storage: $e');
      throw Exception("Error uploading database: ${e.toString()}");
    }
  }

  static Future<List<Map<String, String>>> getData() async {
    final User? user = _auth.currentUser;
    if (user == null) throw Exception("User is not logged in");

    try {
      ListResult result = await _storage.ref('db_data/${user.uid}').listAll();

      final List<Map<String, String>> mydata = [];
      for (var item in result.items) {
        mydata.add({"파일 이름": item.name});
      }
      print(mydata);
      return mydata;
    } catch (e) {
      print('Error listing files: $e');
      throw Exception("Error listing files: ${e.toString()}");
    }
  }

  static Future<void> deleteData(String dataName) async {
    final User? user = _auth.currentUser;
    if (user == null) throw Exception("User is not logged in");

    try {
      await _storage.ref('db_data/${user.uid}/$dataName').delete();
      print('Database file deleted from Firebase Storage');
    } catch (e) {
      print('Error deleting database from Firebase Storage: $e');
      throw Exception("Error deleting database: ${e.toString()}");
    }
  }

  static Future<void> restoreDatabase(String fileName) async {
    final User? user = _auth.currentUser;
    if (user == null) throw Exception("User is not logged in");

    try {
      final String dbPath = await getDatabasePath();
      final dbFile = File(dbPath);

      final ref = _storage.ref('db_data/${user.uid}/$fileName');
      final downloadTask = ref.writeToFile(dbFile);

      await downloadTask.whenComplete(() {
        Restart.restartApp();
        print('Database restored from Firebase Storage');
      });
    } catch (e) {
      Get.snackbar('복원 실패', '백업 파일 복원 중 오류가 발생했습니다.');
      print('Error restoring database from Firebase Storage: $e');
      throw Exception("Error restoring database: ${e.toString()}");
    }
  }
}
반응형