A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.
This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).
Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
206 lines
8.8 KiB
Go
206 lines
8.8 KiB
Go
package database
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// University represents a German university/Hochschule
|
|
type University struct {
|
|
ID uuid.UUID `json:"id"`
|
|
Name string `json:"name"`
|
|
ShortName *string `json:"short_name,omitempty"`
|
|
URL string `json:"url"`
|
|
State *string `json:"state,omitempty"`
|
|
UniType *string `json:"uni_type,omitempty"`
|
|
StaffPagePattern *string `json:"staff_page_pattern,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// Department represents a faculty/department at a university
|
|
type Department struct {
|
|
ID uuid.UUID `json:"id"`
|
|
UniversityID uuid.UUID `json:"university_id"`
|
|
Name string `json:"name"`
|
|
NameEN *string `json:"name_en,omitempty"`
|
|
URL *string `json:"url,omitempty"`
|
|
Category *string `json:"category,omitempty"`
|
|
ParentID *uuid.UUID `json:"parent_id,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// UniversityStaff represents a staff member at a university
|
|
type UniversityStaff struct {
|
|
ID uuid.UUID `json:"id"`
|
|
UniversityID uuid.UUID `json:"university_id"`
|
|
DepartmentID *uuid.UUID `json:"department_id,omitempty"`
|
|
FirstName *string `json:"first_name,omitempty"`
|
|
LastName string `json:"last_name"`
|
|
FullName *string `json:"full_name,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
AcademicTitle *string `json:"academic_title,omitempty"`
|
|
Position *string `json:"position,omitempty"`
|
|
PositionType *string `json:"position_type,omitempty"`
|
|
IsProfessor bool `json:"is_professor"`
|
|
Email *string `json:"email,omitempty"`
|
|
Phone *string `json:"phone,omitempty"`
|
|
Office *string `json:"office,omitempty"`
|
|
ProfileURL *string `json:"profile_url,omitempty"`
|
|
PhotoURL *string `json:"photo_url,omitempty"`
|
|
ORCID *string `json:"orcid,omitempty"`
|
|
GoogleScholarID *string `json:"google_scholar_id,omitempty"`
|
|
ResearchgateURL *string `json:"researchgate_url,omitempty"`
|
|
LinkedInURL *string `json:"linkedin_url,omitempty"`
|
|
PersonalWebsite *string `json:"personal_website,omitempty"`
|
|
ResearchInterests []string `json:"research_interests,omitempty"`
|
|
ResearchSummary *string `json:"research_summary,omitempty"`
|
|
SupervisorID *uuid.UUID `json:"supervisor_id,omitempty"`
|
|
TeamRole *string `json:"team_role,omitempty"` // leitung, mitarbeiter, sekretariat, hiwi, doktorand
|
|
CrawledAt time.Time `json:"crawled_at"`
|
|
LastVerified *time.Time `json:"last_verified,omitempty"`
|
|
IsActive bool `json:"is_active"`
|
|
SourceURL *string `json:"source_url,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
// Joined fields (from views)
|
|
UniversityName *string `json:"university_name,omitempty"`
|
|
UniversityShort *string `json:"university_short,omitempty"`
|
|
DepartmentName *string `json:"department_name,omitempty"`
|
|
PublicationCount int `json:"publication_count,omitempty"`
|
|
SupervisorName *string `json:"supervisor_name,omitempty"`
|
|
}
|
|
|
|
// Publication represents an academic publication
|
|
type Publication struct {
|
|
ID uuid.UUID `json:"id"`
|
|
Title string `json:"title"`
|
|
TitleEN *string `json:"title_en,omitempty"`
|
|
Abstract *string `json:"abstract,omitempty"`
|
|
AbstractEN *string `json:"abstract_en,omitempty"`
|
|
Year *int `json:"year,omitempty"`
|
|
Month *int `json:"month,omitempty"`
|
|
PubType *string `json:"pub_type,omitempty"`
|
|
Venue *string `json:"venue,omitempty"`
|
|
VenueShort *string `json:"venue_short,omitempty"`
|
|
Publisher *string `json:"publisher,omitempty"`
|
|
DOI *string `json:"doi,omitempty"`
|
|
ISBN *string `json:"isbn,omitempty"`
|
|
ISSN *string `json:"issn,omitempty"`
|
|
ArxivID *string `json:"arxiv_id,omitempty"`
|
|
PubmedID *string `json:"pubmed_id,omitempty"`
|
|
URL *string `json:"url,omitempty"`
|
|
PDFURL *string `json:"pdf_url,omitempty"`
|
|
CitationCount int `json:"citation_count"`
|
|
Keywords []string `json:"keywords,omitempty"`
|
|
Topics []string `json:"topics,omitempty"`
|
|
Source *string `json:"source,omitempty"`
|
|
RawData []byte `json:"raw_data,omitempty"`
|
|
CrawledAt time.Time `json:"crawled_at"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
// Joined fields
|
|
Authors []string `json:"authors,omitempty"`
|
|
AuthorCount int `json:"author_count,omitempty"`
|
|
}
|
|
|
|
// StaffPublication represents the N:M relationship between staff and publications
|
|
type StaffPublication struct {
|
|
StaffID uuid.UUID `json:"staff_id"`
|
|
PublicationID uuid.UUID `json:"publication_id"`
|
|
AuthorPosition *int `json:"author_position,omitempty"`
|
|
IsCorresponding bool `json:"is_corresponding"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// UniversityCrawlStatus tracks crawl progress for a university
|
|
type UniversityCrawlStatus struct {
|
|
UniversityID uuid.UUID `json:"university_id"`
|
|
LastStaffCrawl *time.Time `json:"last_staff_crawl,omitempty"`
|
|
StaffCrawlStatus string `json:"staff_crawl_status"`
|
|
StaffCount int `json:"staff_count"`
|
|
StaffErrors []string `json:"staff_errors,omitempty"`
|
|
LastPubCrawl *time.Time `json:"last_pub_crawl,omitempty"`
|
|
PubCrawlStatus string `json:"pub_crawl_status"`
|
|
PubCount int `json:"pub_count"`
|
|
PubErrors []string `json:"pub_errors,omitempty"`
|
|
NextScheduledCrawl *time.Time `json:"next_scheduled_crawl,omitempty"`
|
|
CrawlPriority int `json:"crawl_priority"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// CrawlHistory represents a crawl audit log entry
|
|
type CrawlHistory struct {
|
|
ID uuid.UUID `json:"id"`
|
|
UniversityID *uuid.UUID `json:"university_id,omitempty"`
|
|
CrawlType string `json:"crawl_type"`
|
|
Status string `json:"status"`
|
|
StartedAt time.Time `json:"started_at"`
|
|
CompletedAt *time.Time `json:"completed_at,omitempty"`
|
|
ItemsFound int `json:"items_found"`
|
|
ItemsNew int `json:"items_new"`
|
|
ItemsUpdated int `json:"items_updated"`
|
|
Errors []byte `json:"errors,omitempty"`
|
|
Metadata []byte `json:"metadata,omitempty"`
|
|
}
|
|
|
|
// StaffSearchParams contains parameters for searching staff
|
|
type StaffSearchParams struct {
|
|
Query string `json:"query,omitempty"`
|
|
UniversityID *uuid.UUID `json:"university_id,omitempty"`
|
|
DepartmentID *uuid.UUID `json:"department_id,omitempty"`
|
|
State *string `json:"state,omitempty"`
|
|
UniType *string `json:"uni_type,omitempty"`
|
|
PositionType *string `json:"position_type,omitempty"`
|
|
IsProfessor *bool `json:"is_professor,omitempty"`
|
|
Limit int `json:"limit,omitempty"`
|
|
Offset int `json:"offset,omitempty"`
|
|
}
|
|
|
|
// StaffSearchResult contains search results for staff
|
|
type StaffSearchResult struct {
|
|
Staff []UniversityStaff `json:"staff"`
|
|
Total int `json:"total"`
|
|
Limit int `json:"limit"`
|
|
Offset int `json:"offset"`
|
|
Query string `json:"query,omitempty"`
|
|
}
|
|
|
|
// PublicationSearchParams contains parameters for searching publications
|
|
type PublicationSearchParams struct {
|
|
Query string `json:"query,omitempty"`
|
|
StaffID *uuid.UUID `json:"staff_id,omitempty"`
|
|
Year *int `json:"year,omitempty"`
|
|
YearFrom *int `json:"year_from,omitempty"`
|
|
YearTo *int `json:"year_to,omitempty"`
|
|
PubType *string `json:"pub_type,omitempty"`
|
|
Limit int `json:"limit,omitempty"`
|
|
Offset int `json:"offset,omitempty"`
|
|
}
|
|
|
|
// PublicationSearchResult contains search results for publications
|
|
type PublicationSearchResult struct {
|
|
Publications []Publication `json:"publications"`
|
|
Total int `json:"total"`
|
|
Limit int `json:"limit"`
|
|
Offset int `json:"offset"`
|
|
Query string `json:"query,omitempty"`
|
|
}
|
|
|
|
// StaffStats contains statistics about staff data
|
|
type StaffStats struct {
|
|
TotalStaff int `json:"total_staff"`
|
|
TotalProfessors int `json:"total_professors"`
|
|
TotalPublications int `json:"total_publications"`
|
|
TotalUniversities int `json:"total_universities"`
|
|
ByState map[string]int `json:"by_state,omitempty"`
|
|
ByUniType map[string]int `json:"by_uni_type,omitempty"`
|
|
ByPositionType map[string]int `json:"by_position_type,omitempty"`
|
|
RecentCrawls []CrawlHistory `json:"recent_crawls,omitempty"`
|
|
}
|