Added Nextcloud base

This commit is contained in:
2023-02-20 10:56:51 +01:00
parent e54ae9c2ff
commit fea36b9a6d
63 changed files with 1863 additions and 700 deletions

@ -4,36 +4,5 @@ import 'package:http/http.dart' as http;
import 'package:marianum_mobile/api/apiError.dart';
class ApiRequest {
Uri endpoint;
ApiRequest(this.endpoint);
Future<http.Response> get(Map<String, String>? headers) async {
return await http.get(endpoint, headers: headers);
}
Future<http.Response> post(String data, Map<String, String>? headers) async {
log("Fetching: ${data}");
try {
http.Response response = await http
.post(endpoint, body: data, headers: headers)
.timeout(
const Duration(seconds: 10),
onTimeout: () {
log("timeout!");
throw ApiError("Network timeout");
}
);
if(response.statusCode != 200) {
log("Got ${response.statusCode}");
throw ApiError("Service response invalid, got status ${response.statusCode}");
}
return response;
} on Exception catch(e) {
throw ApiError("Http: ${e.toString()}");
}
}
}

@ -0,0 +1,26 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:http/src/response.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/chat/getChatResponse.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/talkApi.dart';
import 'getChatParams.dart';
class GetChat extends TalkApi<GetChatResponse> {
String chatToken;
GetChatParams params;
GetChat(this.chatToken, this.params) : super("v1/chat/$chatToken", null, getParameters: params.toJson());
@override
assemble(String raw) {
return GetChatResponse.fromJson(jsonDecode(raw)['ocs']); // TODO move "ocs" to superclass
}
@override
Future<Response> request(Uri uri, Object? body, Map<String, String>? headers) {
return http.get(uri, headers: headers);
}
}

@ -0,0 +1,30 @@
import 'dart:convert';
import 'package:marianum_mobile/api/marianumcloud/talk/chat/getChat.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/chat/getChatParams.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/chat/getChatResponse.dart';
import 'package:marianum_mobile/api/requestCache.dart';
class GetChatCache extends RequestCache<GetChatResponse> {
String chatToken;
GetChatCache({required onUpdate, required this.chatToken}) : super(RequestCache.cacheNothing, onUpdate) {
start("MarianumMobile", "nc-chat-$chatToken");
}
@override
Future<GetChatResponse> onLoad() {
return GetChat(
chatToken,
GetChatParams(
lookIntoFuture: GetChatParamsSwitch.off
)
).run();
}
@override
GetChatResponse onLocalData(String json) {
return GetChatResponse.fromJson(jsonDecode(json));
}
}

@ -0,0 +1,33 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/apiParams.dart';
part 'getChatParams.g.dart';
@JsonSerializable(explicitToJson: true, includeIfNull: false)
class GetChatParams extends ApiParams {
GetChatParamsSwitch lookIntoFuture;
int? limit;
int? lastKnownMessageId;
int? lastCommonReadId;
int? timeout;
GetChatParamsSwitch? setReadMarker;
GetChatParamsSwitch? includeLastKnown;
GetChatParams({
required this.lookIntoFuture,
this.limit,
this.lastKnownMessageId,
this.lastCommonReadId,
this.timeout,
this.setReadMarker,
this.includeLastKnown
});
factory GetChatParams.fromJson(Map<String, dynamic> json) => _$GetChatParamsFromJson(json);
Map<String, dynamic> toJson() => _$GetChatParamsToJson(this);
}
enum GetChatParamsSwitch {
@JsonValue(1) on,
@JsonValue(0) off,
}

@ -0,0 +1,48 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'getChatParams.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
GetChatParams _$GetChatParamsFromJson(Map<String, dynamic> json) =>
GetChatParams(
lookIntoFuture:
$enumDecode(_$GetChatParamsSwitchEnumMap, json['lookIntoFuture']),
limit: json['limit'] as int?,
lastKnownMessageId: json['lastKnownMessageId'] as int?,
lastCommonReadId: json['lastCommonReadId'] as int?,
timeout: json['timeout'] as int?,
setReadMarker: $enumDecodeNullable(
_$GetChatParamsSwitchEnumMap, json['setReadMarker']),
includeLastKnown: $enumDecodeNullable(
_$GetChatParamsSwitchEnumMap, json['includeLastKnown']),
);
Map<String, dynamic> _$GetChatParamsToJson(GetChatParams instance) {
final val = <String, dynamic>{
'lookIntoFuture': _$GetChatParamsSwitchEnumMap[instance.lookIntoFuture]!,
};
void writeNotNull(String key, dynamic value) {
if (value != null) {
val[key] = value;
}
}
writeNotNull('limit', instance.limit);
writeNotNull('lastKnownMessageId', instance.lastKnownMessageId);
writeNotNull('lastCommonReadId', instance.lastCommonReadId);
writeNotNull('timeout', instance.timeout);
writeNotNull(
'setReadMarker', _$GetChatParamsSwitchEnumMap[instance.setReadMarker]);
writeNotNull('includeLastKnown',
_$GetChatParamsSwitchEnumMap[instance.includeLastKnown]);
return val;
}
const _$GetChatParamsSwitchEnumMap = {
GetChatParamsSwitch.on: 1,
GetChatParamsSwitch.off: 0,
};

