feat: add AUR repository support for Arch Linux packages

- Extended database schema and models to include 'aur' as a valid repository type alongside 'official' and 'third-party'
- Added repository filter UI in package browser for Arch platform to distinguish between official and AUR packages
- Enhanced init-db script with migration system to track and apply schema changes automatically
This commit is contained in:
Yusuf İpek
2025-11-12 20:43:50 +03:00
parent cce1098282
commit 560e78cb96
11 changed files with 395 additions and 226 deletions
+30 -2
View File
@@ -31,10 +31,12 @@ export function PackageBrowserV2({
const [totalCount, setTotalCount] = useState(0)
const [searchQuery, setSearchQuery] = useState('')
const [typeFilter, setTypeFilter] = useState<string>('')
const [repositoryFilter, setRepositoryFilter] = useState<string>('')
const isDebianUbuntu = useMemo(() => {
const id = selectedPlatform?.id || ''
return id === 'debian' || id === 'ubuntu'
}, [selectedPlatform])
const isArch = useMemo(() => (selectedPlatform?.id || '') === 'arch', [selectedPlatform])
const [scrollPosition, setScrollPosition] = useState(0)
const searchInputRef = useRef<HTMLInputElement>(null)
@@ -66,6 +68,9 @@ export function PackageBrowserV2({
if (isDebianUbuntu && typeFilter && typeFilter !== 'all') {
params.type = typeFilter as 'gui' | 'cli'
}
if (isArch && repositoryFilter && repositoryFilter !== 'all') {
params.repository = repositoryFilter as 'official' | 'aur'
}
console.log('🔍 Frontend: API params:', params)
const result = await apiClient.getPackages(params)
@@ -86,7 +91,7 @@ export function PackageBrowserV2({
}
loadPackages()
}, [selectedPlatform, typeFilter, isDebianUbuntu])
}, [selectedPlatform, typeFilter, repositoryFilter, isDebianUbuntu, isArch])
// Debounced search to prevent focus loss
useEffect(() => {
@@ -111,6 +116,9 @@ export function PackageBrowserV2({
if (isDebianUbuntu && typeFilter && typeFilter !== 'all') {
params.type = typeFilter as 'gui' | 'cli'
}
if (isArch && repositoryFilter && repositoryFilter !== 'all') {
params.repository = repositoryFilter as 'official' | 'aur'
}
console.log('🔍 Frontend: Debounced API params:', params)
const result = await apiClient.getPackages(params)
@@ -130,7 +138,7 @@ export function PackageBrowserV2({
}, 300) // 300ms debounce
return () => clearTimeout(timeoutId)
}, [searchQuery, isDebianUbuntu, typeFilter, selectedPlatform])
}, [searchQuery, isDebianUbuntu, typeFilter, isArch, repositoryFilter, selectedPlatform])
// Load more packages
const loadMore = async () => {
@@ -151,6 +159,9 @@ export function PackageBrowserV2({
if (isDebianUbuntu && typeFilter && typeFilter !== 'all') {
params.type = typeFilter as 'gui' | 'cli'
}
if (isArch && repositoryFilter && repositoryFilter !== 'all') {
params.repository = repositoryFilter as 'official' | 'aur'
}
const result = await apiClient.getPackages(params)
setPackages(prev => [...prev, ...result.packages])
@@ -257,6 +268,18 @@ export function PackageBrowserV2({
</SelectContent>
</Select>
)}
{isArch && (
<Select value={repositoryFilter || "all"} onValueChange={(value) => setRepositoryFilter(value === "all" ? "" : value)}>
<SelectTrigger className="w-full sm:w-40">
<SelectValue placeholder="Repository" />
</SelectTrigger>
<SelectContent>
<SelectItem value="all">All</SelectItem>
<SelectItem value="official">Official</SelectItem>
<SelectItem value="aur">AUR</SelectItem>
</SelectContent>
</Select>
)}
</div>
{/* Package List */}
@@ -311,6 +334,11 @@ export function PackageBrowserV2({
{pkg.type.toUpperCase()}
</span>
)}
{pkg.repository === 'aur' && (
<span className="text-xs text-muted-foreground">
AUR
</span>
)}
{pkg.repository === 'third-party' && (
<span className="text-xs text-muted-foreground">
third-party