IM/MS/works/db/UserFriendsDB.cpp
dongl c1e7ae4662 已解决
可以添加好友
获取验证码delete bug
注册

待完成
配合client 实现添加好友后, client gui 好友列表立马回显,
2023-06-18 18:39:54 +08:00

199 lines
5.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by dongl on 23-5-4.
//
#include "linkDB.h"
#include "UserFriendsDB.h"
// 查询好友添加权限类型
char UserFriendsDB::select_add_type(uint64_t account) {
conn = LinkDB::safe_grab();
auto query = conn->query("select restrictions from im_user_friends where account=%1:account");
query.template_defaults[1] = account;
query.parse();
printf("%s\n", query.str().c_str());
// 查看添加授权类型 0 直接添加 1 验证问题 2 账户审核
auto ret = query.store()[0][0][0]; // 因为 account 唯一 所以结果 至多一个
// 放回链接
LinkDB::release(conn);
return ret;
}
// 搜索好友 搜索用户
std::optional<PoUser> UserFriendsDB::select_user(uint64_t account) {
conn = LinkDB::safe_grab();
auto query = conn->query("select * from im_user where account=%1:account");
query.template_defaults[1] = account;
query.parse();
PoUser user;
auto ret = query.store();
for (const auto &row : ret) {
user.account = strtol(row[0].c_str(), nullptr, 0);
user.phone = strtol(row[1].c_str(), nullptr, 0);
user.email = row[2].c_str();
user.username = row[3].c_str();
user.password = row[4].c_str();
user.password_salt = row[5].c_str();
user.client_info = row[6].c_str();
}
// 放回链接
LinkDB::release(conn);
if (ret.num_rows() < 1) {
return std::nullopt;
}
return user;
}
/**
* 查询 friend_key 是否 在 account内
* @param account
* @param friend_key
* @return
*/
bool UserFriendsDB::select_friend(uint64_t account, uint64_t friend_key) {
conn = LinkDB::safe_grab();
auto query = conn->query("select json_extract(friends, '$.\"%2:friend_key\"') from im_user_friends where account=%1:account");
query.template_defaults[1] = account;
query.template_defaults[2] = friend_key;
query.parse();
auto ret = query.store();
// 放回链接
LinkDB::release(conn);
if (ret[0][0] == "NULL") {
return false;
}
return true;
}
// 修改好友列表数据 添加好友
/// friends {
/// uid info { }
/// }
std::tuple<bool, std::string> UserFriendsDB::add_friends(uint64_t account, uint64_t friends) {
conn = LinkDB::safe_grab();
auto q = conn->query("select username from im_user where account=%1:account");
q.template_defaults[1] = friends;
q.parse();
auto username = q.store();
if (username.num_rows() < 1) {
LinkDB::release(conn);
return {false, "未查询到账户"};
}
std::string name = username[0][0].c_str();
auto query = conn->query("update im_user_friends set friends ="
"JSON_SET(friends, '$.\"%2:friends\"', "
"JSON_OBJECT('username', '%3:username', 'belong_grouping', 1, 'add_time', 10000, 'add_source', 1)"
")"
"where account=%1:account");
query.template_defaults[1] = account;
query.template_defaults[2] = friends;
query.template_defaults[3] = name.c_str();
query.parse();
auto ret = query.exec();
// 放回链接
LinkDB::release(conn);
return {ret, "暂无错误"};
}
void UserFriendsDB::insert_friends_to_be_added(uint64_t account, uint64_t friends) {
conn = LinkDB::safe_grab();
// 放回链接
LinkDB::release(conn);
}
std::optional<std::string> UserFriendsDB::select_friends_all(uint64_t account) {
conn = LinkDB::safe_grab();
auto q = conn->query("select friends from im_user_friends where account=%0:account");
q.parse();
auto ret = q.store(account);
if (ret.num_rows() < 1) {
return std::nullopt;
}
std::string friends;
ret[0][0].to_string(friends);
// for (auto mem = document.MemberBegin(); mem != document.MemberEnd(); ++mem) {
// mem->name;
// }
// 放回链接
LinkDB::release(conn);
return friends;
}
std::optional<rapidjson::Document> UserFriendsDB::select_friends_all_json(uint64_t account) {
auto temp = select_friends_all(account);
rapidjson::Document document;
if (temp.has_value()) {
document.Parse(temp.value().c_str());
return document;
} else {
return std::nullopt;
}
}
std::optional<rapidjson::Document>
UserFriendsDB::select_friends_info(uint64_t account, uint64_t friends) {
conn = LinkDB::safe_grab();
auto q = conn->query("select JSON_EXTRACT(friends, '$.\"%2:friends\"') as friend_info "
"from im_user_friends where account=%1:account");
q.template_defaults[1] = account;
q.template_defaults[2] = friends;
q.parse();
// 查库
auto ret = q.store();
printf("%zu\n", ret.num_rows());
if (ret.num_rows() < 1) {
return std::nullopt;
}
// 取json字符串
std::string friend_info;
ret[0][0].to_string(friend_info);
// 解析json
rapidjson::Document document;
document.Parse(friend_info.c_str());
// 放回链接
LinkDB::release(conn);
return document;
}