Cant join team if in team Profile page resets properly Post button spam no longer leads to crash due to duplicate calls Housekeeping: Made some name changes moved homescreenpages from layout -> homeFeed Deleted 2 unused classes, authService.dart and old loginPage.dart then renamed startPage.dart -> loginPage.dart Set up openApi on backend and added URL in Service classes
121 lines
3.4 KiB
Dart
121 lines
3.4 KiB
Dart
import 'package:http/http.dart' as http;
|
|
import 'dart:convert';
|
|
import 'package:insparkspokalen_ui/models/postModel.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
class FeedService extends ChangeNotifier {
|
|
final String baseUrl = 'https://group-10-15.pvt.dsv.su.se/mission/post';
|
|
|
|
List<PostModel> _posts = [];
|
|
List<PostModel> get posts => _posts;
|
|
|
|
/* Future<List<PostModel>> showFeed() async {
|
|
final endpoint = Uri.parse('$baseUrl/all');
|
|
|
|
try {
|
|
final response = await http.get(endpoint);
|
|
if (response.statusCode == 200) {
|
|
final List<dynamic> data = jsonDecode(response.body);
|
|
return data.map((json) => PostModel.fromJson(json)).toList();
|
|
} else {
|
|
return [];
|
|
}
|
|
} catch (e) {
|
|
return [];
|
|
}
|
|
} */
|
|
|
|
Future<void> loadPosts() async {
|
|
final endpoint = Uri.parse('$baseUrl/all');
|
|
|
|
try {
|
|
final response = await http.get(endpoint);
|
|
if (response.statusCode == 200) {
|
|
final List<dynamic> data = jsonDecode(response.body);
|
|
_posts = data.map((json) => PostModel.fromJson(json)).toList();
|
|
notifyListeners();
|
|
} else {
|
|
_posts = [];
|
|
notifyListeners();
|
|
}
|
|
} catch (e) {
|
|
_posts = [];
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
Future<PostModel> addPost(PostModel post) async {
|
|
final response = await http.post(
|
|
Uri.parse('$baseUrl/add'),
|
|
headers: {'Content-Type': 'application/json'},
|
|
body: jsonEncode(post.toJson()),
|
|
);
|
|
|
|
if (response.statusCode == 200 || response.statusCode == 201) {
|
|
final decoded = jsonDecode(response.body);
|
|
|
|
// Om decoded bara är ett heltal, använd det som id
|
|
if (decoded is int) {
|
|
return PostModel(
|
|
id: decoded,
|
|
title: post.title,
|
|
body: post.body,
|
|
filename: post.filename,
|
|
filetype: post.filetype,
|
|
time: post.time,
|
|
locationname: post.locationname,
|
|
latitude: post.latitude,
|
|
longitude: post.longitude,
|
|
points: post.points,
|
|
teamid: post.teamid,
|
|
missionid: post.missionid,
|
|
approved: post.approved,
|
|
);
|
|
} else {
|
|
throw Exception("Oväntat svar från servern: $decoded");
|
|
}
|
|
} else {
|
|
throw Exception("Kunde inte skapa inlägg");
|
|
}
|
|
}
|
|
|
|
Future<void> deletePost(PostModel post) async {
|
|
if (post.id == null) {
|
|
throw Exception("Post har inget id och kan inte raderas");
|
|
}
|
|
|
|
final endpoint = Uri.parse('$baseUrl/delete/${post.id}');
|
|
final response = await http.delete(endpoint);
|
|
|
|
if (response.statusCode != 200) {
|
|
throw Exception("Kunde inte radera inlägg: ${response.body}");
|
|
}
|
|
}
|
|
|
|
Future<void> updatePostStatus(PostModel post, PostStatus newStatus) async {
|
|
final endpoint = Uri.parse('$baseUrl/setstatus/${post.id}');
|
|
|
|
try {
|
|
final response = await http.put(
|
|
endpoint,
|
|
headers: {"Content-Type": "application/json"},
|
|
body: jsonEncode({
|
|
"approved": newStatus.name,
|
|
"timeupdated": DateTime.now().toIso8601String(),
|
|
}),
|
|
);
|
|
|
|
if (response.statusCode != 200) {
|
|
throw Exception(
|
|
"Kunde inte uppdatera status. Servern svarade med ${response.statusCode}",
|
|
);
|
|
}
|
|
|
|
// Uppdatera lokalt efter lyckad PUT
|
|
await loadPosts();
|
|
} catch (e) {
|
|
throw Exception("Något gick fel vid statusuppdatering: $e");
|
|
}
|
|
}
|
|
}
|