feat: Add Nanaxe server with Docker, GitHub Actions CI/CD, and auto-deployment

- Add complete server infrastructure with Gitea, API, PostgreSQL
- Implement Obsidian-compatible markdown mindmap converter
- Add Flutter service for server synchronization
- Configure GitHub Actions for automated build and deploy
- Add production docker-compose with health checks
- Include VPS setup and deployment scripts
- Add comprehensive deployment documentation
This commit is contained in:
2026-04-19 22:18:25 +05:00
parent 52aea9ac87
commit f1e0f6b5ef
56 changed files with 8892 additions and 397 deletions
+24 -15
View File
@@ -34,24 +34,33 @@ class ProjectModel {
});
factory ProjectModel.fromFirestore(DocumentSnapshot doc) {
final data = doc.data() as Map<String, dynamic>;
final data = doc.data();
if (data == null) {
throw Exception('Document data is null');
}
final mapData = data is Map<String, dynamic>
? data
: (data as Map<dynamic, dynamic>)
.map((k, v) => MapEntry(k.toString(), v));
return ProjectModel(
id: doc.id,
name: data['name'] ?? '',
description: data['description'] ?? '',
teamId: data['teamId'] ?? '',
ownerId: data['ownerId'] ?? '',
memberIds: List<String>.from(data['memberIds'] ?? []),
status: data['status'] ?? 'active',
startDate: (data['startDate'] as Timestamp).toDate(),
endDate: data['endDate'] != null
? (data['endDate'] as Timestamp).toDate()
name: mapData['name'] ?? '',
description: mapData['description'] ?? '',
teamId: mapData['teamId'] ?? '',
ownerId: mapData['ownerId'] ?? '',
memberIds: List<String>.from(mapData['memberIds'] ?? []),
status: mapData['status'] ?? 'active',
startDate: (mapData['startDate'] as Timestamp).toDate(),
endDate: mapData['endDate'] != null
? (mapData['endDate'] as Timestamp).toDate()
: null,
color: data['color'] ?? '#1976D2',
icon: data['icon'] ?? 'project',
settings: data['settings'] ?? {},
createdAt: (data['createdAt'] as Timestamp).toDate(),
updatedAt: (data['updatedAt'] as Timestamp).toDate(),
color: mapData['color'] ?? '#1976D2',
icon: mapData['icon'] ?? 'project',
settings: mapData['settings'] ?? {},
createdAt: (mapData['createdAt'] as Timestamp).toDate(),
updatedAt: (mapData['updatedAt'] as Timestamp).toDate(),
);
}