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:hooks_riverpod/hooks_riverpod.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart';

View File

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

View File

@ -89,42 +89,60 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
} }
Future<MetadataPluginState> toStatePlugins( Future<MetadataPluginState> toStatePlugins(
List<MetadataPluginsTableData> plugins) async { List<MetadataPluginsTableData> plugins,
) async {
int defaultPlugin = -1; int defaultPlugin = -1;
final pluginConfigs = plugins.mapIndexed( final pluginConfigs = <PluginConfiguration>[];
(index, plugin) {
if (plugin.selected) { for (int i = 0; i < plugins.length; i++) {
defaultPlugin = index; 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( return MetadataPluginState(
plugins: pluginConfigs, plugins: pluginConfigs,
defaultPlugin: defaultPlugin, defaultPlugin: defaultPlugin,
@ -207,7 +225,7 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
final pluginDir = await _getPluginRootDir(); final pluginDir = await _getPluginRootDir();
final pluginExtractionDirPath = join( final pluginExtractionDirPath = join(
pluginDir.path, pluginDir.path,
"${ServiceUtils.sanitizeFilename(plugin.name)}-${plugin.version}", "${ServiceUtils.sanitizeFilename(plugin.author)}-${ServiceUtils.sanitizeFilename(plugin.name)}-${plugin.version}",
); );
return Directory(pluginExtractionDirPath); return Directory(pluginExtractionDirPath);
} }
@ -314,7 +332,8 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
final pluginRes = await (database.metadataPluginsTable.select() final pluginRes = await (database.metadataPluginsTable.select()
..where( ..where(
(tbl) => tbl.name.equals(plugin.name), (tbl) =>
tbl.name.equals(plugin.name) & tbl.author.equals(plugin.author),
) )
..limit(1)) ..limit(1))
.get(); .get();
@ -344,8 +363,8 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
if (pluginExtractionDir.existsSync()) { if (pluginExtractionDir.existsSync()) {
await pluginExtractionDir.delete(recursive: true); await pluginExtractionDir.delete(recursive: true);
} }
await database.metadataPluginsTable await database.metadataPluginsTable.deleteWhere((tbl) =>
.deleteWhere((tbl) => tbl.name.equals(plugin.name)); tbl.name.equals(plugin.name) & tbl.author.equals(plugin.author));
} }
Future<void> updatePlugin( Future<void> updatePlugin(
@ -356,7 +375,8 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
final pluginUpdatedConfig = final pluginUpdatedConfig =
await downloadAndCachePlugin(update.downloadUrl); await downloadAndCachePlugin(update.downloadUrl);
if (pluginUpdatedConfig.name != plugin.name) { if (pluginUpdatedConfig.name != plugin.name &&
pluginUpdatedConfig.author != plugin.author) {
throw MetadataPluginException.invalidPluginConfiguration(); throw MetadataPluginException.invalidPluginConfiguration();
} }
_assertPluginApiCompatibility(pluginUpdatedConfig); _assertPluginApiCompatibility(pluginUpdatedConfig);
@ -375,7 +395,8 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
.write(const MetadataPluginsTableCompanion(selected: Value(false))); .write(const MetadataPluginsTableCompanion(selected: Value(false)));
await (database.metadataPluginsTable.update() await (database.metadataPluginsTable.update()
..where((tbl) => tbl.name.equals(plugin.name))) ..where((tbl) =>
tbl.name.equals(plugin.name) & tbl.author.equals(plugin.author)))
.write( .write(
const MetadataPluginsTableCompanion(selected: Value(true)), const MetadataPluginsTableCompanion(selected: Value(true)),
); );