@ -0,0 +1,53 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomResponse.dart';
part 'getChatResponse.g.dart';
@JsonSerializable(explicitToJson: true)
class GetChatResponse extends ApiResponse {
Set<GetChatResponseObject> data;
GetChatResponse(this.data);
factory GetChatResponse.fromJson(Map<String, dynamic> json) => _$GetChatResponseFromJson(json);
Map<String, dynamic> toJson() => _$GetChatResponseToJson(this);
List<GetChatResponseObject> sortByTimestamp() {
List<GetChatResponseObject> sorted = data.toList();
sorted.sort((a, b) => a.timestamp.compareTo(b.timestamp));
return sorted;
}
}
@JsonSerializable(explicitToJson: true)
class GetChatResponseObject {
int id;
String token;
GetRoomResponseObjectMessageActorType actorType;
String actorId;
String actorDisplayName;
int timestamp;
String systemMessage;
GetRoomResponseObjectMessageType messageType;
bool isReplyable;
String referenceId;
String message;
GetChatResponseObject(
this.id,
this.token,
this.actorType,
this.actorId,
this.actorDisplayName,
this.timestamp,
this.systemMessage,
this.messageType,
this.isReplyable,
this.referenceId,
this.message);
factory GetChatResponseObject.fromJson(Map<String, dynamic> json) => _$GetChatResponseObjectFromJson(json);
Map<String, dynamic> toJson() => _$GetChatResponseObjectToJson(this);
}

@ -0,0 +1,69 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'getChatResponse.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
GetChatResponse _$GetChatResponseFromJson(Map<String, dynamic> json) =>
GetChatResponse(
(json['data'] as List<dynamic>)
.map((e) => GetChatResponseObject.fromJson(e as Map<String, dynamic>))
.toSet(),
);
Map<String, dynamic> _$GetChatResponseToJson(GetChatResponse instance) =>
<String, dynamic>{
'data': instance.data.map((e) => e.toJson()).toList(),
};
GetChatResponseObject _$GetChatResponseObjectFromJson(
Map<String, dynamic> json) =>
GetChatResponseObject(
json['id'] as int,
json['token'] as String,
$enumDecode(
_$GetRoomResponseObjectMessageActorTypeEnumMap, json['actorType']),
json['actorId'] as String,
json['actorDisplayName'] as String,
json['timestamp'] as int,
json['systemMessage'] as String,
$enumDecode(
_$GetRoomResponseObjectMessageTypeEnumMap, json['messageType']),
json['isReplyable'] as bool,
json['referenceId'] as String,
json['message'] as String,
);
Map<String, dynamic> _$GetChatResponseObjectToJson(
GetChatResponseObject instance) =>
<String, dynamic>{
'id': instance.id,
'token': instance.token,
'actorType':
_$GetRoomResponseObjectMessageActorTypeEnumMap[instance.actorType]!,
'actorId': instance.actorId,
'actorDisplayName': instance.actorDisplayName,
'timestamp': instance.timestamp,
'systemMessage': instance.systemMessage,
'messageType':
_$GetRoomResponseObjectMessageTypeEnumMap[instance.messageType]!,
'isReplyable': instance.isReplyable,
'referenceId': instance.referenceId,
'message': instance.message,
};
const _$GetRoomResponseObjectMessageActorTypeEnumMap = {
GetRoomResponseObjectMessageActorType.user: 'users',
GetRoomResponseObjectMessageActorType.guest: 'guests',
GetRoomResponseObjectMessageActorType.bot: 'bots',
GetRoomResponseObjectMessageActorType.bridge: 'bridged',
};
const _$GetRoomResponseObjectMessageTypeEnumMap = {
GetRoomResponseObjectMessageType.comment: 'comment',
GetRoomResponseObjectMessageType.deletedComment: 'comment_deleted',
GetRoomResponseObjectMessageType.system: 'system',
GetRoomResponseObjectMessageType.command: 'command',
};

