func (docstore *DocStoreExt) Insert(collection string, idoc interface{}) (*id.ID, error) { switch doc := idoc.(type) { case *map[string]interface{}: // fdoc := *doc docFlag := FlagNoIndex // docFlag = FlagIndexed blob, err := json.Marshal(doc) if err != nil { return nil, err } // FIXME(tsileo): What to do if there's an empty ID? // Store the payload in a blob hash := fmt.Sprintf("%x", blake2b.Sum256(blob)) docstore.blobStore.Put(hash, blob) // Create a pointer in the key-value store now := time.Now().UTC().Unix() _id, err := id.New(int(now)) if err != nil { return nil, err } bash := make([]byte, len(hash)+1) bash[0] = docFlag copy(bash[1:], []byte(hash)[:]) if _, err := docstore.kvStore.Put(fmt.Sprintf(KeyFmt, collection, _id.String()), string(bash), -1); err != nil { return nil, err } // Returns the doc along with its new ID // if err := docstore.index.Index(_id.String(), doc); err != nil { // return err // } _id.SetHash(hash) return _id, nil } return nil, fmt.Errorf("shouldn't happen") }
func setCustomGlobals(L *luamod.LState) { // Return the server unix timestamp L.SetGlobal("unix", L.NewFunction(func(L *luamod.LState) int { L.Push(luamod.LNumber(time.Now().Unix())) return 1 })) // Generate a random hexadecimal ID with the current timestamp as first 4 bytes, // this means keys will be sorted by creation date automatically if sorted lexicographically L.SetGlobal("hexid", L.NewFunction(func(L *luamod.LState) int { id, err := hexid.New(int(time.Now().UTC().Unix())) if err != nil { panic(err) } L.Push(luamod.LString(id.String())) return 1 })) // Compute the Blake2B hash for the given string L.SetGlobal("blake2b", L.NewFunction(func(L *luamod.LState) int { hash := fmt.Sprintf("%x", blake2b.Sum256([]byte(L.ToString(1)))) L.Push(luamod.LString(hash)) return 1 })) // Sleep for the given number of seconds L.SetGlobal("sleep", L.NewFunction(func(L *luamod.LState) int { time.Sleep(time.Duration(float64(L.ToNumber(1)) * float64(1e9))) return 0 })) // Convert the given Markdown to HTML L.SetGlobal("markdownify", L.NewFunction(func(L *luamod.LState) int { output := blackfriday.MarkdownCommon([]byte(L.ToString(1))) L.Push(luamod.LString(string(output))) return 1 })) // Render execute a Go HTML template, data must be a table with string keys L.SetGlobal("render", L.NewFunction(func(L *luamod.LState) int { tplString := L.ToString(1) data := luautil.TableToMap(L.ToTable(2)) tpl, err := template.New("tpl").Parse(tplString) if err != nil { L.Push(luamod.LString(err.Error())) return 1 } // TODO(tsileo) add some templatFuncs/template filter out := &bytes.Buffer{} if err := tpl.Execute(out, data); err != nil { L.Push(luamod.LString(err.Error())) return 1 } L.Push(luamod.LString(out.String())) return 1 })) // TODO(tsileo) a urljoin? // Return an absoulte URL for the given path L.SetGlobal("url", L.NewFunction(func(L *luamod.LState) int { // FIXME(tsileo) take the host from the req? L.Push(luamod.LString("http://localhost:8050" + L.ToString(1))) return 1 })) }