Documentation
¶
Overview ¶
Package app is glabs-web's core: the layer the GraphQL resolvers delegate to, holding the database and enforcing that every request acts only as its own user. Resolvers stay thin — auth gate plus a call into here — so the rules live in one place rather than scattered across the schema.
Index ¶
- type App
- func (a *App) Assignment(ctx context.Context, course, name string) (*AssignmentView, error)
- func (a *App) Course(ctx context.Context, name string) (*db.StoredCourse, error)
- func (a *App) CourseLint(ctx context.Context, name string) ([]config.Finding, error)
- func (a *App) CourseYAML(ctx context.Context, name string) ([]byte, error)
- func (a *App) Courses(ctx context.Context) ([]*db.StoredCourse, error)
- func (a *App) CreateCourse(ctx context.Context, name, coursePath, semesterPath string, ...) (*db.StoredCourse, error)
- func (a *App) DeleteAssignment(ctx context.Context, course, name string) (bool, error)
- func (a *App) DeleteCourse(ctx context.Context, name string) error
- func (a *App) GetUserByEmail(ctx context.Context, email string) (*model.User, error)
- func (a *App) GitLabTokenStatus(ctx context.Context) (*GitLabTokenStatus, error)
- func (a *App) ImportCourseYAML(ctx context.Context, yaml string) (*db.StoredCourse, error)
- func (a *App) LocalDevUser() *model.User
- func (a *App) RemoveGitLabToken(ctx context.Context) (*GitLabTokenStatus, error)
- func (a *App) ServerInfo() *model.ServerInfo
- func (a *App) SetAssignment(ctx context.Context, course, name string, draft map[string]string) (*AssignmentView, error)
- func (a *App) SetGitLabToken(ctx context.Context, token string) (*GitLabTokenStatus, error)
- func (a *App) ValidateAssignmentDraft(ctx context.Context, course, name string, draft map[string]string) (*ValidationResult, error)
- type AssignmentView
- type FieldKind
- type FieldMeta
- type FieldOption
- type FieldValue
- type GitLabTokenStatus
- type ValidationResult
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type App ¶
type App struct {
// contains filtered or unexported fields
}
func (*App) Assignment ¶ added in v3.4.0
Assignment returns the source values and resolved preview for one assignment of one of the caller's own courses. It returns nil (no error) when the course exists but has no assignment by that name; ErrCourseNotFound propagates when the course itself is not the caller's.
func (*App) CourseLint ¶ added in v3.2.0
CourseLint returns the lint findings for one of the caller's own courses.
func (*App) CourseYAML ¶ added in v3.2.0
CourseYAML returns the course as a downloadable YAML file: the original bytes if they are still current, otherwise a re-encoding of the stored source.
func (*App) CreateCourse ¶ added in v3.9.0
func (a *App) CreateCourse(ctx context.Context, name, coursePath, semesterPath string, useCoursenameAsPrefix, useEmailDomainAsSuffix bool) (*db.StoredCourse, error)
CreateCourse creates a new, empty course from scratch for the caller. It fails if the caller already has a course by that name — assignments are added afterwards with SetAssignment.
func (*App) DeleteAssignment ¶ added in v3.9.0
DeleteAssignment removes one assignment from one of the caller's courses and re-marshals the course YAML. It returns false when there was no such assignment (and does not touch the course).
func (*App) DeleteCourse ¶ added in v3.2.0
DeleteCourse removes one of the caller's own courses.
func (*App) GetUserByEmail ¶
GetUserByEmail looks up a user for the auth middleware's allowlist check.
func (*App) GitLabTokenStatus ¶ added in v3.3.0
func (a *App) GitLabTokenStatus(ctx context.Context) (*GitLabTokenStatus, error)
GitLabTokenStatus reports whether the caller has a stored token, without decrypting or returning it.
func (*App) ImportCourseYAML ¶ added in v3.2.0
ImportCourseYAML parses an uploaded course file and stores it for the caller, keeping the original bytes so a later download returns exactly what was uploaded. Importing a course whose name already exists replaces it.
An inline seeder signKey is rejected: it is a private key, and storing it would mean sealing it, hiding it in GraphQL, and excluding it from dumps — four leaks for a feature no course file uses. signKeyFile (a path) is fine.
func (*App) LocalDevUser ¶
LocalDevUser is the identity used when auth is disabled (local development). It is never consulted when auth is enabled.
func (*App) RemoveGitLabToken ¶ added in v3.3.0
func (a *App) RemoveGitLabToken(ctx context.Context) (*GitLabTokenStatus, error)
RemoveGitLabToken deletes the caller's stored GitLab PAT.
func (*App) ServerInfo ¶
func (a *App) ServerInfo() *model.ServerInfo
ServerInfo returns the build metadata main stashed in viper (ldflags at release, VCS info otherwise), so the GUI can show which build is running.
func (*App) SetAssignment ¶ added in v3.6.0
func (a *App) SetAssignment(ctx context.Context, course, name string, draft map[string]string) (*AssignmentView, error)
SetAssignment applies a draft to one of the caller's assignments: it validates, rejects a concrete draft that does not resolve, then persists — re-marshalling the whole course YAML (a real edit gives up the verbatim original bytes).
func (*App) SetGitLabToken ¶ added in v3.3.0
SetGitLabToken stores the caller's GitLab PAT, AES-256-GCM encrypted. Write-only: the token is never returned by any query, and the plaintext is never persisted or logged. Fails closed if no secrets.key is configured.
func (*App) ValidateAssignmentDraft ¶ added in v3.6.0
func (a *App) ValidateAssignmentDraft(ctx context.Context, course, name string, draft map[string]string) (*ValidationResult, error)
ValidateAssignmentDraft validates a draft against the real resolver without saving.
type AssignmentView ¶ added in v3.4.0
type AssignmentView struct {
Course string
Name string
Extends string
Abstract bool
// Own holds the assignment's own (source) field values, keyed by
// FieldMeta.key, for pre-filling the editor form.
Own []FieldValue
// Resolved is the Show() rendering (may contain ANSI). Empty when the
// assignment cannot be resolved (then ResolveError explains why).
Resolved string
// ResolveError is set when resolution fails — e.g. an abstract base, a
// missing parent, or an `extends` cycle. Not a fault: an abstract base is a
// valid document that simply has no resolved form.
ResolveError string
}
AssignmentView is one assignment in source (own) form plus its resolved preview — the same rendering `glabs show` produces. It makes the inheritance visible in the browser exactly as the CLI's confirmation gate does.
type FieldKind ¶ added in v3.4.0
type FieldKind string
FieldKind is the input shape the GUI should render for a field.
type FieldMeta ¶ added in v3.4.0
type FieldMeta struct {
Key string
Label string
Description string
// Group is the section the field belongs to ("" for the top-level group,
// e.g. "Startercode" for the startercode block), so the GUI can render
// grouped sections. Nested keys are dotted, e.g. "startercode.url".
Group string
Kind FieldKind
Required bool
Deprecated bool
Example string
Options []FieldOption
}
FieldMeta describes one editable assignment field.
func AssignmentSchema ¶ added in v3.4.0
func AssignmentSchema() []FieldMeta
AssignmentSchema returns the metadata for the assignment editor's fields.
type FieldOption ¶ added in v3.4.0
FieldOption is one choice of an ENUM field — a dropdown entry with its own short description.
type FieldValue ¶ added in v3.5.0
FieldValue is one field's own (source) value, stringified and keyed by the same key as FieldMeta so the GUI can pre-fill the schema-driven form.
type GitLabTokenStatus ¶ added in v3.3.0
GitLabTokenStatus reports whether the caller has stored a GitLab token and when — never the token itself.