@ -0,0 +1,32 @@
import 'dart:convert';
import 'dart:developer';
import 'package:http/http.dart' as http;
import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomResponse.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/talkApi.dart';
import 'getRoomParams.dart';
class GetRoom extends TalkApi<GetRoomResponse> {
GetRoomParams params;
GetRoom(this.params) : super("v4/room", null, getParameters: params.toJson());
@override
GetRoomResponse assemble(String raw) {
log("ASSEMBLING");
log(raw);
return GetRoomResponse.fromJson(jsonDecode(raw)['ocs']);
}
@override
Future<http.Response> request(Uri uri, Object? body, Map<String, String>? headers) {
log("REQUSTING...");
log(uri.toString());
log(headers.toString());
return http.get(uri, headers: headers);
}
}

@ -0,0 +1,30 @@
import 'dart:convert';
import 'dart:developer';
import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomParams.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomResponse.dart';
import 'package:marianum_mobile/api/requestCache.dart';
import 'getRoom.dart';
class GetRoomCache extends RequestCache<GetRoomResponse> {
GetRoomCache({onUpdate}) : super(RequestCache.cacheMinute, onUpdate) {
start("MarianumMobile", "nc-rooms");
}
@override
GetRoomResponse onLocalData(String json) {
log("LOCAL DATA FOUND");
return GetRoomResponse.fromJson(jsonDecode(json));
}
@override
Future<GetRoomResponse> onLoad() {
log("FETCHING DATA");
return GetRoom(
GetRoomParams(
includeStatus: true,
)
).run();
}
}

@ -0,0 +1,26 @@
import 'dart:convert';
import 'package:json_annotation/json_annotation.dart';
import '../../../apiParams.dart';
part 'getRoomParams.g.dart';
@JsonSerializable(explicitToJson: true)
class GetRoomParams extends ApiParams {
GetRoomParamsStatusUpdate? noStatusUpdate;
@JsonKey(toJson: _format) bool? includeStatus;
int? modifiedSince;
GetRoomParams({this.noStatusUpdate, this.includeStatus, this.modifiedSince});
factory GetRoomParams.fromJson(Map<String, dynamic> json) => _$GetRoomParamsFromJson(json);
Map<String, dynamic> toJson() => _$GetRoomParamsToJson(this);
static String _format(bool? v) => v.toString();
}
enum GetRoomParamsStatusUpdate {
@JsonValue(0) defaults,
@JsonValue(1) keepAlive,
}

@ -0,0 +1,28 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'getRoomParams.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
GetRoomParams _$GetRoomParamsFromJson(Map<String, dynamic> json) =>
GetRoomParams(
noStatusUpdate: $enumDecodeNullable(
_$GetRoomParamsStatusUpdateEnumMap, json['noStatusUpdate']),
includeStatus: json['includeStatus'] as bool?,
modifiedSince: json['modifiedSince'] as int?,
);
Map<String, dynamic> _$GetRoomParamsToJson(GetRoomParams instance) =>
<String, dynamic>{
'noStatusUpdate':
_$GetRoomParamsStatusUpdateEnumMap[instance.noStatusUpdate],
'includeStatus': GetRoomParams._format(instance.includeStatus),
'modifiedSince': instance.modifiedSince,
};
const _$GetRoomParamsStatusUpdateEnumMap = {
GetRoomParamsStatusUpdate.defaults: 0,
GetRoomParamsStatusUpdate.keepAlive: 1,
};

