#pragma once #include "mysql.hpp" #include "chat_session.hxx" #include "chat_session-odb.hxx" #include "mysql_chat_session_member.hpp" namespace bite_im { class ChatSessionTable { public: using ptr = std::shared_ptr; ChatSessionTable(const std::shared_ptr &db):_db(db){} bool insert(ChatSession &cs) { try { odb::transaction trans(_db->begin()); _db->persist(cs); trans.commit(); }catch (std::exception &e) { LOG_ERROR("新增会话失败 {}:{}!", cs.chat_session_name(), e.what()); return false; } return true; } bool remove(const std::string &ssid) { try { odb::transaction trans(_db->begin()); typedef odb::query query; typedef odb::result result; _db->erase_query(query::chat_session_id == ssid); typedef odb::query mquery; _db->erase_query(mquery::session_id == ssid); trans.commit(); }catch (std::exception &e) { LOG_ERROR("删除会话失败 {}:{}!", ssid, e.what()); return false; } return true; } bool remove(const std::string &uid, const std::string &pid) { //单聊会话的删除,-- 根据单聊会话的两个成员 try { odb::transaction trans(_db->begin()); typedef odb::query query; typedef odb::result result; auto res = _db->query_one( query::csm1::user_id == uid && query::csm2::user_id == pid && query::css::chat_session_type == ChatSessionType::SINGLE); std::string cssid = res->chat_session_id; typedef odb::query cquery; _db->erase_query(cquery::chat_session_id == cssid); typedef odb::query mquery; _db->erase_query(mquery::session_id == cssid); trans.commit(); }catch (std::exception &e) { LOG_ERROR("删除会话失败 {}-{}:{}!", uid, pid, e.what()); return false; } return true; } std::shared_ptr select(const std::string &ssid) { std::shared_ptr res; try { odb::transaction trans(_db->begin()); typedef odb::query query; typedef odb::result result; res.reset(_db->query_one(query::chat_session_id == ssid)); trans.commit(); }catch (std::exception &e) { LOG_ERROR("通过会话ID获取会话信息失败 {}:{}!", ssid, e.what()); } return res; } std::vector singleChatSession(const std::string &uid) { std::vector res; try { odb::transaction trans(_db->begin()); typedef odb::query query; typedef odb::result result; //当前的uid是被申请者的用户ID result r(_db->query( query::css::chat_session_type == ChatSessionType::SINGLE && query::csm1::user_id == uid && query::csm2::user_id != query::csm1::user_id)); for (result::iterator i(r.begin()); i != r.end(); ++i) { res.push_back(*i); } trans.commit(); }catch (std::exception &e) { LOG_ERROR("获取用户 {} 的单聊会话失败:{}!", uid, e.what()); } return res; } std::vector groupChatSession(const std::string &uid) { std::vector res; try { odb::transaction trans(_db->begin()); typedef odb::query query; typedef odb::result result; //当前的uid是被申请者的用户ID result r(_db->query( query::css::chat_session_type == ChatSessionType::GROUP && query::csm::user_id == uid )); for (result::iterator i(r.begin()); i != r.end(); ++i) { res.push_back(*i); } trans.commit(); }catch (std::exception &e) { LOG_ERROR("获取用户 {} 的群聊会话失败:{}!", uid, e.what()); } return res; } private: std::shared_ptr _db; }; }