Add pocketbase types
This commit is contained in:
@@ -1,8 +1,7 @@
|
|||||||
|
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
import { Card, CardContent } from "@/components/ui/card";
|
||||||
import { Badge } from "@/components/ui/badge";
|
import { Badge } from "@/components/ui/badge";
|
||||||
import { Zap, Shield, Coins, HelpCircle } from "lucide-react";
|
import { Zap, Shield, Coins, HelpCircle } from "lucide-react";
|
||||||
import { Signature } from "@/lib/types";
|
import { SigviewRecord as Signature } from "@/lib/pbtypes";
|
||||||
|
|
||||||
interface SignatureCardProps {
|
interface SignatureCardProps {
|
||||||
signature: Signature;
|
signature: Signature;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Badge } from "@/components/ui/badge";
|
import { Badge } from "@/components/ui/badge";
|
||||||
import { Zap, Shield, Coins, HelpCircle, Clock, AlertTriangle, Skull } from "lucide-react";
|
import { Zap, Shield, Coins, HelpCircle, Clock, AlertTriangle, Skull } from "lucide-react";
|
||||||
import { Signature } from "@/lib/types";
|
import { SigviewRecord as Signature } from "@/lib/pbtypes";
|
||||||
|
|
||||||
interface SignatureListItemProps {
|
interface SignatureListItemProps {
|
||||||
signature: Signature;
|
signature: Signature;
|
||||||
@@ -86,7 +86,7 @@ export const SignatureListItem = ({ signature }: SignatureListItemProps) => {
|
|||||||
{/* Signature Name and ID */}
|
{/* Signature Name and ID */}
|
||||||
<div className="flex-1 min-w-[200px]">
|
<div className="flex-1 min-w-[200px]">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<span className="font-mono text-sm text-slate-400 min-w-[60px]">{signature.id}</span>
|
<span className="font-mono text-sm text-slate-400 min-w-[60px]">{signature.identifier}</span>
|
||||||
<h3 className="text-white font-medium flex items-center gap-2">
|
<h3 className="text-white font-medium flex items-center gap-2">
|
||||||
{signature.signame || "Unnamed Signature"}
|
{signature.signame || "Unnamed Signature"}
|
||||||
{signature.dangerous && (
|
{signature.dangerous && (
|
||||||
@@ -96,7 +96,6 @@ export const SignatureListItem = ({ signature }: SignatureListItemProps) => {
|
|||||||
)}
|
)}
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-xs text-slate-400 font-mono ml-[60px]">{signature.identifier}</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Dates */}
|
{/* Dates */}
|
||||||
|
|||||||
@@ -7,11 +7,7 @@ import { Button } from "@/components/ui/button";
|
|||||||
import { RefreshCw, AlertCircle, Radar } from "lucide-react";
|
import { RefreshCw, AlertCircle, Radar } from "lucide-react";
|
||||||
import { SignatureListItem } from "@/components/SignatureListItem";
|
import { SignatureListItem } from "@/components/SignatureListItem";
|
||||||
import { toast } from "@/hooks/use-toast";
|
import { toast } from "@/hooks/use-toast";
|
||||||
import { Signature } from "@/lib/types";
|
import pb from "@/lib/pocketbase";
|
||||||
|
|
||||||
interface ApiResponse {
|
|
||||||
items: Signature[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface SystemTrackerProps {
|
interface SystemTrackerProps {
|
||||||
system: string;
|
system: string;
|
||||||
@@ -27,19 +23,7 @@ export const SystemTracker = ({ system }: SystemTrackerProps) => {
|
|||||||
queryKey: ['signatures', system],
|
queryKey: ['signatures', system],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
if (!system) return null;
|
if (!system) return null;
|
||||||
|
return pb.collection('sigview').getFullList({ batch: 1000, filter: `(system='${system}')` });
|
||||||
const encodedSystem = encodeURIComponent(system);
|
|
||||||
const url = `https://evebase.site.quack-lab.dev/api/collections/sigview/records?filter=(system%3D'${encodedSystem}')`;
|
|
||||||
|
|
||||||
console.log('Fetching signatures for system:', system);
|
|
||||||
console.log('API URL:', url);
|
|
||||||
|
|
||||||
const response = await fetch(url);
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('Failed to fetch signatures');
|
|
||||||
}
|
|
||||||
const data: ApiResponse = await response.json();
|
|
||||||
return data;
|
|
||||||
},
|
},
|
||||||
enabled: !!system,
|
enabled: !!system,
|
||||||
refetchInterval: 5000, // Poll every 5 seconds
|
refetchInterval: 5000, // Poll every 5 seconds
|
||||||
@@ -53,7 +37,7 @@ export const SystemTracker = ({ system }: SystemTrackerProps) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const signatures = signaturesData?.items || [];
|
const signatures = signaturesData || [];
|
||||||
const isLoading = signaturesLoading;
|
const isLoading = signaturesLoading;
|
||||||
|
|
||||||
// Sort signatures by date (newest first) and prioritize unknown types
|
// Sort signatures by date (newest first) and prioritize unknown types
|
||||||
|
|||||||
202
src/lib/pbtypes.ts
Normal file
202
src/lib/pbtypes.ts
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
/**
|
||||||
|
* This file was @generated using pocketbase-typegen
|
||||||
|
*/
|
||||||
|
|
||||||
|
import type PocketBase from 'pocketbase'
|
||||||
|
import type { RecordService } from 'pocketbase'
|
||||||
|
|
||||||
|
export enum Collections {
|
||||||
|
Authorigins = "_authOrigins",
|
||||||
|
Externalauths = "_externalAuths",
|
||||||
|
Mfas = "_mfas",
|
||||||
|
Otps = "_otps",
|
||||||
|
Superusers = "_superusers",
|
||||||
|
Regionview = "regionview",
|
||||||
|
Signature = "signature",
|
||||||
|
Sigview = "sigview",
|
||||||
|
System = "system",
|
||||||
|
WormholeSystems = "wormholeSystems",
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alias types for improved usability
|
||||||
|
export type IsoDateString = string
|
||||||
|
export type RecordIdString = string
|
||||||
|
export type HTMLString = string
|
||||||
|
|
||||||
|
type ExpandType<T> = unknown extends T
|
||||||
|
? T extends unknown
|
||||||
|
? { expand?: unknown }
|
||||||
|
: { expand: T }
|
||||||
|
: { expand: T }
|
||||||
|
|
||||||
|
// System fields
|
||||||
|
export type BaseSystemFields<T = unknown> = {
|
||||||
|
id: RecordIdString
|
||||||
|
collectionId: string
|
||||||
|
collectionName: Collections
|
||||||
|
} & ExpandType<T>
|
||||||
|
|
||||||
|
export type AuthSystemFields<T = unknown> = {
|
||||||
|
email: string
|
||||||
|
emailVisibility: boolean
|
||||||
|
username: string
|
||||||
|
verified: boolean
|
||||||
|
} & BaseSystemFields<T>
|
||||||
|
|
||||||
|
// Record types for each collection
|
||||||
|
|
||||||
|
export type AuthoriginsRecord = {
|
||||||
|
collectionRef: string
|
||||||
|
created?: IsoDateString
|
||||||
|
fingerprint: string
|
||||||
|
id: string
|
||||||
|
recordRef: string
|
||||||
|
updated?: IsoDateString
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ExternalauthsRecord = {
|
||||||
|
collectionRef: string
|
||||||
|
created?: IsoDateString
|
||||||
|
id: string
|
||||||
|
provider: string
|
||||||
|
providerId: string
|
||||||
|
recordRef: string
|
||||||
|
updated?: IsoDateString
|
||||||
|
}
|
||||||
|
|
||||||
|
export type MfasRecord = {
|
||||||
|
collectionRef: string
|
||||||
|
created?: IsoDateString
|
||||||
|
id: string
|
||||||
|
method: string
|
||||||
|
recordRef: string
|
||||||
|
updated?: IsoDateString
|
||||||
|
}
|
||||||
|
|
||||||
|
export type OtpsRecord = {
|
||||||
|
collectionRef: string
|
||||||
|
created?: IsoDateString
|
||||||
|
id: string
|
||||||
|
password: string
|
||||||
|
recordRef: string
|
||||||
|
sentTo?: string
|
||||||
|
updated?: IsoDateString
|
||||||
|
}
|
||||||
|
|
||||||
|
export type SuperusersRecord = {
|
||||||
|
created?: IsoDateString
|
||||||
|
email: string
|
||||||
|
emailVisibility?: boolean
|
||||||
|
id: string
|
||||||
|
password: string
|
||||||
|
tokenKey: string
|
||||||
|
updated?: IsoDateString
|
||||||
|
verified?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export type RegionviewRecord = {
|
||||||
|
id: string
|
||||||
|
sigcount?: number
|
||||||
|
sysname: string
|
||||||
|
sysregion: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export type SignatureRecord = {
|
||||||
|
created?: IsoDateString
|
||||||
|
dangerous?: boolean
|
||||||
|
id: string
|
||||||
|
identifier: string
|
||||||
|
name?: string
|
||||||
|
scanned?: string
|
||||||
|
system: RecordIdString
|
||||||
|
type?: string
|
||||||
|
updated?: IsoDateString
|
||||||
|
}
|
||||||
|
|
||||||
|
export type SigviewRecord = {
|
||||||
|
created?: IsoDateString
|
||||||
|
dangerous?: boolean
|
||||||
|
id: string
|
||||||
|
identifier: string
|
||||||
|
scanned?: string
|
||||||
|
signame?: string
|
||||||
|
sysid?: RecordIdString
|
||||||
|
system: string
|
||||||
|
type?: string
|
||||||
|
updated?: IsoDateString
|
||||||
|
}
|
||||||
|
|
||||||
|
export type SystemRecord = {
|
||||||
|
connectedTo?: string
|
||||||
|
created?: IsoDateString
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
region: string
|
||||||
|
updated?: IsoDateString
|
||||||
|
}
|
||||||
|
|
||||||
|
export type WormholeSystemsRecord = {
|
||||||
|
connectedSystems?: string
|
||||||
|
created?: IsoDateString
|
||||||
|
id: string
|
||||||
|
solarSystemName: string
|
||||||
|
updated?: IsoDateString
|
||||||
|
x: number
|
||||||
|
y: number
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response types include system fields and match responses from the PocketBase API
|
||||||
|
export type AuthoriginsResponse<Texpand = unknown> = Required<AuthoriginsRecord> & BaseSystemFields<Texpand>
|
||||||
|
export type ExternalauthsResponse<Texpand = unknown> = Required<ExternalauthsRecord> & BaseSystemFields<Texpand>
|
||||||
|
export type MfasResponse<Texpand = unknown> = Required<MfasRecord> & BaseSystemFields<Texpand>
|
||||||
|
export type OtpsResponse<Texpand = unknown> = Required<OtpsRecord> & BaseSystemFields<Texpand>
|
||||||
|
export type SuperusersResponse<Texpand = unknown> = Required<SuperusersRecord> & AuthSystemFields<Texpand>
|
||||||
|
export type RegionviewResponse<Texpand = unknown> = Required<RegionviewRecord> & BaseSystemFields<Texpand>
|
||||||
|
export type SignatureResponse<Texpand = unknown> = Required<SignatureRecord> & BaseSystemFields<Texpand>
|
||||||
|
export type SigviewResponse<Texpand = unknown> = Required<SigviewRecord> & BaseSystemFields<Texpand>
|
||||||
|
export type SystemResponse<Texpand = unknown> = Required<SystemRecord> & BaseSystemFields<Texpand>
|
||||||
|
export type WormholeSystemsResponse<Texpand = unknown> = Required<WormholeSystemsRecord> & BaseSystemFields<Texpand>
|
||||||
|
|
||||||
|
// Types containing all Records and Responses, useful for creating typing helper functions
|
||||||
|
|
||||||
|
export type CollectionRecords = {
|
||||||
|
_authOrigins: AuthoriginsRecord
|
||||||
|
_externalAuths: ExternalauthsRecord
|
||||||
|
_mfas: MfasRecord
|
||||||
|
_otps: OtpsRecord
|
||||||
|
_superusers: SuperusersRecord
|
||||||
|
regionview: RegionviewRecord
|
||||||
|
signature: SignatureRecord
|
||||||
|
sigview: SigviewRecord
|
||||||
|
system: SystemRecord
|
||||||
|
wormholeSystems: WormholeSystemsRecord
|
||||||
|
}
|
||||||
|
|
||||||
|
export type CollectionResponses = {
|
||||||
|
_authOrigins: AuthoriginsResponse
|
||||||
|
_externalAuths: ExternalauthsResponse
|
||||||
|
_mfas: MfasResponse
|
||||||
|
_otps: OtpsResponse
|
||||||
|
_superusers: SuperusersResponse
|
||||||
|
regionview: RegionviewResponse
|
||||||
|
signature: SignatureResponse
|
||||||
|
sigview: SigviewResponse
|
||||||
|
system: SystemResponse
|
||||||
|
wormholeSystems: WormholeSystemsResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type for usage with type asserted PocketBase instance
|
||||||
|
// https://github.com/pocketbase/js-sdk#specify-typescript-definitions
|
||||||
|
|
||||||
|
export type TypedPocketBase = PocketBase & {
|
||||||
|
collection(idOrName: '_authOrigins'): RecordService<AuthoriginsResponse>
|
||||||
|
collection(idOrName: '_externalAuths'): RecordService<ExternalauthsResponse>
|
||||||
|
collection(idOrName: '_mfas'): RecordService<MfasResponse>
|
||||||
|
collection(idOrName: '_otps'): RecordService<OtpsResponse>
|
||||||
|
collection(idOrName: '_superusers'): RecordService<SuperusersResponse>
|
||||||
|
collection(idOrName: 'regionview'): RecordService<RegionviewResponse>
|
||||||
|
collection(idOrName: 'signature'): RecordService<SignatureResponse>
|
||||||
|
collection(idOrName: 'sigview'): RecordService<SigviewResponse>
|
||||||
|
collection(idOrName: 'system'): RecordService<SystemResponse>
|
||||||
|
collection(idOrName: 'wormholeSystems'): RecordService<WormholeSystemsResponse>
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
import PocketBase from 'pocketbase';
|
import PocketBase from 'pocketbase';
|
||||||
|
import { TypedPocketBase } from './pbtypes';
|
||||||
|
|
||||||
const pb = new PocketBase('https://evebase.site.quack-lab.dev');
|
const pb = new PocketBase('https://evebase.site.quack-lab.dev') as TypedPocketBase;
|
||||||
|
|
||||||
export default pb;
|
export default pb;
|
||||||
|
|||||||
@@ -27,16 +27,3 @@ export interface Connection {
|
|||||||
to: Position;
|
to: Position;
|
||||||
color?: string;
|
color?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Signature {
|
|
||||||
id?: string;
|
|
||||||
identifier: string;
|
|
||||||
signame: string;
|
|
||||||
sysid: string;
|
|
||||||
system: string;
|
|
||||||
type: string;
|
|
||||||
updated?: string;
|
|
||||||
created?: string;
|
|
||||||
dangerous?: boolean;
|
|
||||||
scanned?: string;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { Header } from "@/components/Header";
|
|||||||
import { parseSignature, parseScannedPercentage } from "@/utils/signatureParser";
|
import { parseSignature, parseScannedPercentage } from "@/utils/signatureParser";
|
||||||
import { getSystemId } from "@/utils/systemApi";
|
import { getSystemId } from "@/utils/systemApi";
|
||||||
import pb from "@/lib/pocketbase";
|
import pb from "@/lib/pocketbase";
|
||||||
import { Signature } from "@/lib/types";
|
import { SigviewRecord as Signature } from "@/lib/pbtypes";
|
||||||
|
|
||||||
export const SystemView = () => {
|
export const SystemView = () => {
|
||||||
const { system, region } = useParams();
|
const { system, region } = useParams();
|
||||||
@@ -27,7 +27,7 @@ export const SystemView = () => {
|
|||||||
try {
|
try {
|
||||||
// Check if signature already exists
|
// Check if signature already exists
|
||||||
const existingRecords = await pb.collection('signature').getList(1, 1, {
|
const existingRecords = await pb.collection('signature').getList(1, 1, {
|
||||||
filter: `identifier='${signature.identifier}' && system='${signature.system}'`
|
filter: `(id='${signature.id}' && system='${signature.system}')`
|
||||||
});
|
});
|
||||||
|
|
||||||
const newScannedPercentage = parseScannedPercentage(signature.scanned);
|
const newScannedPercentage = parseScannedPercentage(signature.scanned);
|
||||||
@@ -84,7 +84,7 @@ export const SystemView = () => {
|
|||||||
try {
|
try {
|
||||||
const systemId = await getSystemId(system);
|
const systemId = await getSystemId(system);
|
||||||
const lines = pastedText.trim().split('\n').filter(line => line.trim());
|
const lines = pastedText.trim().split('\n').filter(line => line.trim());
|
||||||
const parsedSignatures: Signature[] = [];
|
const parsedSignatures: Omit<Signature, 'id'>[] = [];
|
||||||
|
|
||||||
// Parse all signatures
|
// Parse all signatures
|
||||||
for (const line of lines) {
|
for (const line of lines) {
|
||||||
@@ -93,7 +93,8 @@ export const SystemView = () => {
|
|||||||
parsedSignatures.push({
|
parsedSignatures.push({
|
||||||
...parsed,
|
...parsed,
|
||||||
system: systemId,
|
system: systemId,
|
||||||
sysid: systemId
|
sysid: systemId,
|
||||||
|
identifier: parsed.identifier
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -130,7 +131,7 @@ export const SystemView = () => {
|
|||||||
|
|
||||||
// Save all new/updated signatures
|
// Save all new/updated signatures
|
||||||
for (const signature of parsedSignatures) {
|
for (const signature of parsedSignatures) {
|
||||||
await saveSignature(signature);
|
await saveSignature(signature as Signature);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invalidate queries to refresh the data
|
// Invalidate queries to refresh the data
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Signature } from "@/lib/types";
|
import { SigviewRecord as Signature } from "@/lib/pbtypes";
|
||||||
|
|
||||||
export const parseSignature = (text: string): Omit<Signature, 'system' | 'sysid'> | null => {
|
export const parseSignature = (text: string): Omit<Signature, 'system' | 'id' | 'sysid'> | null => {
|
||||||
const parts = text.split('\t');
|
const parts = text.split('\t');
|
||||||
if (parts.length < 4) return null;
|
if (parts.length < 4) return null;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user