@ -0,0 +1,151 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
part 'getRoomResponse.g.dart';
@JsonSerializable(explicitToJson: true)
class GetRoomResponse extends ApiResponse {
Set<GetRoomResponseObject> data;
GetRoomResponse(this.data);
factory GetRoomResponse.fromJson(Map<String, dynamic> json) => _$GetRoomResponseFromJson(json);
Map<String, dynamic> toJson() => _$GetRoomResponseToJson(this);
List<GetRoomResponseObject> sortByLastActivity() {
List<GetRoomResponseObject> sorted = data.toList();
sorted.sort((a, b) => -a.lastActivity.compareTo(b.lastActivity));
return sorted;
}
}
@JsonSerializable(explicitToJson: true)
class GetRoomResponseObject {
int id;
String token;
GetRoomResponseObjectConversationType type;
String name;
String displayName;
String description;
int participantType;
int participantFlags;
int readOnly;
int listable;
int lastPing;
String sessionId;
bool hasPassword;
bool hasCall;
int callFlag;
bool canStartCall;
bool canDeleteConversation;
bool canLeaveConversation;
int lastActivity;
bool isFavorite;
GetRoomResponseObjectParticipantNotificationLevel notificationLevel;
int unreadMessages;
bool unreadMention;
bool unreadMentionDirect;
int lastReadMessage;
int lastCommonReadMessage;
GetRoomResponseObjectMessage lastMessage;
String? status;
String? statusIcon;
String? statusMessage;
GetRoomResponseObject(
this.id,
this.token,
this.type,
this.name,
this.displayName,
this.description,
this.participantType,
this.participantFlags,
this.readOnly,
this.listable,
this.lastPing,
this.sessionId,
this.hasPassword,
this.hasCall,
this.callFlag,
this.canStartCall,
this.canDeleteConversation,
this.canLeaveConversation,
this.lastActivity,
this.isFavorite,
this.notificationLevel,
this.unreadMessages,
this.unreadMention,
this.unreadMentionDirect,
this.lastReadMessage,
this.lastCommonReadMessage,
this.lastMessage,
this.status,
this.statusIcon,
this.statusMessage);
factory GetRoomResponseObject.fromJson(Map<String, dynamic> json) => _$GetRoomResponseObjectFromJson(json);
Map<String, dynamic> toJson() => _$GetRoomResponseObjectToJson(this);
}
enum GetRoomResponseObjectConversationType {
@JsonValue(1) oneToOne,
@JsonValue(2) group,
@JsonValue(3) public,
@JsonValue(4) changelog,
@JsonValue(5) deleted,
}
enum GetRoomResponseObjectParticipantNotificationLevel {
@JsonValue(0) defaultLevel,
@JsonValue(1) alwaysNotify,
@JsonValue(2) notifyOnMention,
@JsonValue(3) neverNotify,
}
@JsonSerializable(explicitToJson: true)
class GetRoomResponseObjectMessage {
int id;
String token;
GetRoomResponseObjectMessageActorType actorType;
String actorId;
String actorDisplayName;
int timestamp;
String message;
String systemMessage;
GetRoomResponseObjectMessageType messageType;
bool isReplyable;
String referenceId;
GetRoomResponseObjectMessage(
this.id,
this.token,
this.actorType,
this.actorId,
this.actorDisplayName,
this.timestamp,
this.message,
this.systemMessage,
this.messageType,
this.isReplyable,
this.referenceId);
factory GetRoomResponseObjectMessage.fromJson(Map<String, dynamic> json) => _$GetRoomResponseObjectMessageFromJson(json);
Map<String, dynamic> toJson() => _$GetRoomResponseObjectMessageToJson(this);
}
enum GetRoomResponseObjectMessageActorType {
@JsonValue("users") user,
@JsonValue("guests") guest,
@JsonValue("bots") bot,
@JsonValue("bridged") bridge,
}
enum GetRoomResponseObjectMessageType {
@JsonValue("comment") comment,
@JsonValue("comment_deleted") deletedComment,
@JsonValue("system") system,
@JsonValue("command") command,
}

