Skip to content

Commit a666156

Browse files
committed
Get album permissions
1 parent 976073e commit a666156

5 files changed

Lines changed: 326 additions & 52 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class AlbumPermissionModel {
2+
final int albumId;
3+
final List<int> users;
4+
final List<int> indirectUsers;
5+
final List<int> groups;
6+
7+
const AlbumPermissionModel({
8+
required this.albumId,
9+
this.users = const [],
10+
this.indirectUsers = const [],
11+
this.groups = const [],
12+
});
13+
14+
AlbumPermissionModel.fromJson(Map<String, dynamic> json)
15+
: albumId = json['id'],
16+
users = json['users']?.cast<int>() ?? [],
17+
indirectUsers = json['users_indirect']?.cast<int>() ?? [],
18+
groups = json['groups']?.cast<int>() ?? [];
19+
20+
Map<String, dynamic> toJson() => {
21+
'id': albumId,
22+
'users': users,
23+
'users_indirect': indirectUsers,
24+
'groups': groups,
25+
};
26+
}

lib/network/groups.dart

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,63 @@ import 'package:piwigo_ng/utils/settings.dart';
88

99
import 'api_error.dart';
1010

11+
Future<List<GroupModel>?> getAllGroups({
12+
List<int>? groups,
13+
String? name,
14+
}) async {
15+
int page = 0;
16+
bool reachedEnd = false;
17+
List<GroupModel> groupsResponse = [];
18+
19+
Map<String, dynamic> queries = {
20+
'format': 'json',
21+
'method': 'pwg.groups.getList',
22+
'order': Settings.defaultGroupSort,
23+
'per_page': Settings.defaultElementPerPage,
24+
'page': page,
25+
};
26+
27+
if (groups != null) queries['groups[]'] = groups;
28+
if (name != null) queries['name'] = "$name%";
29+
30+
try {
31+
while (!reachedEnd) {
32+
Response response = await ApiClient.get(queryParameters: queries);
33+
34+
if (response.statusCode == 200) {
35+
Map<String, dynamic> data = json.decode(response.data);
36+
37+
var jsonGroups = data['result']['groups'];
38+
39+
List<GroupModel> pageGroups = List<GroupModel>.from(
40+
jsonGroups.map((group) => GroupModel.fromJson(group)),
41+
);
42+
43+
groupsResponse.addAll(pageGroups);
44+
45+
if (pageGroups.length < Settings.defaultElementPerPage) {
46+
reachedEnd = true;
47+
} else {
48+
page++;
49+
queries['page'] = page;
50+
}
51+
} else {
52+
if (groupsResponse.isEmpty) {
53+
return null;
54+
}
55+
reachedEnd = true;
56+
}
57+
}
58+
59+
return groupsResponse;
60+
} on DioError catch (e) {
61+
debugPrint('Fetch all groups: ${e.message}');
62+
} on Error catch (e) {
63+
debugPrint('Fetch all groups: ${e.stackTrace}');
64+
}
65+
return null;
66+
}
67+
1168
Future<ApiResponse<List<GroupModel>?>> getGroups([int page = 0]) async {
1269
Map<String, dynamic> queries = {
1370
'format': 'json',

lib/network/permissions.dart

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
import 'dart:convert';
2+
3+
import 'package:dio/dio.dart';
4+
import 'package:flutter/material.dart';
5+
import 'package:piwigo_ng/models/album_permission_model.dart';
6+
import 'package:piwigo_ng/network/api_client.dart';
7+
import 'package:piwigo_ng/services/preferences_service.dart';
8+
import 'package:shared_preferences/shared_preferences.dart';
9+
10+
Future<AlbumPermissionModel?> getAlbumPermissions(
11+
int albumId,
12+
) async {
13+
List<AlbumPermissionModel>? permissions =
14+
await getPermissions(byAlbum: albumId);
15+
if (permissions == null || permissions.isEmpty) {
16+
return null;
17+
}
18+
return permissions.single;
19+
}
20+
21+
Future<List<AlbumPermissionModel>?> getUserPermissions(
22+
int userId,
23+
) async {
24+
return getPermissions(byUser: userId);
25+
}
26+
27+
Future<List<AlbumPermissionModel>?> getGroupPermissions(
28+
int groupId,
29+
) async {
30+
return getPermissions(byGroup: groupId);
31+
}
32+
33+
Future<List<AlbumPermissionModel>?> getPermissions({
34+
int? byAlbum,
35+
int? byUser,
36+
int? byGroup,
37+
}) async {
38+
assert(!(byAlbum != null && byUser != null && byGroup != null));
39+
Map<String, dynamic> queries = {
40+
'format': 'json',
41+
'method': 'pwg.permissions.getList',
42+
};
43+
44+
if (byAlbum != null) queries['cat_id'] = byAlbum;
45+
if (byGroup != null) queries['group_id'] = byGroup;
46+
if (byUser != null) queries['user_id'] = byUser;
47+
48+
try {
49+
Response response = await ApiClient.get(queryParameters: queries);
50+
51+
if (response.statusCode == 200) {
52+
Map<String, dynamic> data = json.decode(response.data);
53+
var jsonPermissions = data['result']['categories'];
54+
List<AlbumPermissionModel> permissions = List<AlbumPermissionModel>.from(
55+
jsonPermissions
56+
.map((permission) => AlbumPermissionModel.fromJson(permission)),
57+
);
58+
59+
return permissions;
60+
}
61+
} on DioError catch (e) {
62+
debugPrint('Fetch permissions: ${e.message}');
63+
} on Error catch (e) {
64+
debugPrint('Fetch permissions: ${e.stackTrace}');
65+
}
66+
return null;
67+
}
68+
69+
Future<bool> addPermission({
70+
required int albumId,
71+
List<int>? users,
72+
List<int>? groups,
73+
bool? recursive,
74+
}) async {
75+
SharedPreferences prefs = await SharedPreferences.getInstance();
76+
77+
Map<String, dynamic> queries = {
78+
'format': 'json',
79+
'method': 'pwg.permissions.add',
80+
};
81+
82+
Map<String, dynamic> body = {
83+
'cat_id': albumId,
84+
'pwg_token': prefs.getString(Preferences.tokenKey),
85+
};
86+
87+
if (users != null) body['user_id'] = users;
88+
if (groups != null) body['group_id'] = groups;
89+
if (recursive != null) body['recursive'] = recursive;
90+
91+
try {
92+
Response response = await ApiClient.post(
93+
queryParameters: queries,
94+
data: body,
95+
);
96+
97+
if (response.statusCode == 200) {
98+
Map<String, dynamic> data = json.decode(response.data);
99+
print(data);
100+
return true;
101+
}
102+
} on DioError catch (e) {
103+
debugPrint('Add permission: ${e.message}');
104+
} on Error catch (e) {
105+
debugPrint('Add permission: ${e.stackTrace}');
106+
}
107+
return false;
108+
}
109+
110+
Future<bool> removePermission({
111+
required int albumId,
112+
List<int>? users,
113+
List<int>? groups,
114+
}) async {
115+
SharedPreferences prefs = await SharedPreferences.getInstance();
116+
117+
Map<String, dynamic> queries = {
118+
'format': 'json',
119+
'method': 'pwg.permissions.remove',
120+
};
121+
122+
Map<String, dynamic> body = {
123+
'cat_id': albumId,
124+
'pwg_token': prefs.getString(Preferences.tokenKey),
125+
};
126+
127+
if (users != null) body['user_id'] = users;
128+
if (groups != null) body['group_id'] = groups;
129+
130+
try {
131+
Response response = await ApiClient.post(
132+
queryParameters: queries,
133+
data: body,
134+
);
135+
136+
if (response.statusCode == 200) {
137+
Map<String, dynamic> data = json.decode(response.data);
138+
print(data);
139+
return true;
140+
}
141+
} on DioError catch (e) {
142+
debugPrint('Add permission: ${e.message}');
143+
} on Error catch (e) {
144+
debugPrint('Add permission: ${e.stackTrace}');
145+
}
146+
return false;
147+
}

lib/network/users.dart

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,16 @@ Future<ApiResponse<List<UserModel>>> getAllAdmins() async {
4444
bool reachedEnd = false;
4545
List<UserModel> users = [];
4646

47+
Map<String, dynamic> queries = {
48+
'format': 'json',
49+
'method': 'pwg.users.getList',
50+
'status[]': ['admin', 'webmaster'],
51+
'per_page': Settings.defaultElementPerPage,
52+
'page': page,
53+
};
54+
4755
try {
4856
while (!reachedEnd) {
49-
Map<String, dynamic> queries = {
50-
'format': 'json',
51-
'method': 'pwg.users.getList',
52-
'status[]': ['admin', 'webmaster'],
53-
'per_page': Settings.defaultElementPerPage,
54-
'page': page,
55-
};
56-
5757
Response response = await ApiClient.get(queryParameters: queries);
5858
if (response.statusCode == 200) {
5959
Map<String, dynamic> data = json.decode(response.data);
@@ -63,11 +63,13 @@ Future<ApiResponse<List<UserModel>>> getAllAdmins() async {
6363
jsonUsers.map((user) => UserModel.fromJson(user)),
6464
);
6565

66-
if (pageUsers.isEmpty) {
66+
users.addAll(pageUsers);
67+
68+
if (pageUsers.length < Settings.defaultElementPerPage) {
6769
reachedEnd = true;
6870
} else {
69-
users.addAll(pageUsers);
7071
page++;
72+
queries['page'] = page;
7173
}
7274
} else {
7375
if (users.isEmpty) {

0 commit comments

Comments
 (0)