fix: use plugin author and name as slug

This commit is contained in:
Kingkor Roy Tirtho 2025-08-29 14:56:24 +06:00
parent 66cae6c7ac
commit c0d50d441e
3 changed files with 63 additions and 42 deletions

View File

@ -1,4 +1,3 @@
import 'package:flutter/foundation.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';

View File

@ -26,7 +26,8 @@ class MetadataPluginRepositoryItem extends HookConsumerWidget {
return Card(
child: Basic(
title: Text(pluginRepo.name),
title: Text(
"${pluginRepo.owner == "KRTirtho" ? "" : "${pluginRepo.owner}/"}${pluginRepo.name}"),
subtitle: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,

View File

@ -89,42 +89,60 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
}
Future<MetadataPluginState> toStatePlugins(
List<MetadataPluginsTableData> plugins) async {
List<MetadataPluginsTableData> plugins,
) async {
int defaultPlugin = -1;
final pluginConfigs = plugins.mapIndexed(
(index, plugin) {
if (plugin.selected) {
defaultPlugin = index;
}
final pluginConfigs = <PluginConfiguration>[];
for (int i = 0; i < plugins.length; i++) {
final plugin = plugins[i];
final pluginConfig = PluginConfiguration(
type: PluginType.metadata,
name: plugin.name,
author: plugin.author,
description: plugin.description,
version: plugin.version,
entryPoint: plugin.entryPoint,
pluginApiVersion: plugin.pluginApiVersion,
repository: plugin.repository,
apis: plugin.apis
.map(
(e) => PluginApis.values.firstWhereOrNull(
(api) => api.name == e,
),
)
.nonNulls
.toList(),
abilities: plugin.abilities
.map(
(e) => PluginAbilities.values.firstWhereOrNull(
(ability) => ability.name == e,
),
)
.nonNulls
.toList(),
);
final pluginExtractionDir = await _getPluginExtractionDir(pluginConfig);
final pluginJsonFile =
File(join(pluginExtractionDir.path, "plugin.json"));
final pluginBinaryFile =
File(join(pluginExtractionDir.path, "plugin.out"));
if (!await pluginExtractionDir.exists() ||
!await pluginJsonFile.exists() ||
!await pluginBinaryFile.exists()) {
continue;
}
pluginConfigs.add(pluginConfig);
if (plugin.selected) {
defaultPlugin = pluginConfigs.length - 1;
}
}
return PluginConfiguration(
type: PluginType.metadata,
name: plugin.name,
author: plugin.author,
description: plugin.description,
version: plugin.version,
entryPoint: plugin.entryPoint,
pluginApiVersion: plugin.pluginApiVersion,
repository: plugin.repository,
apis: plugin.apis
.map(
(e) => PluginApis.values.firstWhereOrNull(
(api) => api.name == e,
),
)
.nonNulls
.toList(),
abilities: plugin.abilities
.map(
(e) => PluginAbilities.values.firstWhereOrNull(
(ability) => ability.name == e,
),
)
.nonNulls
.toList(),
);
},
).toList();
return MetadataPluginState(
plugins: pluginConfigs,
defaultPlugin: defaultPlugin,
@ -207,7 +225,7 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
final pluginDir = await _getPluginRootDir();
final pluginExtractionDirPath = join(
pluginDir.path,
"${ServiceUtils.sanitizeFilename(plugin.name)}-${plugin.version}",
"${ServiceUtils.sanitizeFilename(plugin.author)}-${ServiceUtils.sanitizeFilename(plugin.name)}-${plugin.version}",
);
return Directory(pluginExtractionDirPath);
}
@ -314,7 +332,8 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
final pluginRes = await (database.metadataPluginsTable.select()
..where(
(tbl) => tbl.name.equals(plugin.name),
(tbl) =>
tbl.name.equals(plugin.name) & tbl.author.equals(plugin.author),
)
..limit(1))
.get();
@ -344,8 +363,8 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
if (pluginExtractionDir.existsSync()) {
await pluginExtractionDir.delete(recursive: true);
}
await database.metadataPluginsTable
.deleteWhere((tbl) => tbl.name.equals(plugin.name));
await database.metadataPluginsTable.deleteWhere((tbl) =>
tbl.name.equals(plugin.name) & tbl.author.equals(plugin.author));
}
Future<void> updatePlugin(
@ -356,7 +375,8 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
final pluginUpdatedConfig =
await downloadAndCachePlugin(update.downloadUrl);
if (pluginUpdatedConfig.name != plugin.name) {
if (pluginUpdatedConfig.name != plugin.name &&
pluginUpdatedConfig.author != plugin.author) {
throw MetadataPluginException.invalidPluginConfiguration();
}
_assertPluginApiCompatibility(pluginUpdatedConfig);
@ -375,7 +395,8 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
.write(const MetadataPluginsTableCompanion(selected: Value(false)));
await (database.metadataPluginsTable.update()
..where((tbl) => tbl.name.equals(plugin.name)))
..where((tbl) =>
tbl.name.equals(plugin.name) & tbl.author.equals(plugin.author)))
.write(
const MetadataPluginsTableCompanion(selected: Value(true)),
);