rework-onboarding (#7)

Onboarding completato, ora super rapido e top

Reviewed-on: http://catelliub.zapto.org:3000/brontomark/flux/pulls/7
Co-authored-by: Mark M2 Macbook <marco@catelli.it>
Co-committed-by: Mark M2 Macbook <marco@catelli.it>
This commit is contained in:
2026-04-22 11:06:02 +02:00
committed by brontomark
parent c5b5b76bd6
commit 90bd5ecacf
47 changed files with 1742 additions and 516 deletions

View File

@@ -0,0 +1,111 @@
import 'package:flutter/foundation.dart';
import 'package:flux/core/blocs/session/session_cubit.dart';
import 'package:flux/features/company/models/company_model.dart';
import 'package:flux/features/master_data/store/models/store_model.dart';
import 'package:flux/features/master_data/staff/models/staff_member_model.dart';
import 'package:get_it/get_it.dart';
// Importa i tuoi modelli...
import 'package:supabase_flutter/supabase_flutter.dart';
class CoreRepository {
final _supabase = Supabase.instance.client;
// --- QUERY DI SESSIONE (Uso di maybeSingle per evitare crash) ---
Future<CompanyModel?> getCompanyByOwnerId(String userId) async {
try {
final response = await _supabase
.from('company')
.select()
.eq('user_id', userId) // <-- Assicurati di avere questo campo nel DB!
.maybeSingle();
if (response == null) return null;
return CompanyModel.fromMap(response);
} catch (e) {
debugPrint('Errore recupero azienda: $e');
throw Exception('Errore recupero azienda: $e');
}
}
Future<List<StoreModel>> getStoresByCompanyId(String companyId) async {
try {
final response = await _supabase
.from('store')
.select()
.eq('company_id', companyId)
.eq('is_active', true) // Buona pratica
.order('nome'); // O come si chiama il campo nome
return (response as List).map((s) => StoreModel.fromMap(s)).toList();
} catch (e) {
debugPrint('Errore recupero negozi: $e');
throw Exception('Errore recupero negozi: $e');
}
}
Future<StaffMemberModel?> getStaffMemberByUserId(String userId) async {
try {
final response = await _supabase
.from('staff_member')
.select()
.eq('user_id', userId)
.maybeSingle();
if (response == null) return null;
return StaffMemberModel.fromMap(response);
} catch (e) {
debugPrint('Errore recupero profilo staff: $e');
throw Exception('Errore recupero profilo staff: $e');
}
}
// --- MUTAZIONI PER L'ONBOARDING ---
Future<CompanyModel> createCompany(CompanyModel company) async {
try {
final response = await _supabase
.from('company')
.insert(company.toMap())
.select()
.single();
return CompanyModel.fromMap(response);
} catch (e) {
debugPrint('Creazione azienda fallita: $e');
throw Exception('Creazione azienda fallita: $e');
}
}
Future<StoreModel> createStore(StoreModel store) async {
try {
final response = await _supabase
.from('store')
.insert(store.toMap())
.select()
.single();
return StoreModel.fromMap(response);
} catch (e) {
debugPrint('Creazione negozio fallita: $e');
throw Exception('Creazione negozio fallita: $e');
}
}
Future<StaffMemberModel> createStaffMember(StaffMemberModel staff) async {
try {
final response = await _supabase
.from('staff_member')
.insert(staff.toMap())
.select()
.single();
final StaffMemberModel staffMember = StaffMemberModel.fromMap(response);
await _supabase.from('staff_in_stores').insert({
'staff_member_id': staffMember.id,
'store_id': GetIt.I.get<SessionCubit>().state.currentStore!.id,
});
return StaffMemberModel.fromMap(response);
} catch (e) {
debugPrint('Creazione profilo staff fallita: $e');
throw Exception('Creazione profilo staff fallita: $e');
}
}
}