diff --git a/appview/ingester.go b/appview/ingester.go index 7a3c22a8..adc21796 100644 --- a/appview/ingester.go +++ b/appview/ingester.go @@ -64,6 +64,8 @@ func (i *Ingester) Ingest() processFunc { err = i.ingestSpindleMember(e) case tangled.SpindleNSID: err = i.ingestSpindle(e) + case tangled.StringNSID: + err = i.ingestString(e) } l = i.Logger.With("nsid", e.Commit.Collection) } @@ -549,3 +551,57 @@ func (i *Ingester) ingestSpindle(e *models.Event) error { return nil } + +func (i *Ingester) ingestString(e *models.Event) error { + did := e.Did + rkey := e.Commit.RKey + + var err error + + l := i.Logger.With("handler", "ingestString", "nsid", e.Commit.Collection, "did", did, "rkey", rkey) + l.Info("ingesting record") + + ddb, ok := i.Db.Execer.(*db.DB) + if !ok { + return fmt.Errorf("failed to index string record, invalid db cast") + } + + switch e.Commit.Operation { + case models.CommitOperationCreate, models.CommitOperationUpdate: + raw := json.RawMessage(e.Commit.Record) + record := tangled.String{} + err = json.Unmarshal(raw, &record) + if err != nil { + l.Error("invalid record", "err", err) + return err + } + + string := db.StringFromRecord(did, rkey, record) + + if err = string.Validate(); err != nil { + l.Error("invalid record", "err", err) + return err + } + + if err = db.AddString(ddb, string); err != nil { + l.Error("failed to add string", "err", err) + return err + } + + return nil + + case models.CommitOperationDelete: + if err := db.DeleteString( + ddb, + db.FilterEq("did", did), + db.FilterEq("rkey", rkey), + ); err != nil { + l.Error("failed to delete", "err", err) + return fmt.Errorf("failed to delete string record: %w", err) + } + + return nil + } + + return nil +} diff --git a/appview/middleware/middleware.go b/appview/middleware/middleware.go index e427eb29..2d63282a 100644 --- a/appview/middleware/middleware.go +++ b/appview/middleware/middleware.go @@ -167,16 +167,6 @@ func (mw Middleware) RepoPermissionMiddleware(requiredPerm string) middlewareFun } } -func StripLeadingAt(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - path := req.URL.EscapedPath() - if strings.HasPrefix(path, "/@") { - req.URL.RawPath = "/" + strings.TrimPrefix(path, "/@") - } - next.ServeHTTP(w, req) - }) -} - func (mw Middleware) ResolveIdent() middlewareFunc { excluded := []string{"favicon.ico"} @@ -188,6 +178,8 @@ func (mw Middleware) ResolveIdent() middlewareFunc { return } + didOrHandle = strings.TrimPrefix(didOrHandle, "@") + id, err := mw.idResolver.ResolveIdent(req.Context(), didOrHandle) if err != nil { // invalid did or handle diff --git a/appview/pages/templates/strings/fragments/form.html b/appview/pages/templates/strings/fragments/form.html new file mode 100644 index 00000000..2badb23e --- /dev/null +++ b/appview/pages/templates/strings/fragments/form.html @@ -0,0 +1,89 @@ +{{ define "strings/fragments/form" }} +
+{{ end }} diff --git a/appview/pages/templates/strings/put.html b/appview/pages/templates/strings/put.html new file mode 100644 index 00000000..a086715f --- /dev/null +++ b/appview/pages/templates/strings/put.html @@ -0,0 +1,17 @@ +{{ define "title" }}publish a new string{{ end }} + +{{ define "topbar" }} + {{ template "layouts/topbar" $ }} +{{ end }} + +{{ define "content" }} +Create a new string
+Store and share code snippets with ease.
+ {{ else }} +Edit string
+ {{ end }} +