400 lines
14 KiB
Go
400 lines
14 KiB
Go
|
|
||
|
// myHiddenContent provides functions to manage a moderator's hidden content
|
||
|
// Hidden content is content that the moderator does not want to review
|
||
|
// An example is content written in a language that the moderator does not understand
|
||
|
|
||
|
package myHiddenContent
|
||
|
|
||
|
//TODO: Add job to prune hidden content when we don't need it anymore
|
||
|
|
||
|
import "seekia/internal/encoding"
|
||
|
import "seekia/internal/helpers"
|
||
|
import "seekia/internal/identity"
|
||
|
import "seekia/internal/myDatastores/myMap"
|
||
|
import "seekia/internal/profiles/readProfiles"
|
||
|
|
||
|
import "strings"
|
||
|
import "time"
|
||
|
import "errors"
|
||
|
|
||
|
|
||
|
// Map Structure: Profile Hash -> Added Time + "$" + Author Identity Hash
|
||
|
var myHiddenProfilesMapObject *myMap.MyMap
|
||
|
|
||
|
// Map Structure: Attribute Hash -> Added Time + "$" + Author Identity Hash
|
||
|
var myHiddenAttributesMapObject *myMap.MyMap
|
||
|
|
||
|
// Map Structure: Message Hash -> Added Time + "$" + Author Identity Hash
|
||
|
var myHiddenMessagesMapObject *myMap.MyMap
|
||
|
|
||
|
func InitializeMyHiddenContentDatastores()error{
|
||
|
|
||
|
newMyHiddenProfilesMapObject, err := myMap.CreateNewMap("MyHiddenProfiles")
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
newMyHiddenAttributesMapObject, err := myMap.CreateNewMap("MyHiddenAttributes")
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
newMyHiddenMessagesMapObject, err := myMap.CreateNewMap("MyHiddenMessages")
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
myHiddenProfilesMapObject = newMyHiddenProfilesMapObject
|
||
|
myHiddenAttributesMapObject = newMyHiddenAttributesMapObject
|
||
|
myHiddenMessagesMapObject = newMyHiddenMessagesMapObject
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
|
||
|
func AddProfileToMyHiddenProfilesMap(profileHash [28]byte, authorIdentityHash [16]byte)error{
|
||
|
|
||
|
isValid, err := readProfiles.VerifyProfileHash(profileHash, false, "", false, false)
|
||
|
if (err != nil) { return err }
|
||
|
if (isValid == false){
|
||
|
profileHashHex := encoding.EncodeBytesToHexString(profileHash[:])
|
||
|
return errors.New("AddProfileToMyHiddenProfilesMap called with invalid profile hash: " + profileHashHex)
|
||
|
}
|
||
|
|
||
|
profileHashString := encoding.EncodeBytesToHexString(profileHash[:])
|
||
|
|
||
|
authorIdentityHashString, _, err := identity.EncodeIdentityHashBytesToString(authorIdentityHash)
|
||
|
if (err != nil) {
|
||
|
authorIdentityHashHex := encoding.EncodeBytesToHexString(authorIdentityHash[:])
|
||
|
return errors.New("AddProfileToMyHiddenProfilesMap called with invalid authorIdentityHash: " + authorIdentityHashHex)
|
||
|
}
|
||
|
|
||
|
addedTime := time.Now().Unix()
|
||
|
addedTimeString := helpers.ConvertInt64ToString(addedTime)
|
||
|
|
||
|
entryValue := addedTimeString + "$" + authorIdentityHashString
|
||
|
|
||
|
err = myHiddenProfilesMapObject.SetMapEntry(profileHashString, entryValue)
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
|
||
|
func DeleteProfileFromMyHiddenProfilesMap(profileHash [28]byte)error{
|
||
|
|
||
|
isValid, err := readProfiles.VerifyProfileHash(profileHash, false, "", false, false)
|
||
|
if (err != nil) { return err }
|
||
|
if (isValid == false){
|
||
|
profileHashHex := encoding.EncodeBytesToHexString(profileHash[:])
|
||
|
return errors.New("DeleteProfileFromMyHiddenProfilesMap called with invalid profile hash: " + profileHashHex)
|
||
|
}
|
||
|
|
||
|
profileHashString := encoding.EncodeBytesToHexString(profileHash[:])
|
||
|
|
||
|
err = myHiddenProfilesMapObject.DeleteMapEntry(profileHashString)
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: Profile is hidden
|
||
|
// -int64: Profile added time
|
||
|
// -[16]byte: Profile author identity hash
|
||
|
// -error
|
||
|
func CheckIfProfileIsHidden(profileHash [28]byte)(bool, int64, [16]byte, error){
|
||
|
|
||
|
isValid, err := readProfiles.VerifyProfileHash(profileHash, false, "", false, false)
|
||
|
if (err != nil) { return false, 0, [16]byte{}, err }
|
||
|
if (isValid == false){
|
||
|
profileHashHex := encoding.EncodeBytesToHexString(profileHash[:])
|
||
|
return false, 0, [16]byte{}, errors.New("CheckIfProfileIsHidden called with invalid profile hash: " + profileHashHex)
|
||
|
}
|
||
|
|
||
|
profileHashHex := encoding.EncodeBytesToHexString(profileHash[:])
|
||
|
|
||
|
exists, entryValue, err := myHiddenProfilesMapObject.GetMapEntry(profileHashHex)
|
||
|
if (err != nil) { return false, 0, [16]byte{}, err }
|
||
|
if (exists == false){
|
||
|
return false, 0, [16]byte{}, nil
|
||
|
}
|
||
|
|
||
|
addedTimeString, authorIdentityHashString, delimiterFound := strings.Cut(entryValue, "$")
|
||
|
if (delimiterFound == false){
|
||
|
return false, 0, [16]byte{}, errors.New("myHiddenProfilesMap is malformed: Contains invalid entryValue: " + entryValue)
|
||
|
}
|
||
|
|
||
|
addedTimeInt64, err := helpers.ConvertStringToInt64(addedTimeString)
|
||
|
if (err != nil){
|
||
|
return false, 0, [16]byte{}, errors.New("myHiddenProfilesMap is malformed: Contains invalid addedTime: " + addedTimeString)
|
||
|
}
|
||
|
|
||
|
authorIdentityHash, _, err := identity.ReadIdentityHashString(authorIdentityHashString)
|
||
|
if (err != nil){
|
||
|
return false, 0, [16]byte{}, errors.New("myHiddenProfilesMap is malformed: Contains invalid authorIdentityHash: " + authorIdentityHashString)
|
||
|
}
|
||
|
|
||
|
return true, addedTimeInt64, authorIdentityHash, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
func GetMyHiddenProfilesMap()(map[[28]byte]int64, error){
|
||
|
|
||
|
rawHiddenProfilesMap, err := myHiddenProfilesMapObject.GetMap()
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
hiddenProfilesMap := make(map[[28]byte]int64)
|
||
|
|
||
|
for profileHashString, entryValue := range rawHiddenProfilesMap{
|
||
|
|
||
|
profileHashBytes, err := encoding.DecodeHexStringToBytes(profileHashString)
|
||
|
if (err != nil){
|
||
|
return nil, errors.New("myHiddenProfilesMap is malformed: Contains invalid profileHash: " + profileHashString)
|
||
|
}
|
||
|
|
||
|
if (len(profileHashBytes) != 28){
|
||
|
return nil, errors.New("myHiddenProfilesMap is malformed: Contains invalid length profileHash: " + profileHashString)
|
||
|
}
|
||
|
|
||
|
profileHash := [28]byte(profileHashBytes)
|
||
|
|
||
|
addedTimeString, _, delimiterFound := strings.Cut(entryValue, "$")
|
||
|
if (delimiterFound == false){
|
||
|
return nil, errors.New("myHiddenProfilesMap is malformed: Contains invalid entryValue: " + entryValue)
|
||
|
}
|
||
|
|
||
|
addedTimeInt64, err := helpers.ConvertStringToInt64(addedTimeString)
|
||
|
if (err != nil){
|
||
|
return nil, errors.New("myHiddenProfilesMap is malformed: Contains invalid addedTime: " + addedTimeString)
|
||
|
}
|
||
|
|
||
|
hiddenProfilesMap[profileHash] = addedTimeInt64
|
||
|
}
|
||
|
|
||
|
return hiddenProfilesMap, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
func AddAttributeToMyHiddenAttributesMap(attributeHash [27]byte, authorIdentityHash [16]byte)error{
|
||
|
|
||
|
isValid, err := readProfiles.VerifyAttributeHash(attributeHash, false, "", false, false)
|
||
|
if (err != nil) { return err }
|
||
|
if (isValid == false){
|
||
|
attributeHashHex := encoding.EncodeBytesToHexString(attributeHash[:])
|
||
|
return errors.New("AddAttributeToMyHiddenAttributesMap called with invalid attribute hash: " + attributeHashHex)
|
||
|
}
|
||
|
|
||
|
attributeHashString := encoding.EncodeBytesToHexString(attributeHash[:])
|
||
|
|
||
|
authorIdentityHashString, _, err := identity.EncodeIdentityHashBytesToString(authorIdentityHash)
|
||
|
if (err != nil) {
|
||
|
authorIdentityHashHex := encoding.EncodeBytesToHexString(authorIdentityHash[:])
|
||
|
return errors.New("AddAttributeToMyHiddenAttributesMap called with invalid authorIdentityHash: " + authorIdentityHashHex)
|
||
|
}
|
||
|
|
||
|
addedTime := time.Now().Unix()
|
||
|
addedTimeString := helpers.ConvertInt64ToString(addedTime)
|
||
|
|
||
|
entryValue := addedTimeString + "$" + authorIdentityHashString
|
||
|
|
||
|
err = myHiddenAttributesMapObject.SetMapEntry(attributeHashString, entryValue)
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
|
||
|
func DeleteAttributeFromMyHiddenAttributesMap(attributeHash [27]byte)error{
|
||
|
|
||
|
isValid, err := readProfiles.VerifyAttributeHash(attributeHash, false, "", false, false)
|
||
|
if (err != nil) { return err }
|
||
|
if (isValid == false){
|
||
|
attributeHashHex := encoding.EncodeBytesToHexString(attributeHash[:])
|
||
|
return errors.New("DeleteAttributeFromMyHiddenAttributesMap called with invalid attribute hash: " + attributeHashHex)
|
||
|
}
|
||
|
|
||
|
attributeHashString := encoding.EncodeBytesToHexString(attributeHash[:])
|
||
|
|
||
|
err = myHiddenAttributesMapObject.DeleteMapEntry(attributeHashString)
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: Attribute is hidden
|
||
|
// -int64: Attribute added time
|
||
|
// -[16]byte: Attribute author identity hash
|
||
|
// -error
|
||
|
func CheckIfAttributeIsHidden(attributeHash [27]byte)(bool, int64, [16]byte, error){
|
||
|
|
||
|
isValid, err := readProfiles.VerifyAttributeHash(attributeHash, false, "", false, false)
|
||
|
if (err != nil) { return false, 0, [16]byte{}, err }
|
||
|
if (isValid == false){
|
||
|
attributeHashHex := encoding.EncodeBytesToHexString(attributeHash[:])
|
||
|
return false, 0, [16]byte{}, errors.New("CheckIfAttributeIsHidden called with invalid attribute hash: " + attributeHashHex)
|
||
|
}
|
||
|
|
||
|
attributeHashHex := encoding.EncodeBytesToHexString(attributeHash[:])
|
||
|
|
||
|
exists, entryValue, err := myHiddenAttributesMapObject.GetMapEntry(attributeHashHex)
|
||
|
if (err != nil) { return false, 0, [16]byte{}, err }
|
||
|
if (exists == false){
|
||
|
return false, 0, [16]byte{}, nil
|
||
|
}
|
||
|
|
||
|
addedTimeString, authorIdentityHashString, delimiterFound := strings.Cut(entryValue, "$")
|
||
|
if (delimiterFound == false){
|
||
|
return false, 0, [16]byte{}, errors.New("myHiddenAttributesMap is malformed: Contains invalid entryValue: " + entryValue)
|
||
|
}
|
||
|
|
||
|
addedTimeInt64, err := helpers.ConvertStringToInt64(addedTimeString)
|
||
|
if (err != nil){
|
||
|
return false, 0, [16]byte{}, errors.New("myHiddenAttributesMap is malformed: Contains invalid addedTime: " + addedTimeString)
|
||
|
}
|
||
|
|
||
|
authorIdentityHash, _, err := identity.ReadIdentityHashString(authorIdentityHashString)
|
||
|
if (err != nil){
|
||
|
return false, 0, [16]byte{}, errors.New("myHiddenAttributesMap is malformed: Contains invalid authorIdentityHash: " + authorIdentityHashString)
|
||
|
}
|
||
|
|
||
|
return true, addedTimeInt64, authorIdentityHash, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
func GetMyHiddenAttributesMap()(map[[27]byte]int64, error){
|
||
|
|
||
|
rawHiddenAttributesMap, err := myHiddenAttributesMapObject.GetMap()
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
hiddenAttributesMap := make(map[[27]byte]int64)
|
||
|
|
||
|
for attributeHashString, entryValue := range rawHiddenAttributesMap{
|
||
|
|
||
|
attributeHashBytes, err := encoding.DecodeHexStringToBytes(attributeHashString)
|
||
|
if (err != nil){
|
||
|
return nil, errors.New("myHiddenAttributesMap is malformed: Contains invalid attributeHash: " + attributeHashString)
|
||
|
}
|
||
|
|
||
|
if (len(attributeHashBytes) != 27){
|
||
|
return nil, errors.New("myHiddenAttributesMap is malformed: Contains invalid length attributeHash: " + attributeHashString)
|
||
|
}
|
||
|
|
||
|
attributeHash := [27]byte(attributeHashBytes)
|
||
|
|
||
|
addedTimeString, _, delimiterFound := strings.Cut(entryValue, "$")
|
||
|
if (delimiterFound == false){
|
||
|
return nil, errors.New("myHiddenAttributesMap is malformed: Contains invalid entryValue: " + entryValue)
|
||
|
}
|
||
|
|
||
|
addedTimeInt64, err := helpers.ConvertStringToInt64(addedTimeString)
|
||
|
if (err != nil){
|
||
|
return nil, errors.New("myHiddenAttributesMap is malformed: Contains invalid addedTime: " + addedTimeString)
|
||
|
}
|
||
|
|
||
|
hiddenAttributesMap[attributeHash] = addedTimeInt64
|
||
|
}
|
||
|
|
||
|
return hiddenAttributesMap, nil
|
||
|
}
|
||
|
|
||
|
func AddMessageToMyHiddenMessagesMap(messageHash [26]byte, authorIdentityHash [16]byte)error{
|
||
|
|
||
|
messageHashString := encoding.EncodeBytesToHexString(messageHash[:])
|
||
|
|
||
|
authorIdentityHashString, _, err := identity.EncodeIdentityHashBytesToString(authorIdentityHash)
|
||
|
if (err != nil) {
|
||
|
authorIdentityHashHex := encoding.EncodeBytesToHexString(authorIdentityHash[:])
|
||
|
return errors.New("AddMessageToMyHiddenMessagesMap called with invalid authorIdentityHash: " + authorIdentityHashHex)
|
||
|
}
|
||
|
|
||
|
addedTime := time.Now().Unix()
|
||
|
addedTimeString := helpers.ConvertInt64ToString(addedTime)
|
||
|
|
||
|
entryValue := addedTimeString + "$" + authorIdentityHashString
|
||
|
|
||
|
err = myHiddenMessagesMapObject.SetMapEntry(messageHashString, entryValue)
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
|
||
|
func DeleteMessageFromMyHiddenMessagesMap(messageHash [26]byte)error{
|
||
|
|
||
|
messageHashString := encoding.EncodeBytesToHexString(messageHash[:])
|
||
|
|
||
|
err := myHiddenMessagesMapObject.DeleteMapEntry(messageHashString)
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: Message is hidden
|
||
|
// -int64: Message added time
|
||
|
// -[16]byte: Message author identity hash
|
||
|
// -error
|
||
|
func CheckIfMessageIsHidden(messageHash [26]byte)(bool, int64, [16]byte, error){
|
||
|
|
||
|
messageHashHex := encoding.EncodeBytesToHexString(messageHash[:])
|
||
|
|
||
|
exists, entryValue, err := myHiddenMessagesMapObject.GetMapEntry(messageHashHex)
|
||
|
if (err != nil) { return false, 0, [16]byte{}, err }
|
||
|
if (exists == false){
|
||
|
return false, 0, [16]byte{}, nil
|
||
|
}
|
||
|
|
||
|
addedTimeString, authorIdentityHashString, delimiterFound := strings.Cut(entryValue, "$")
|
||
|
if (delimiterFound == false){
|
||
|
return false, 0, [16]byte{}, errors.New("myHiddenMessagesMap is malformed: Contains invalid entryValue: " + entryValue)
|
||
|
}
|
||
|
|
||
|
addedTimeInt64, err := helpers.ConvertStringToInt64(addedTimeString)
|
||
|
if (err != nil){
|
||
|
return false, 0, [16]byte{}, errors.New("myHiddenMessagesMap is malformed: Contains invalid addedTime: " + addedTimeString)
|
||
|
}
|
||
|
|
||
|
authorIdentityHash, _, err := identity.ReadIdentityHashString(authorIdentityHashString)
|
||
|
if (err != nil){
|
||
|
return false, 0, [16]byte{}, errors.New("myHiddenMessagesMap is malformed: Contains invalid authorIdentityHash: " + authorIdentityHashString)
|
||
|
}
|
||
|
|
||
|
return true, addedTimeInt64, authorIdentityHash, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
func GetMyHiddenMessagesMap()(map[[26]byte]int64, error){
|
||
|
|
||
|
rawHiddenMessagesMap, err := myHiddenMessagesMapObject.GetMap()
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
hiddenMessagesMap := make(map[[26]byte]int64)
|
||
|
|
||
|
for messageHashString, entryValue := range rawHiddenMessagesMap{
|
||
|
|
||
|
messageHashBytes, err := encoding.DecodeHexStringToBytes(messageHashString)
|
||
|
if (err != nil){
|
||
|
return nil, errors.New("myHiddenMessagesMap is malformed: Contains invalid messageHash: " + messageHashString)
|
||
|
}
|
||
|
|
||
|
if (len(messageHashBytes) != 26){
|
||
|
return nil, errors.New("myHiddenMessagesMap is malformed: Contains invalid length messageHash: " + messageHashString)
|
||
|
}
|
||
|
|
||
|
messageHash := [26]byte(messageHashBytes)
|
||
|
|
||
|
addedTimeString, _, delimiterFound := strings.Cut(entryValue, "$")
|
||
|
if (delimiterFound == false){
|
||
|
return nil, errors.New("myHiddenMessagesMap is malformed: Contains invalid entryValue: " + entryValue)
|
||
|
}
|
||
|
|
||
|
addedTimeInt64, err := helpers.ConvertStringToInt64(addedTimeString)
|
||
|
if (err != nil){
|
||
|
return nil, errors.New("myHiddenMessagesMap is malformed: Contains invalid addedTime: " + addedTimeString)
|
||
|
}
|
||
|
|
||
|
hiddenMessagesMap[messageHash] = addedTimeInt64
|
||
|
}
|
||
|
|
||
|
return hiddenMessagesMap, nil
|
||
|
}
|
||
|
|
||
|
|