@ -0,0 +1,158 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'getRoomResponse.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
GetRoomResponse _$GetRoomResponseFromJson(Map<String, dynamic> json) =>
GetRoomResponse(
(json['data'] as List<dynamic>)
.map((e) => GetRoomResponseObject.fromJson(e as Map<String, dynamic>))
.toSet(),
);
Map<String, dynamic> _$GetRoomResponseToJson(GetRoomResponse instance) =>
<String, dynamic>{
'data': instance.data.map((e) => e.toJson()).toList(),
};
GetRoomResponseObject _$GetRoomResponseObjectFromJson(
Map<String, dynamic> json) =>
GetRoomResponseObject(
json['id'] as int,
json['token'] as String,
$enumDecode(_$GetRoomResponseObjectConversationTypeEnumMap, json['type']),
json['name'] as String,
json['displayName'] as String,
json['description'] as String,
json['participantType'] as int,
json['participantFlags'] as int,
json['readOnly'] as int,
json['listable'] as int,
json['lastPing'] as int,
json['sessionId'] as String,
json['hasPassword'] as bool,
json['hasCall'] as bool,
json['callFlag'] as int,
json['canStartCall'] as bool,
json['canDeleteConversation'] as bool,
json['canLeaveConversation'] as bool,
json['lastActivity'] as int,
json['isFavorite'] as bool,
$enumDecode(_$GetRoomResponseObjectParticipantNotificationLevelEnumMap,
json['notificationLevel']),
json['unreadMessages'] as int,
json['unreadMention'] as bool,
json['unreadMentionDirect'] as bool,
json['lastReadMessage'] as int,
json['lastCommonReadMessage'] as int,
GetRoomResponseObjectMessage.fromJson(
json['lastMessage'] as Map<String, dynamic>),
json['status'] as String?,
json['statusIcon'] as String?,
json['statusMessage'] as String?,
);
Map<String, dynamic> _$GetRoomResponseObjectToJson(
GetRoomResponseObject instance) =>
<String, dynamic>{
'id': instance.id,
'token': instance.token,
'type': _$GetRoomResponseObjectConversationTypeEnumMap[instance.type]!,
'name': instance.name,
'displayName': instance.displayName,
'description': instance.description,
'participantType': instance.participantType,
'participantFlags': instance.participantFlags,
'readOnly': instance.readOnly,
'listable': instance.listable,
'lastPing': instance.lastPing,
'sessionId': instance.sessionId,
'hasPassword': instance.hasPassword,
'hasCall': instance.hasCall,
'callFlag': instance.callFlag,
'canStartCall': instance.canStartCall,
'canDeleteConversation': instance.canDeleteConversation,
'canLeaveConversation': instance.canLeaveConversation,
'lastActivity': instance.lastActivity,
'isFavorite': instance.isFavorite,
'notificationLevel':
_$GetRoomResponseObjectParticipantNotificationLevelEnumMap[
instance.notificationLevel]!,
'unreadMessages': instance.unreadMessages,
'unreadMention': instance.unreadMention,
'unreadMentionDirect': instance.unreadMentionDirect,
'lastReadMessage': instance.lastReadMessage,
'lastCommonReadMessage': instance.lastCommonReadMessage,
'lastMessage': instance.lastMessage.toJson(),
'status': instance.status,
'statusIcon': instance.statusIcon,
'statusMessage': instance.statusMessage,
};
const _$GetRoomResponseObjectConversationTypeEnumMap = {
GetRoomResponseObjectConversationType.oneToOne: 1,
GetRoomResponseObjectConversationType.group: 2,
GetRoomResponseObjectConversationType.public: 3,
GetRoomResponseObjectConversationType.changelog: 4,
GetRoomResponseObjectConversationType.deleted: 5,
};
const _$GetRoomResponseObjectParticipantNotificationLevelEnumMap = {
GetRoomResponseObjectParticipantNotificationLevel.defaultLevel: 0,
GetRoomResponseObjectParticipantNotificationLevel.alwaysNotify: 1,
GetRoomResponseObjectParticipantNotificationLevel.notifyOnMention: 2,
GetRoomResponseObjectParticipantNotificationLevel.neverNotify: 3,
};
GetRoomResponseObjectMessage _$GetRoomResponseObjectMessageFromJson(
Map<String, dynamic> json) =>
GetRoomResponseObjectMessage(
json['id'] as int,
json['token'] as String,
$enumDecode(
_$GetRoomResponseObjectMessageActorTypeEnumMap, json['actorType']),
json['actorId'] as String,
json['actorDisplayName'] as String,
json['timestamp'] as int,
json['message'] as String,
json['systemMessage'] as String,
$enumDecode(
_$GetRoomResponseObjectMessageTypeEnumMap, json['messageType']),
json['isReplyable'] as bool,
json['referenceId'] as String,
);
Map<String, dynamic> _$GetRoomResponseObjectMessageToJson(
GetRoomResponseObjectMessage instance) =>
<String, dynamic>{
'id': instance.id,
'token': instance.token,
'actorType':
_$GetRoomResponseObjectMessageActorTypeEnumMap[instance.actorType]!,
'actorId': instance.actorId,
'actorDisplayName': instance.actorDisplayName,
'timestamp': instance.timestamp,
'message': instance.message,
'systemMessage': instance.systemMessage,
'messageType':
_$GetRoomResponseObjectMessageTypeEnumMap[instance.messageType]!,
'isReplyable': instance.isReplyable,
'referenceId': instance.referenceId,
};
const _$GetRoomResponseObjectMessageActorTypeEnumMap = {
GetRoomResponseObjectMessageActorType.user: 'users',
GetRoomResponseObjectMessageActorType.guest: 'guests',
GetRoomResponseObjectMessageActorType.bot: 'bots',
GetRoomResponseObjectMessageActorType.bridge: 'bridged',
};
const _$GetRoomResponseObjectMessageTypeEnumMap = {
GetRoomResponseObjectMessageType.comment: 'comment',
GetRoomResponseObjectMessageType.deletedComment: 'comment_deleted',
GetRoomResponseObjectMessageType.system: 'system',
GetRoomResponseObjectMessageType.command: 'command',
};

