removed profile image from the explore reult struct

This commit is contained in:
2023-06-10 09:07:09 +01:00
parent a6f2282d70
commit 9499f7ae92
6 changed files with 156 additions and 126 deletions

View File

@@ -48,7 +48,6 @@ type BlockRecordFile struct {
Size uint64 // Size of the file data
NodeID []byte // Node ID, owner of the file
Tags []BlockRecordFileTag // Tags provide additional metadata
ProfileImage []byte // ProfileImage of the user who uploaded the file
Username string // Username of the User who uploaded the file
}

View File

@@ -32,27 +32,29 @@ type apiFileMetadata struct {
// apiFile is the metadata of a file published on the blockchain
type apiFile struct {
ID uuid.UUID `json:"id"` // Unique ID.
Hash []byte `json:"hash"` // Blake3 hash of the file data
Type uint8 `json:"type"` // File Type. For example audio or document. See TypeX.
Format uint16 `json:"format"` // File Format. This is more granular, for example PDF or Word file. See FormatX.
Size uint64 `json:"size"` // Size of the file
Folder string `json:"folder"` // Folder, optional
Name string `json:"name"` // Name of the file
Description string `json:"description"` // Description. This is expected to be multiline and contain hashtags!
Date time.Time `json:"date"` // Date shared
NodeID []byte `json:"nodeid"` // Node ID, owner of the file. Read only.
Metadata []apiFileMetadata `json:"metadata"` // Additional metadata.
ProfilePicture []byte `json:"profilepicture"` // The Profile Picture of the user who uploaded the file
Username string `json:"username"` // Username of the user who uploaded the file
ID uuid.UUID `json:"id"` // Unique ID.
Hash []byte `json:"hash"` // Blake3 hash of the file data
Type uint8 `json:"type"` // File Type. For example audio or document. See TypeX.
Format uint16 `json:"format"` // File Format. This is more granular, for example PDF or Word file. See FormatX.
Size uint64 `json:"size"` // Size of the file
Folder string `json:"folder"` // Folder, optional
Name string `json:"name"` // Name of the file
Description string `json:"description"` // Description. This is expected to be multiline and contain hashtags!
Date time.Time `json:"date"` // Date shared
NodeID []byte `json:"nodeid"` // Node ID, owner of the file. Read only.
Metadata []apiFileMetadata `json:"metadata"` // Additional metadata.
Username []byte `json:"username"` // Username of the user who uploaded the file
}
// --- conversion from core to API data ---
func blockRecordFileToAPI(input blockchain.BlockRecordFile) (output apiFile) {
output = apiFile{ID: input.ID, Hash: input.Hash, NodeID: input.NodeID, Type: input.Type, Format: input.Format, Size: input.Size, ProfilePicture: input.ProfileImage, Username: input.Username, Metadata: []apiFileMetadata{}}
output = apiFile{ID: input.ID, Hash: input.Hash, NodeID: input.NodeID, Type: input.Type, Format: input.Format, Size: input.Size, Username: []byte(input.Username), Metadata: []apiFileMetadata{}}
for _, tag := range input.Tags {
if tag.Type == blockchain.TagSharedByCount && tag.Number() == 0 {
return apiFile{}
}
switch tag.Type {
case blockchain.TagName:
output.Name = tag.Text()
@@ -208,11 +210,14 @@ func (api *WebapiInstance) apiBlockchainFileList(w http.ResponseWriter, r *http.
var result apiBlockAddFiles
for _, file := range files {
apiFile := blockRecordFileToAPI(file)
if apiFile.Format == uint16(fileType) {
result.Files = append(result.Files, apiFile)
ApiFile := blockRecordFileToAPI(file)
if ApiFile.NodeID == nil {
continue
}
if ApiFile.Format == uint16(fileType) {
result.Files = append(result.Files, ApiFile)
} else if err != nil {
result.Files = append(result.Files, apiFile)
result.Files = append(result.Files, ApiFile)
}
}

View File

@@ -69,11 +69,13 @@ func (api *WebapiInstance) ExploreFileSharedByNodeThatSharedSimilarFile(fileType
// loop over results
for n := range resultFiles {
result.Files = append(result.Files, blockRecordFileToAPI(resultFiles[n]))
ApiFile := blockRecordFileToAPI(resultFiles[n])
if ApiFile.NodeID == nil {
continue
}
result.Files = append(result.Files, ApiFile)
}
//
}
result.Status = 1 // No more results to expect

View File

@@ -7,6 +7,7 @@ Author: Peter Kleissner
package webapi
import (
"bytes"
"net/http"
"strconv"
@@ -41,15 +42,38 @@ func (api *WebapiInstance) apiProfileList(w http.ResponseWriter, r *http.Request
var fields []blockchain.BlockRecordProfile
var status int
if valid {
fields, status = api.Backend.NodelistLookup(NodeID).Backend.UserBlockchain.ProfileList()
result := apiProfileData{Status: status}
if valid && !bytes.Equal(NodeID, api.Backend.SelfNodeID()) {
_, node, _ := api.Backend.FindNode(NodeID, 100)
// First iteration of the entire blockchain to search for the profile
// image and Username of the user
for blockN1 := node.BlockchainHeight - 1; blockN1 > 0; blockN1-- {
blockDecoded, _, found, _ := node.Backend.ReadBlock(node.PublicKey, node.BlockchainVersion, blockN1)
if !found {
continue
}
// Adding profile image and Username to the output
for raw := range blockDecoded.Block.RecordsRaw {
if blockDecoded.Block.RecordsRaw[raw].Type == blockchain.ProfileName {
result.Status = 0
result.Fields = append(result.Fields, blockRecordProfileToAPI(blockchain.BlockRecordProfile{Type: uint16(blockDecoded.Block.RecordsRaw[raw].Type), Data: blockDecoded.Block.RecordsRaw[raw].Data[:]}))
}
if blockDecoded.Block.RecordsRaw[raw].Type == blockchain.ProfilePicture {
result.Status = 0
result.Fields = append(result.Fields, blockRecordProfileToAPI(blockchain.BlockRecordProfile{Type: uint16(blockDecoded.Block.RecordsRaw[raw].Type), Data: blockDecoded.Block.RecordsRaw[raw].Data[:]}))
}
}
}
fields, status = node.Backend.UserBlockchain.ProfileList()
} else {
fields, status = api.Backend.UserBlockchain.ProfileList()
}
result := apiProfileData{Status: status}
for n := range fields {
result.Fields = append(result.Fields, blockRecordProfileToAPI(fields[n]))
result.Status = status
for n := range fields {
result.Fields = append(result.Fields, blockRecordProfileToAPI(fields[n]))
}
}
EncodeJSON(api.Backend, w, r, result)
@@ -75,7 +99,8 @@ func (api *WebapiInstance) apiProfileRead(w http.ResponseWriter, r *http.Request
var data []byte
if !valid {
if data, result.Status = api.Backend.UserBlockchain.ProfileReadField(uint16(fieldN)); result.Status == blockchain.StatusOK {
_, node, _ := api.Backend.FindNode(NodeID, 100)
if data, result.Status = node.Backend.UserBlockchain.ProfileReadField(uint16(fieldN)); result.Status == blockchain.StatusOK {
result.Fields = append(result.Fields, blockRecordProfileToAPI(blockchain.BlockRecordProfile{Type: uint16(fieldN), Data: data}))
}
} else {

View File

@@ -390,7 +390,11 @@ func (api *WebapiInstance) ExploreHelper(fileType int, limit, offset int, nodeID
// loop over results
for n := range resultFiles {
result.Files = append(result.Files, blockRecordFileToAPI(resultFiles[n]))
ApiFile := blockRecordFileToAPI(resultFiles[n])
if ApiFile.NodeID == nil {
continue
}
result.Files = append(result.Files, ApiFile)
}
if len(result.Files) == 0 {

View File

@@ -6,124 +6,119 @@ Author: Peter Kleissner
package webapi
import (
"fmt"
"time"
"fmt"
"time"
"github.com/PeernetOfficial/core"
"github.com/PeernetOfficial/core/blockchain"
"github.com/PeernetOfficial/core"
"github.com/PeernetOfficial/core/blockchain"
)
// queryRecentShared returns recently shared files on the network from random peers until the limit is reached.
func (api *WebapiInstance) queryRecentShared(backend *core.Backend, fileType int, limitPeer, offsetTotal, limitTotal uint64, nodeID []byte, nodeIDState bool) (files []blockchain.BlockRecordFile) {
if limitPeer == 0 {
limitPeer = 1
}
// Assign peer list as an empty array
var peerList []*core.PeerInfo
if limitPeer == 0 {
limitPeer = 1
}
// Assign peer list as an empty array
var peerList []*core.PeerInfo
// check if the NodeID is provided or not
if len(nodeID) == 0 && !nodeIDState {
// Use the peer list to know about active peers. Random order!
peerList = api.Backend.PeerlistGet()
} else {
// Get peer information based on the NodeID provided
_, peer, err := api.Backend.FindNode(nodeID, time.Second*5)
if err != nil {
return
}
peerList = append(peerList, peer)
}
// check if the NodeID is provided or not
if len(nodeID) == 0 && !nodeIDState {
// Use the peer list to know about active peers. Random order!
peerList = api.Backend.PeerlistGet()
} else {
// Get peer information based on the NodeID provided
_, peer, err := api.Backend.FindNode(nodeID, time.Second*5)
if err != nil {
return
}
peerList = append(peerList, peer)
}
// Files from peers exceeding the limit. It is used if from all peers the total limit is not reached.
var filesSeconday []blockchain.BlockRecordFile
// Files from peers exceeding the limit. It is used if from all peers the total limit is not reached.
var filesSeconday []blockchain.BlockRecordFile
for _, peer := range peerList {
if peer.BlockchainHeight == 0 {
continue
}
for _, peer := range peerList {
if peer.BlockchainHeight == 0 {
continue
}
var filesFromPeer uint64
var filesFromPeer uint64
var Name string
//var ProfileImage []byte
//var Name string
ProfileNameFound := false
//ProfileNameFound := false
//ProfilePictureFound := false
//
//// First iteration of the entire blockchain to search for the profile
//// image and Username of the user
//for blockN1 := peer.BlockchainHeight - 1; blockN1 > 0; blockN1-- {
// blockDecoded, _, found, _ := backend.ReadBlock(peer.PublicKey, peer.BlockchainVersion, blockN1)
// if !found {
// continue
// }
// // Adding profile image and Username to the output
// for raw := range blockDecoded.Block.RecordsRaw {
// if blockDecoded.Block.RecordsRaw[raw].Type == blockchain.ProfilePicture && !ProfilePictureFound {
// ProfileImage = blockDecoded.Block.RecordsRaw[raw].Data
// ProfilePictureFound = true
// }
// if blockDecoded.Block.RecordsRaw[raw].Type == blockchain.ProfileName && !ProfileNameFound {
// Name = string(blockDecoded.Block.RecordsRaw[raw].Data[:])
// ProfileNameFound = true
// }
// }
//}
// First iteration of the entire blockchain to search for the profile
// image and Username of the user
for blockN1 := peer.BlockchainHeight - 1; blockN1 > 0; blockN1-- {
blockDecoded, _, found, _ := backend.ReadBlock(peer.PublicKey, peer.BlockchainVersion, blockN1)
if !found {
continue
}
// Adding profile image and Username to the output
for raw := range blockDecoded.Block.RecordsRaw {
if blockDecoded.Block.RecordsRaw[raw].Type == blockchain.ProfileName && !ProfileNameFound {
Name = string(blockDecoded.Block.RecordsRaw[raw].Data[:])
ProfileNameFound = true
}
}
}
// decode blocks from top down
blockLoop:
for blockN := peer.BlockchainHeight - 1; blockN > 0; blockN-- {
blockDecoded, _, found, _ := backend.ReadBlock(peer.PublicKey, peer.BlockchainVersion, blockN)
// decode blocks from top down
blockLoop:
for blockN := peer.BlockchainHeight - 1; blockN > 0; blockN-- {
blockDecoded, _, found, _ := backend.ReadBlock(peer.PublicKey, peer.BlockchainVersion, blockN)
if !found {
continue
}
if !found {
continue
}
for _, record := range blockDecoded.RecordsDecoded {
if file, ok := record.(blockchain.BlockRecordFile); ok && isFileTypeMatchBlock(&file, fileType) {
// add the tags 'Shared By Count' and 'Shared By GeoIP'
file.Tags = append(file.Tags, blockchain.TagFromNumber(blockchain.TagSharedByCount, 1))
if latitude, longitude, valid := api.Peer2GeoIP(peer); valid {
sharedByGeoIP := fmt.Sprintf("%.4f", latitude) + "," + fmt.Sprintf("%.4f", longitude)
file.Tags = append(file.Tags, blockchain.TagFromText(blockchain.TagSharedByGeoIP, sharedByGeoIP))
}
for _, record := range blockDecoded.RecordsDecoded {
if file, ok := record.(blockchain.BlockRecordFile); ok && isFileTypeMatchBlock(&file, fileType) {
// add the tags 'Shared By Count' and 'Shared By GeoIP'
file.Tags = append(file.Tags, blockchain.TagFromNumber(blockchain.TagSharedByCount, 1))
if latitude, longitude, valid := api.Peer2GeoIP(peer); valid {
sharedByGeoIP := fmt.Sprintf("%.4f", latitude) + "," + fmt.Sprintf("%.4f", longitude)
file.Tags = append(file.Tags, blockchain.TagFromText(blockchain.TagSharedByGeoIP, sharedByGeoIP))
}
// found a new file! append.
if filesFromPeer < limitPeer {
filesFromPeer++
file.Username = Name
if offsetTotal > 0 {
offsetTotal--
continue
}
// found a new file! append.
if filesFromPeer < limitPeer {
filesFromPeer++
files = append(files, file)
if offsetTotal > 0 {
offsetTotal--
continue
}
if uint64(len(files)) >= limitTotal {
return
}
} else if uint64(len(filesSeconday)) < limitTotal-uint64(len(files)) {
filesSeconday = append(filesSeconday, file)
} else {
break blockLoop
}
}
}
}
}
files = append(files, file)
files = append(files, filesSeconday...)
if uint64(len(files)) >= limitTotal {
return
}
} else if uint64(len(filesSeconday)) < limitTotal-uint64(len(files)) {
filesSeconday = append(filesSeconday, file)
} else {
break blockLoop
}
}
}
}
}
return
files = append(files, filesSeconday...)
return
}
// isFileTypeMatchBlock checks if the file type matches. -1 = accept any. -2 = core.TypeBinary, core.TypeCompressed, core.TypeContainer, core.TypeExecutable.
func isFileTypeMatchBlock(file *blockchain.BlockRecordFile, fileType int) bool {
if fileType == -1 {
return true
} else if fileType == -2 {
return file.Type == core.TypeBinary || file.Type == core.TypeCompressed || file.Type == core.TypeContainer || file.Type == core.TypeExecutable
}
if fileType == -1 {
return true
} else if fileType == -2 {
return file.Type == core.TypeBinary || file.Type == core.TypeCompressed || file.Type == core.TypeContainer || file.Type == core.TypeExecutable
}
return file.Type == uint8(fileType)
return file.Type == uint8(fileType)
}