From b2c968af41781715c43f614cee91a3d84eac2e83 Mon Sep 17 00:00:00 2001 From: Alex Dunmow Date: Sun, 3 May 2026 00:16:46 +0800 Subject: [PATCH] feat: add SymposiumSeeder and MessengerSeeder bridge interfaces Defines cross-plugin seeder interfaces in the SDK so template plugins can seed Symposium/Messenger content via PluginBridge without importing their database packages directly. Co-Authored-By: Claude Opus 4.6 --- plugin/seeder.go | 105 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 plugin/seeder.go diff --git a/plugin/seeder.go b/plugin/seeder.go new file mode 100644 index 0000000..a7e6c4f --- /dev/null +++ b/plugin/seeder.go @@ -0,0 +1,105 @@ +package plugin + +import ( + "context" + + "github.com/jackc/pgx/v5" +) + +// SymposiumSeeder provides Symposium data-seeding and lookup operations for +// cross-plugin use via PluginBridge. Template plugins retrieve this interface +// instead of importing the Symposium database package directly. +// +// All Seed* methods are idempotent: existing rows are returned, not duplicated. +type SymposiumSeeder interface { + // Wiki + SeedWikiCategory(ctx context.Context, tx pgx.Tx, name, slug, description string, sortOrder int32) (string, error) + SeedWikiArticle(ctx context.Context, tx pgx.Tx, title, slug, categoryID, excerpt string, contentJSON []byte) error + + // Courses + SeedCourse(ctx context.Context, tx pgx.Tx, p SeedCourseParams) (string, error) + SeedCourseSection(ctx context.Context, tx pgx.Tx, courseID, title string, position int32) (string, error) + SeedLesson(ctx context.Context, tx pgx.Tx, courseID, sectionID string, p SeedLessonParams) (string, error) + + // Quizzes + SeedQuiz(ctx context.Context, tx pgx.Tx, title string, passThreshold int32) (string, error) + SeedQuizQuestion(ctx context.Context, tx pgx.Tx, quizID string, p SeedQuizQuestionParams) (string, error) + + // Community + SeedCommunityCategory(ctx context.Context, tx pgx.Tx, name, slug, description, icon string, position, minTierLevel int32) (string, error) + + // Course categories & tags + SeedCourseCategory(ctx context.Context, tx pgx.Tx, name, slug string, description *string, position int32) error + SeedCourseTag(ctx context.Context, tx pgx.Tx, name, slug string, position *int32) error + + // Lookups — return the entity ID or an error if not found. + GetCourseBySlug(ctx context.Context, tx pgx.Tx, slug string) (string, error) + GetCommunityCategoryBySlug(ctx context.Context, tx pgx.Tx, slug string) (string, error) + + // Runtime queries + GetUserCourseProgress(ctx context.Context, pool Pool, userID string) ([]CourseProgressItem, error) +} + +// SeedCourseParams holds the parameters for seeding a course. +type SeedCourseParams struct { + Title string + Slug string + Description string + CertificateEnabled bool + MinTierLevel int32 + DifficultyLevel string + EstimatedDurationMinutes int32 +} + +// SeedLessonParams holds the parameters for seeding a lesson. +type SeedLessonParams struct { + Title string + Slug string + LessonType string + ContentJSON []byte + QuizID string + Position int32 + IsFreePreview bool + CompletionMode string +} + +// SeedQuizQuestionParams holds the parameters for seeding a quiz question. +type SeedQuizQuestionParams struct { + QuestionType string + QuestionText string + Options []map[string]any + CorrectAnswer string + Explanation string + Position int32 + Rubric string + ScenarioText string +} + +// CourseProgressItem is a lightweight view of a user's progress in one course. +type CourseProgressItem struct { + CourseTitle string + CourseSlug string + NextLesson string + DoneCount int + TotalLessons int +} + +// MessengerSeeder provides Messenger data-seeding operations for cross-plugin +// use via PluginBridge. Template plugins retrieve this interface instead of +// importing the Messenger database package directly. +type MessengerSeeder interface { + CountMessagesForPair(ctx context.Context, tx pgx.Tx, participantPairID string) (int64, error) + InsertMessage(ctx context.Context, tx pgx.Tx, p InsertMessageParams) error +} + +// InsertMessageParams holds the parameters for inserting a messenger message. +type InsertMessageParams struct { + SenderType string + SenderID string + SenderDisplayName string + RecipientType string + RecipientID string + RecipientDisplayName string + BodyMarkdown string + ParticipantPairID string +}