@ -0,0 +1,51 @@
import 'dart:convert';
import 'dart:developer';
import 'package:http/http.dart' as http;
import 'package:marianum_mobile/api/apiRequest.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../apiParams.dart';
enum TalkApiMethod {
get,
post,
put,
delete,
}
abstract class TalkApi<T> extends ApiRequest {
String path;
ApiParams? body;
Map<String, String>? headers = {};
Map<String, dynamic>? getParameters;
http.Response? response;
TalkApi(this.path, this.body, {this.headers, this.getParameters});
Future<http.Response> request(Uri uri, Object? body, Map<String, String>? headers);
T assemble(String raw);
Future<T> run() async {
getParameters?.forEach((key, value) {
getParameters?.update(key, (value) => value.toString());
});
SharedPreferences preferences = await SharedPreferences.getInstance();
Uri endpoint = Uri.https("${preferences.getString("username")!}:${preferences.getString("password")!}@cloud.marianum-fulda.de", "/ocs/v2.php/apps/spreed/api/$path", getParameters);
headers ??= {};
headers?.putIfAbsent("Accept", () => "application/json");
headers?.putIfAbsent("OCS-APIRequest", () => "true");
http.Response data = await request(endpoint, body, headers);
dynamic jsonData = jsonDecode(data.body);
return assemble(data.body);
}
}

@ -0,0 +1,12 @@
class TalkError {
String status;
int code;
String message;
TalkError(this.status, this.code, this.message);
@override
String toString() {
return "Talk - $status - ($code): $message";
}
}

@ -0,0 +1,9 @@
import 'package:marianum_mobile/api/apiRequest.dart';
class WebdavApi extends ApiRequest {
String basePath;
WebdavApi(this.basePath);
}

@ -3,6 +3,11 @@ import 'dart:convert';
import 'package:localstore/localstore.dart';
abstract class RequestCache<T> {
static const int cacheNothing = 0;
static const int cacheMinute = 60;
static const int cacheHour = 60 * 60;
static const int cacheDay = 60 * 60 * 24;
int maxCacheTime;
Function(T) onUpdate;
@ -29,4 +34,5 @@ abstract class RequestCache<T> {
T onLocalData(String json);
Future<T> onLoad();
}

@ -1,6 +0,0 @@
import 'package:marianum_mobile/api/apiRequest.dart';
class RequestLoginTest extends ApiRequest {
RequestLoginTest(super.endpoint);
}

@ -1,5 +1,5 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/webuntis/apiParams.dart';
import 'package:marianum_mobile/api/apiParams.dart';
part 'authenticateParams.g.dart';

@ -1,5 +1,5 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
part 'authenticateResponse.g.dart';

@ -1,6 +1,8 @@
import 'dart:convert';
import 'dart:developer';
import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
import 'package:intl/intl.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
import 'package:marianum_mobile/api/webuntis/webuntisApi.dart';
import 'getHolidaysResponse.dart';
@ -14,4 +16,17 @@ class GetHolidays extends WebuntisApi {
return finalize(GetHolidaysResponse.fromJson(jsonDecode(rawAnswer)));
}
static GetHolidaysResponseObject? find(GetHolidaysResponse holidaysResponse, {DateTime? time}) {
time ??= DateTime.now();
time = DateTime(time.year, time.month, time.day, 0, 0, 0, 0, 0);
for (var element in holidaysResponse.result) {
DateTime start = DateTime.parse(element.startDate.toString());
DateTime end = DateTime.parse(element.endDate.toString());
if(!start.isAfter(time) && !end.isBefore(time)) return element;
}
return null;
}
}

