func search(ctx *web.Context, collection string) { ctx.ContentType("json") ctx.SetHeader("Access-Control-Allow-Origin", "*", true) query := ctx.Params["query"] var limit, offset int64 var err error if limit, err = strconv.ParseInt(ctx.Params["limit"], 10, 32); err != nil { limit = 10 } if offset, err = strconv.ParseInt(ctx.Params["offset"], 10, 32); err != nil { offset = 0 } results, err := c.Search(collection, query, int(limit), int(offset)) buf := new(bytes.Buffer) encoder := json.NewEncoder(buf) if err != nil { encoder.Encode(err) ctx.WriteHeader(err.(*gorc.OrchestrateError).StatusCode) } else { encoder.Encode(results) } ctx.Write(buf.Bytes()) }
func handleEntryCreditBalance(ctx *web.Context, eckey string) { type ecbal struct { Response string Success bool } var b ecbal adr, err := hex.DecodeString(eckey) if err == nil && len(adr) != common.HASH_LENGTH { b = ecbal{Response: "Invalid Address", Success: false} } if err == nil { if bal, err := factomapi.ECBalance(eckey); err != nil { wsLog.Error(err) return } else { str := fmt.Sprintf("%d", bal) b = ecbal{Response: str, Success: true} } } else { b = ecbal{Response: err.Error(), Success: false} } if p, err := json.Marshal(b); err != nil { wsLog.Error(err) return } else { ctx.Write(p) } }
func handleFactoidBalance(ctx *web.Context, eckey string) { type fbal struct { Response string Success bool } var b fbal adr, err := hex.DecodeString(eckey) if err == nil && len(adr) != common.HASH_LENGTH { b = fbal{Response: "Invalid Address", Success: false} } if err == nil { v := int64(common.FactoidState.GetBalance(fct.NewAddress(adr))) str := fmt.Sprintf("%d", v) b = fbal{Response: str, Success: true} } else { b = fbal{Response: err.Error(), Success: false} } if p, err := json.Marshal(b); err != nil { wsLog.Error(err) return } else { ctx.Write(p) } }
func HandleDirectoryBlock(ctx *web.Context, hashkey string) { state := ctx.Server.Env["state"].(interfaces.IState) d := new(DBlock) h, err := primitives.HexToHash(hashkey) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } dbase := state.GetDB() block, err := dbase.FetchDBlockByKeyMR(h) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } if block == nil { block, err = dbase.FetchDBlockByHash(h) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } if block == nil { //TODO: Handle block not found return } } d.Header.PrevBlockKeyMR = block.GetHeader().GetPrevKeyMR().String() d.Header.SequenceNumber = block.GetHeader().GetDBHeight() d.Header.Timestamp = block.GetHeader().GetTimestamp() * 60 for _, v := range block.GetDBEntries() { l := new(EBlockAddr) l.ChainID = v.GetChainID().String() l.KeyMR = v.GetKeyMR().String() d.EntryBlockList = append(d.EntryBlockList, *l) } if p, err := json.Marshal(d); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } }
func HandleGetAddresses(ctx *web.Context) { b := new(Response) b.Response = string(GetAddresses()) b.Success = true j, err := json.Marshal(b) if err != nil { reportResults(ctx, err.Error(), false) return } ctx.Write(j) }
func handleGetFee(ctx *web.Context) { type x struct{ Fee int64 } b := new(x) b.Fee = int64(common.FactoidState.GetFactoshisPerEC()) if p, err := json.Marshal(b); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) return } else { ctx.Write(p) } }
// True is sccuess! False is failure. The Response is what the CLI // should report. func reportResults(ctx *web.Context, response string, success bool) { b := Response{ Response: response, Success: success, } if p, err := json.Marshal(b); err != nil { ctx.WriteHeader(httpBad) return } else { ctx.Write(p) } }
func returnMsg(ctx *web.Context, msg string, success bool) { type rtn struct { Response string Success bool } r := rtn{Response: msg, Success: success} if p, err := json.Marshal(r); err != nil { wsLog.Error(err) return } else { ctx.Write(p) } }
func handleProperties(ctx *web.Context) { r := new(common.Properties) r.Factomd_Version = common.FACTOMD_VERSION r.Protocol_Version = btcd.ProtocolVersion if p, err := json.Marshal(r); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } }
func HandleGetTransactions(ctx *web.Context) { b := new(Response) txt, err := GetTransactions(ctx) if err != nil { reportResults(ctx, err.Error(), false) return } b.Response = string(txt) b.Success = true j, err := json.Marshal(b) if err != nil { reportResults(ctx, err.Error(), false) return } ctx.Write(j) }
func GetDeployments(ctx *web.Context) { fmt.Printf("************************************\n") deployments, err := LoadDeployments() if err != nil { fmt.Println(err) return } for _, deployment := range deployments { fmt.Printf(" Deployment %s ...\n", deployment.Name) } b, err := json.Marshal(deployments) if err != nil { fmt.Println("error:", err) } ctx.ContentType("json") ctx.Write(b) }
func HandleGetFee(ctx *web.Context) { state := ctx.Server.Env["state"].(interfaces.IState) type x struct{ Fee int64 } b := new(x) b.Fee = int64(state.GetFactoidState().GetFactoshisPerEC()) if p, err := json.Marshal(b); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) return } else { ctx.Write(p) } }
func handleCommitChain(ctx *web.Context) { type commitchain struct { CommitChainMsg string } c := new(commitchain) if p, err := ioutil.ReadAll(ctx.Request.Body); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { if err := json.Unmarshal(p, c); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } } commit := common.NewCommitChain() if p, err := hex.DecodeString(c.CommitChainMsg); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { _, err := commit.UnmarshalBinaryData(p) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } } if err := factomapi.CommitChain(commit); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } // ctx.WriteHeader(httpOK) }
func handleRevealEntry(ctx *web.Context) { type revealentry struct { Entry string } e := new(revealentry) if p, err := ioutil.ReadAll(ctx.Request.Body); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { if err := json.Unmarshal(p, e); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } } entry := common.NewEntry() if p, err := hex.DecodeString(e.Entry); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { _, err := entry.UnmarshalBinaryData(p) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } } if err := factomapi.RevealEntry(entry); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } // ctx.WriteHeader(httpOK) }
func HandleDirectoryBlockHead(ctx *web.Context) { state := ctx.Server.Env["state"].(interfaces.IState) h := new(DBHead) h.KeyMR = state.GetPreviousDirectoryBlock().GetKeyMR().String() fmt.Println(h.KeyMR) if p, err := json.Marshal(h); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } }
func handleEntry(ctx *web.Context, hash string) { type entry struct { ChainID string Content string ExtIDs []string } e := new(entry) if entry, err := factomapi.EntryByHash(hash); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { e.ChainID = entry.ChainID.String() e.Content = hex.EncodeToString(entry.Content) for _, v := range entry.ExtIDs { e.ExtIDs = append(e.ExtIDs, hex.EncodeToString(v)) } } if p, err := json.Marshal(e); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } }
func handleDirectoryBlockHead(ctx *web.Context) { type dbhead struct { KeyMR string } h := new(dbhead) if block, err := factomapi.DBlockHead(); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { h.KeyMR = block.KeyMR.String() } if p, err := json.Marshal(h); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } // ctx.WriteHeader(httpOK) }
func HandleChainHead(ctx *web.Context, hashkey string) { state := ctx.Server.Env["state"].(interfaces.IState) c := new(CHead) h, err := primitives.HexToHash(hashkey) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } dbase := state.GetDB() mr, err := dbase.FetchHeadIndexByChainID(h) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } if mr == nil { err := fmt.Errorf("Missing Chain Head") wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } c.ChainHead = mr.String() if p, err := json.Marshal(c); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } }
func HandleFactoidBalance(ctx *web.Context, eckey string) { state := ctx.Server.Env["state"].(interfaces.IState) var b FactoidBalance adr, err := hex.DecodeString(eckey) if err == nil && len(adr) != constants.HASH_LENGTH { b = FactoidBalance{Response: "Invalid Address", Success: false} } if err == nil { v := int64(state.GetFactoidState().GetFactoidBalance(factoid.NewAddress(adr).Fixed())) str := fmt.Sprintf("%d", v) b = FactoidBalance{Response: str, Success: true} } else { b = FactoidBalance{Response: err.Error(), Success: false} } if p, err := json.Marshal(b); err != nil { wsLog.Error(err) return } else { ctx.Write(p) } }
func HandleEntryCreditBalance(ctx *web.Context, eckey string) { state := ctx.Server.Env["state"].(interfaces.IState) var b FactoidBalance adr, err := primitives.HexToHash(eckey) if err == nil { b = FactoidBalance{Response: "Invalid Address", Success: false} } if err == nil { v := int64(state.GetFactoidState().GetECBalance(adr.Fixed())) str := fmt.Sprintf("%d", v) b = FactoidBalance{Response: str, Success: true} } else { b = FactoidBalance{Response: err.Error(), Success: false} } if p, err := json.Marshal(b); err != nil { wsLog.Error(err) return } else { ctx.Write(p) } }
func HandleGetRaw(ctx *web.Context, hashkey string) { state := ctx.Server.Env["state"].(interfaces.IState) //TODO: var block interfaces.BinaryMarshallable d := new(RawData) h, err := primitives.HexToHash(hashkey) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } dbase := state.GetDB() var b []byte // try to find the block data in db and return the first one found if block, _ := dbase.FetchFBlockByKeyMR(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ := dbase.FetchDBlockByKeyMR(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ := dbase.FetchABlockByKeyMR(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ := dbase.FetchEBlockByKeyMR(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ := dbase.FetchECBlockByKeyMR(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ := dbase.FetchEntryByHash(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ := dbase.FetchFBlockByHash(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ := dbase.FetchDBlockByHash(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ := dbase.FetchABlockByHash(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ := dbase.FetchEBlockByHash(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ := dbase.FetchECBlockByHash(h); block != nil { b, _ = block.MarshalBinary() } d.Data = hex.EncodeToString(b) if p, err := json.Marshal(d); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } }
func handleGetRaw(ctx *web.Context, hashkey string) { type rawData struct { Data string } //TODO: var block common.BinaryMarshallable d := new(rawData) h, err := common.HexToHash(hashkey) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } // try to find the block data in db and return the first one found if block, _ := dbase.FetchFBlockByHash(h); block != nil { bytes, _ := block.MarshalBinary() d.Data = hex.EncodeToString(bytes[:]) } else if block, _ := dbase.FetchDBlockByHash(h); block != nil { bytes, _ := block.MarshalBinary() d.Data = hex.EncodeToString(bytes[:]) } else if block, _ := dbase.FetchABlockByHash(h); block != nil { bytes, _ := block.MarshalBinary() d.Data = hex.EncodeToString(bytes[:]) } else if block, _ := dbase.FetchDBlockByMR(h); block != nil { bytes, _ := block.MarshalBinary() d.Data = hex.EncodeToString(bytes[:]) } else if block, _ := dbase.FetchEBlockByHash(h); block != nil { bytes, _ := block.MarshalBinary() d.Data = hex.EncodeToString(bytes[:]) } else if block, _ := dbase.FetchEBlockByMR(h); block != nil { bytes, _ := block.MarshalBinary() d.Data = hex.EncodeToString(bytes[:]) } else if block, _ := dbase.FetchECBlockByHash(h); block != nil { bytes, _ := block.MarshalBinary() d.Data = hex.EncodeToString(bytes[:]) } else if block, _ := dbase.FetchEntryByHash(h); block != nil { bytes, _ := block.MarshalBinary() d.Data = hex.EncodeToString(bytes[:]) } if p, err := json.Marshal(d); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } // ctx.WriteHeader(httpOK) }
func HandleEntry(ctx *web.Context, hashkey string) { state := ctx.Server.Env["state"].(interfaces.IState) e := new(EntryStruct) h, err := primitives.HexToHash(hashkey) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } dbase := state.GetDB() entry, err := dbase.FetchEntryByHash(h) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } if entry == nil { //TODO: Handle block not found return } e.ChainID = entry.GetChainIDHash().String() e.Content = hex.EncodeToString(entry.GetContent()) for _, v := range entry.ExternalIDs() { e.ExtIDs = append(e.ExtIDs, hex.EncodeToString(v)) } if p, err := json.Marshal(e); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } }
func handleDirectoryBlock(ctx *web.Context, keymr string) { type eblockaddr struct { ChainID string KeyMR string } type dblock struct { Header struct { PrevBlockKeyMR string SequenceNumber uint32 Timestamp uint32 } EntryBlockList []eblockaddr } d := new(dblock) if block, err := factomapi.DBlockByKeyMR(keymr); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { d.Header.PrevBlockKeyMR = block.Header.PrevKeyMR.String() d.Header.SequenceNumber = block.Header.DBHeight d.Header.Timestamp = block.Header.Timestamp * 60 for _, v := range block.DBEntries { l := new(eblockaddr) l.ChainID = v.ChainID.String() l.KeyMR = v.KeyMR.String() d.EntryBlockList = append(d.EntryBlockList, *l) } } if p, err := json.Marshal(d); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } // ctx.WriteHeader(httpOK) }
func unpack(ctx *web.Context, action func(*payload)) { flusher, _ := ctx.ResponseWriter.(http.Flusher) defer flusher.Flush() var v payload if body, err := ioutil.ReadAll(ctx.Request.Body); err == nil { defer ctx.Request.Body.Close() if err := json.Unmarshal(body, &v); err != nil { ctx.WriteHeader(400) ctx.Write(errorMsg("INSUFFICIENT PAYLOAD")) return } if !verify(v.Signature) { ctx.WriteHeader(403) ctx.Write(errorMsg("INVALID SIGNATURE")) return } action(&v) return } else { ctx.WriteHeader(400) ctx.Write(errorMsg(err.Error())) } }
func handleDirectoryBlockHeight(ctx *web.Context) { type dbheight struct { Height int } h := new(dbheight) if block, err := factomapi.DBlockHead(); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { h.Height = int(block.Header.DBHeight) } if p, err := json.Marshal(h); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } }
func handleChainHead(ctx *web.Context, chainid string) { type chead struct { ChainHead string } c := new(chead) if mr, err := factomapi.ChainHead(chainid); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { c.ChainHead = mr.String() } if p, err := json.Marshal(c); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } }
func HandleEntryBlock(ctx *web.Context, hashkey string) { state := ctx.Server.Env["state"].(interfaces.IState) e := new(EBlock) h, err := primitives.HexToHash(hashkey) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } dbase := state.GetDB() block, err := dbase.FetchEBlockByKeyMR(h) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } if block == nil { block, err = dbase.FetchEBlockByHash(h) if err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } if block == nil { //TODO: Handle block not found return } } e.Header.BlockSequenceNumber = block.GetHeader().GetEBSequence() e.Header.ChainID = block.GetHeader().GetChainID().String() e.Header.PrevKeyMR = block.GetHeader().GetPrevKeyMR().String() if dblock, err := dbase.FetchDBlockByHeight(block.GetHeader().GetDBHeight()); err == nil { e.Header.Timestamp = dblock.GetHeader().GetTimestamp() * 60 } // create a map of possible minute markers that may be found in the // EBlock Body mins := make(map[string]uint8) for i := byte(1); i <= 10; i++ { h := make([]byte, 32) h[len(h)-1] = i mins[hex.EncodeToString(h)] = i } estack := make([]EntryAddr, 0) for _, v := range block.GetBody().GetEBEntries() { if n, exist := mins[v.String()]; exist { // the entry is a minute marker. add time to all of the // previous entries for the minute t := e.Header.Timestamp + 60*uint32(n) for _, w := range estack { w.Timestamp = t e.EntryList = append(e.EntryList, w) } estack = make([]EntryAddr, 0) } else { l := new(EntryAddr) l.EntryHash = v.String() estack = append(estack, *l) } } if p, err := json.Marshal(e); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } }
func handleEntryBlock(ctx *web.Context, keymr string) { type entryaddr struct { EntryHash string Timestamp uint32 } type eblock struct { Header struct { BlockSequenceNumber uint32 ChainID string PrevKeyMR string Timestamp uint32 } EntryList []entryaddr } e := new(eblock) if block, err := factomapi.EBlockByKeyMR(keymr); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { e.Header.BlockSequenceNumber = block.Header.EBSequence e.Header.ChainID = block.Header.ChainID.String() e.Header.PrevKeyMR = block.Header.PrevKeyMR.String() if dblock, err := dbase.FetchDBlockByHeight(block.Header.DBHeight); err == nil { e.Header.Timestamp = dblock.Header.Timestamp * 60 } // create a map of possible minute markers that may be found in the // EBlock Body mins := make(map[string]uint8) for i := byte(1); i <= 10; i++ { h := make([]byte, 32) h[len(h)-1] = i mins[hex.EncodeToString(h)] = i } estack := make([]entryaddr, 0) for _, v := range block.Body.EBEntries { if n, exist := mins[v.String()]; exist { // the entry is a minute marker. add time to all of the // previous entries for the minute t := e.Header.Timestamp + 60*uint32(n) for _, w := range estack { w.Timestamp = t e.EntryList = append(e.EntryList, w) } estack = make([]entryaddr, 0) } else { l := new(entryaddr) l.EntryHash = v.String() estack = append(estack, *l) } } } if p, err := json.Marshal(e); err != nil { wsLog.Error(err) ctx.WriteHeader(httpBad) ctx.Write([]byte(err.Error())) return } else { ctx.Write(p) } }