From 8238cc06787c43bc3bdd951c73671a8089352069 Mon Sep 17 00:00:00 2001 From: unknown <55nknown@pm.me> Date: Sat, 11 Sep 2021 17:55:27 +0200 Subject: [PATCH] role --- filcnaplo/lib/api/login.dart | 27 +++++++++++++++------------ filcnaplo/lib/models/user.dart | 9 +++++++++ filcnaplo/lib/utils/jwt.dart | 29 +++++++++++++++++++++++++---- filcnaplo_kreta_api | 2 +- filcnaplo_mobile_ui | 2 +- 5 files changed, 51 insertions(+), 18 deletions(-) diff --git a/filcnaplo/lib/api/login.dart b/filcnaplo/lib/api/login.dart index 65d79b5..9b8abb1 100644 --- a/filcnaplo/lib/api/login.dart +++ b/filcnaplo/lib/api/login.dart @@ -1,3 +1,4 @@ +import 'package:filcnaplo/utils/jwt.dart'; import 'package:filcnaplo_kreta_api/providers/absence_provider.dart'; import 'package:filcnaplo_kreta_api/providers/event_provider.dart'; import 'package:filcnaplo_kreta_api/providers/exam_provider.dart'; @@ -10,10 +11,8 @@ import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/api/providers/database_provider.dart'; import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/models/user.dart'; -import 'package:filcnaplo/utils/jwt.dart'; import 'package:filcnaplo_kreta_api/client/api.dart'; import 'package:filcnaplo_kreta_api/client/client.dart'; -import 'package:filcnaplo_kreta_api/models/message.dart'; import 'package:filcnaplo_kreta_api/models/student.dart'; import 'package:filcnaplo_kreta_api/models/week.dart'; import 'package:flutter/material.dart'; @@ -65,12 +64,14 @@ Future loginApi({ try { Provider.of(context, listen: false).accessToken = res["access_token"]; Map? studentJson = await Provider.of(context, listen: false).getAPI(KretaAPI.student(instituteCode)); + Student student = Student.fromJson(studentJson!); var user = User( username: username, password: password, instituteCode: instituteCode, - name: JwtUtils.getNameFromJWT(res["access_token"]) ?? "?", - student: Student.fromJson(studentJson!), + name: student.name, + student: student, + role: JwtUtils.getRoleFromJWT(res["access_token"])!, ); if (onLogin != null) onLogin(user); @@ -82,14 +83,16 @@ Future loginApi({ // Get user data try { - await Provider.of(context, listen: false).fetch(); - await Provider.of(context, listen: false).fetch(week: Week.current()); - await Provider.of(context, listen: false).fetch(); - await Provider.of(context, listen: false).fetch(); - await Provider.of(context, listen: false).fetch(type: MessageType.inbox); - await Provider.of(context, listen: false).fetch(); - await Provider.of(context, listen: false).fetch(); - await Provider.of(context, listen: false).fetch(); + await Future.wait([ + Provider.of(context, listen: false).fetch(), + Provider.of(context, listen: false).fetch(week: Week.current()), + Provider.of(context, listen: false).fetch(), + Provider.of(context, listen: false).fetch(), + Provider.of(context, listen: false).fetchAll(), + Provider.of(context, listen: false).fetch(), + Provider.of(context, listen: false).fetch(), + Provider.of(context, listen: false).fetch(), + ]); } catch (error) { print("WARNING: failed to fetch user data: $error"); } diff --git a/filcnaplo/lib/models/user.dart b/filcnaplo/lib/models/user.dart index 11eaa8e..4f6d39b 100644 --- a/filcnaplo/lib/models/user.dart +++ b/filcnaplo/lib/models/user.dart @@ -3,6 +3,8 @@ import 'package:filcnaplo_kreta_api/client/api.dart'; import 'package:filcnaplo_kreta_api/models/student.dart'; import 'package:uuid/uuid.dart'; +enum Role { student, parent } + class User { late String id; String username; @@ -10,6 +12,7 @@ class User { String instituteCode; String name; Student student; + Role role; User({ String? id, @@ -18,6 +21,7 @@ class User { required this.password, required this.instituteCode, required this.student, + required this.role, }) { if (id != null) { this.id = id; @@ -34,6 +38,7 @@ class User { password: map["password"], name: map["name"].trim(), student: Student.fromJson(jsonDecode(map["student"])), + role: Role.values[map["role"] ?? 0], ); } @@ -45,9 +50,13 @@ class User { "institute_code": instituteCode, "name": name, "student": jsonEncode(student.json), + "role": role.index, }; } + @override + String toString() => jsonEncode(toMap()); + static Map loginBody({ required String username, required String password, diff --git a/filcnaplo/lib/utils/jwt.dart b/filcnaplo/lib/utils/jwt.dart index 3540f66..0a25deb 100644 --- a/filcnaplo/lib/utils/jwt.dart +++ b/filcnaplo/lib/utils/jwt.dart @@ -1,7 +1,9 @@ import 'dart:convert'; +import 'package:filcnaplo/models/user.dart'; + class JwtUtils { - static String? getNameFromJWT(String jwt) { + static Map? decodeJwt(String jwt) { var parts = jwt.split("."); if (parts.length != 3) return null; @@ -11,8 +13,27 @@ class JwtUtils { parts[1] += "="; } - var payload = utf8.decode(base64Url.decode(parts[1])); - var jwtData = jsonDecode(payload); - return jwtData["name"]; + try { + var payload = utf8.decode(base64Url.decode(parts[1])); + return jsonDecode(payload); + } catch (error) { + print("ERROR: JwtUtils.decodeJwt: $error"); + } + } + + static String? getNameFromJWT(String jwt) { + var jwtData = decodeJwt(jwt); + return jwtData?["name"]; + } + + static Role? getRoleFromJWT(String jwt) { + var jwtData = decodeJwt(jwt); + + switch (jwtData?["role"]) { + case "Tanulo": + return Role.student; + case "Gondviselo": + return Role.parent; + } } } diff --git a/filcnaplo_kreta_api b/filcnaplo_kreta_api index e6a0bd3..cfc6b7d 160000 --- a/filcnaplo_kreta_api +++ b/filcnaplo_kreta_api @@ -1 +1 @@ -Subproject commit e6a0bd36bf81cf13e529ed741a1e9dc9ed8e5a3f +Subproject commit cfc6b7daa0aed43ef76c1ec8c50ffb37d8f4f059 diff --git a/filcnaplo_mobile_ui b/filcnaplo_mobile_ui index 7b2ff22..1ab2305 160000 --- a/filcnaplo_mobile_ui +++ b/filcnaplo_mobile_ui @@ -1 +1 @@ -Subproject commit 7b2ff224c0efe717329e8c605a89ecabc46c10b0 +Subproject commit 1ab230519d554425df22bbbda3217d1e1afd0d95