@ -5,8 +5,8 @@ import 'package:marianum_mobile/api/webuntis/queries/getHolidays/getHolidays.dar
import 'package:marianum_mobile/api/webuntis/queries/getHolidays/getHolidaysResponse.dart';
class GetHolidaysCache extends RequestCache<GetHolidaysResponse> {
GetHolidaysCache({onUpdate}) : super(60 * 60, onUpdate) {
start("holidays", "data");
GetHolidaysCache({onUpdate}) : super(RequestCache.cacheDay, onUpdate) {
start("MarianumMobile", "wu-holidays");
}
@override

@ -1,5 +1,5 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
part 'getHolidaysResponse.g.dart';

@ -1,6 +1,6 @@
import 'dart:convert';
import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
import 'package:marianum_mobile/api/webuntis/webuntisApi.dart';
import 'getRoomsResponse.dart';

@ -6,8 +6,8 @@ import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRoomsResponse.d
import 'getRooms.dart';
class GetRoomsCache extends RequestCache<GetRoomsResponse> {
GetRoomsCache({onUpdate}) : super(60 * 60, onUpdate) {
start("rooms", "data");
GetRoomsCache({onUpdate}) : super(RequestCache.cacheHour, onUpdate) {
start("MarianumMobile", "wu-rooms");
}
@override

@ -1,5 +1,5 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
part 'getRoomsResponse.g.dart';
@ -21,7 +21,6 @@ class GetRoomsResponseObject {
bool active;
String building;
GetRoomsResponseObject(this.id, this.name, this.longName, this.active, this.building);
factory GetRoomsResponseObject.fromJson(Map<String, dynamic> json) => _$GetRoomsResponseObjectFromJson(json);

@ -2,7 +2,7 @@ import 'dart:convert';
import 'package:marianum_mobile/api/webuntis/webuntisApi.dart';
import '../../apiResponse.dart';
import '../../../apiResponse.dart';
import 'getSubjectsResponse.dart';
class GetSubjects extends WebuntisApi {

@ -6,8 +6,8 @@ import 'package:marianum_mobile/api/webuntis/queries/getSubjects/getSubjectsResp
import 'getSubjects.dart';
class GetSubjectsCache extends RequestCache<GetSubjectsResponse> {
GetSubjectsCache({onUpdate}) : super(60 * 60, onUpdate) {
start("subjects", "data");
GetSubjectsCache({onUpdate}) : super(RequestCache.cacheHour, onUpdate) {
start("MarianumMobile", "wu-subjects");
}
@override

@ -1,5 +1,5 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
part 'getSubjectsResponse.g.dart';

@ -1,7 +1,7 @@
import 'dart:convert';
import 'dart:developer';
import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
import 'package:marianum_mobile/api/webuntis/webuntisApi.dart';
import 'getTimetableParams.dart';

@ -12,8 +12,8 @@ import 'getTimetableResponse.dart';
class GetTimetableCache extends RequestCache<GetTimetableResponse> {
int day;
GetTimetableCache({required onUpdate, required this.day}) : super(30, onUpdate) {
start("timetable", "$day");
GetTimetableCache({required onUpdate, required this.day}) : super(RequestCache.cacheMinute, onUpdate) {
start("MarianumMobile", "wu-timetable-$day");
}
@override
@ -25,14 +25,18 @@ class GetTimetableCache extends RequestCache<GetTimetableResponse> {
Future<GetTimetableResponse> onLoad() async {
return GetTimetable(
GetTimetableParams(
options: GetTimetableParamsOptions(
element: GetTimetableParamsOptionsElement(
id: (await Authenticate.getSession()).personId,
type: 5,
keyType: GetTimetableParamsOptionsElementKeyType.id,
),
startDate: day,
endDate: day,
options: GetTimetableParamsOptions(
element: GetTimetableParamsOptionsElement(
id: (await Authenticate.getSession()).personId,
type: 5,
keyType: GetTimetableParamsOptionsElementKeyType.id,
),
startDate: day,
endDate: day,
teacherFields: GetTimetableParamsOptionsFields.all,
subjectFields: GetTimetableParamsOptionsFields.all,
roomFields: GetTimetableParamsOptionsFields.all,
klasseFields: GetTimetableParamsOptionsFields.all,
)
)
).run();

@ -1,5 +1,5 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/webuntis/apiParams.dart';
import 'package:marianum_mobile/api/apiParams.dart';
part 'getTimetableParams.g.dart';
@ -36,13 +36,13 @@ class GetTimetableParamsOptions {
@JsonKey(includeIfNull: false)
bool? showStudentgroup;
@JsonKey(includeIfNull: false)
GetTimetableParamsOptionsFields? klasseFields;
List<GetTimetableParamsOptionsFields>? klasseFields;
@JsonKey(includeIfNull: false)
GetTimetableParamsOptionsFields? roomFields;
List<GetTimetableParamsOptionsFields>? roomFields;
@JsonKey(includeIfNull: false)
GetTimetableParamsOptionsFields? subjectFields;
List<GetTimetableParamsOptionsFields>? subjectFields;
@JsonKey(includeIfNull: false)
GetTimetableParamsOptionsFields? teacherFields;
List<GetTimetableParamsOptionsFields>? teacherFields;
GetTimetableParamsOptions({
required this.element,
@ -69,7 +69,9 @@ enum GetTimetableParamsOptionsFields {
@JsonValue("id") id,
@JsonValue("name") name,
@JsonValue("longname") longname,
@JsonValue("externalkey") externalkey,
@JsonValue("externalkey") externalkey;
static List<GetTimetableParamsOptionsFields> all = [id, name, longname, externalkey];
}
@JsonSerializable()

@ -31,14 +31,18 @@ GetTimetableParamsOptions _$GetTimetableParamsOptionsFromJson(
showLsText: json['showLsText'] as bool?,
showLsNumber: json['showLsNumber'] as bool?,
showStudentgroup: json['showStudentgroup'] as bool?,
klasseFields: $enumDecodeNullable(
_$GetTimetableParamsOptionsFieldsEnumMap, json['klasseFields']),
roomFields: $enumDecodeNullable(
_$GetTimetableParamsOptionsFieldsEnumMap, json['roomFields']),
subjectFields: $enumDecodeNullable(
_$GetTimetableParamsOptionsFieldsEnumMap, json['subjectFields']),
teacherFields: $enumDecodeNullable(
_$GetTimetableParamsOptionsFieldsEnumMap, json['teacherFields']),
klasseFields: (json['klasseFields'] as List<dynamic>?)
?.map((e) => $enumDecode(_$GetTimetableParamsOptionsFieldsEnumMap, e))
.toList(),
roomFields: (json['roomFields'] as List<dynamic>?)
?.map((e) => $enumDecode(_$GetTimetableParamsOptionsFieldsEnumMap, e))
.toList(),
subjectFields: (json['subjectFields'] as List<dynamic>?)
?.map((e) => $enumDecode(_$GetTimetableParamsOptionsFieldsEnumMap, e))
.toList(),
teacherFields: (json['teacherFields'] as List<dynamic>?)
?.map((e) => $enumDecode(_$GetTimetableParamsOptionsFieldsEnumMap, e))
.toList(),
);
Map<String, dynamic> _$GetTimetableParamsOptionsToJson(
@ -62,14 +66,26 @@ Map<String, dynamic> _$GetTimetableParamsOptionsToJson(
writeNotNull('showLsText', instance.showLsText);
writeNotNull('showLsNumber', instance.showLsNumber);
writeNotNull('showStudentgroup', instance.showStudentgroup);
writeNotNull('klasseFields',
_$GetTimetableParamsOptionsFieldsEnumMap[instance.klasseFields]);
writeNotNull('roomFields',
_$GetTimetableParamsOptionsFieldsEnumMap[instance.roomFields]);
writeNotNull('subjectFields',
_$GetTimetableParamsOptionsFieldsEnumMap[instance.subjectFields]);
writeNotNull('teacherFields',
_$GetTimetableParamsOptionsFieldsEnumMap[instance.teacherFields]);
writeNotNull(
'klasseFields',
instance.klasseFields
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
.toList());
writeNotNull(
'roomFields',
instance.roomFields
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
.toList());
writeNotNull(
'subjectFields',
instance.subjectFields
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
.toList());
writeNotNull(
'teacherFields',
instance.teacherFields
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
.toList());
return val;
}

@ -1,5 +1,5 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
part 'getTimetableResponse.g.dart';

@ -3,19 +3,20 @@ import 'dart:developer';
import 'package:marianum_mobile/api/apiRequest.dart';
import 'package:http/http.dart' as http;
import 'package:marianum_mobile/api/webuntis/webuntisError.dart';
import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
import 'package:marianum_mobile/api/apiResponse.dart';
import 'apiParams.dart';
import '../apiParams.dart';
import 'queries/authenticate/authenticate.dart';
abstract class WebuntisApi extends ApiRequest {
Uri endpoint = Uri.parse("https://peleus.webuntis.com/WebUntis/jsonrpc.do?school=marianum-fulda");
String method;
ApiParams? genericParam;
http.Response? response;
bool authenticatedResponse;
WebuntisApi(this.method, this.genericParam, {this.authenticatedResponse = true}) : super(Uri.parse("https://peleus.webuntis.com/WebUntis/jsonrpc.do?school=marianum-fulda"));
WebuntisApi(this.method, this.genericParam, {this.authenticatedResponse = true});
Future<String> query(WebuntisApi untis) async {
@ -50,4 +51,14 @@ abstract class WebuntisApi extends ApiRequest {
String _body() {
return genericParam == null ? "{}" : jsonEncode(genericParam);
}
Future<http.Response> post(String data, Map<String, String>? headers) async {
log("POST: $endpoint\n$data");
return await http
.post(endpoint, body: data, headers: headers)
.timeout(
const Duration(seconds: 10),
onTimeout: () => throw WebuntisError("Timeout", 1)
);
}
}

@ -4,6 +4,7 @@ class WebuntisError {
WebuntisError(this.message, this.code);
@override
String toString() {
return "WebUntis ($code): $message";
}