diff --git a/swad_account.c b/swad_account.c index 9625e4e24..bfae3673e 100644 --- a/swad_account.c +++ b/swad_account.c @@ -53,6 +53,7 @@ #include "swad_mail_database.h" #include "swad_match.h" #include "swad_message.h" +#include "swad_message_database.h" #include "swad_network.h" #include "swad_nickname.h" #include "swad_notification.h" @@ -1028,7 +1029,7 @@ void Acc_CompletelyEliminateAccount (struct UsrData *UsrDat, Ntf_DB_RemoveUsrNtfs (UsrDat->UsrCod); /***** Delete user's messages sent and received *****/ - Msg_DelAllRecAndSntMsgsUsr (UsrDat->UsrCod); + Msg_DB_RemoveAllRecAndSntMsgsUsr (UsrDat->UsrCod); if (QuietOrVerbose == Cns_VERBOSE) Ale_ShowAlert (Ale_SUCCESS,Txt_Messages_of_THE_USER_X_have_been_deleted, UsrDat->FullName); diff --git a/swad_changelog.h b/swad_changelog.h index f7f740eed..c2f98d2f4 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -602,13 +602,15 @@ TODO: FIX BUG, URGENT! En las fechas como par TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo. */ -#define Log_PLATFORM_VERSION "SWAD 21.17 (2021-09-27)" +#define Log_PLATFORM_VERSION "SWAD 21.17.2 (2021-09-27)" #define CSS_FILE "swad20.45.css" #define JS_FILE "swad20.69.1.js" /* TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams + Version 21.17.2: Sep 27, 2021 Queries moved to module swad_message_database. (317358 lines) + Version 21.17.1: Sep 27, 2021 Queries moved to module swad_message_database. (317325 lines) Version 21.17: Sep 27, 2021 New module swad_message_database for database queries related to messages. (317295 lines) Version 21.16.6: Sep 27, 2021 Queries moved to module swad_match_database. (317186 lines) Version 21.16.5: Sep 26, 2021 Queries moved to module swad_match_database. (317134 lines) diff --git a/swad_enrolment.c b/swad_enrolment.c index 6933a3d55..392f919b4 100644 --- a/swad_enrolment.c +++ b/swad_enrolment.c @@ -52,6 +52,7 @@ #include "swad_mail_database.h" #include "swad_match.h" #include "swad_message.h" +#include "swad_message_database.h" #include "swad_notification.h" #include "swad_parameter.h" #include "swad_photo.h" diff --git a/swad_figure.c b/swad_figure.c index e4772ab57..3ed1fc9bd 100644 --- a/swad_figure.c +++ b/swad_figure.c @@ -54,6 +54,7 @@ #include "swad_institution_database.h" #include "swad_logo.h" #include "swad_message.h" +#include "swad_message_database.h" #include "swad_network.h" #include "swad_notice.h" #include "swad_privacy.h" diff --git a/swad_indicator.c b/swad_indicator.c index 9268c6eb4..771f11139 100644 --- a/swad_indicator.c +++ b/swad_indicator.c @@ -43,6 +43,7 @@ #include "swad_indicator.h" #include "swad_indicator_database.h" #include "swad_message.h" +#include "swad_message_database.h" #include "swad_parameter.h" #include "swad_theme.h" diff --git a/swad_message.c b/swad_message.c index 2448e7ee4..4eabe4903 100644 --- a/swad_message.c +++ b/swad_message.c @@ -137,13 +137,9 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content, static unsigned long Msg_RemoveSomeRecOrSntMsgsUsr (const struct Msg_Messages *Messages, long UsrCod, const char *FilterFromToSubquery); -static void Msg_DB_CreateRcvMsg (long MsgCod,long UsrCod,bool NotifyByEmail); -static void Msg_DB_SetRcvMsgAsReplied (long MsgCod); static void Msg_MoveRcvMsgToDeleted (long MsgCod,long UsrCod); static void Msg_MoveSntMsgToDeleted (long MsgCod); static void Msg_MoveMsgContentToDeleted (long MsgCod); -static bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod); -static bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod); static unsigned Msg_GetNumUnreadMsgs (const struct Msg_Messages *Messages, const char *FilterFromToSubquery); @@ -1260,22 +1256,6 @@ void Msg_ConRecMsg (void) Msg_ShowRecMsgs (); } -/*****************************************************************************/ -/********************** Mark a received message as open **********************/ -/*****************************************************************************/ - -void Msg_DB_SetReceivedMsgAsOpen (long MsgCod,long UsrCod) - { - /***** Mark message as read by user *****/ - DB_QueryUPDATE ("can not mark a received message as open", - "UPDATE msg_rcv" - " SET Open='Y'" - " WHERE MsgCod=%ld" - " AND UsrCod=%ld", - MsgCod, - UsrCod); - } - /*****************************************************************************/ /********************** Insert a message in the database *********************/ /*****************************************************************************/ @@ -1290,25 +1270,10 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content, Med_RemoveKeepOrStoreMedia (-1L,Media); /***** Insert message subject and content in the database *****/ - MsgCod = - DB_QueryINSERTandReturnCode ("can not create message", - "INSERT INTO msg_content" - " (Subject,Content,MedCod)" - " VALUES" - " ('%s','%s',%ld)", - Subject, - Content, - Media->MedCod); + MsgCod = Msg_DB_CreateNewMsg (Subject,Content,Media->MedCod); /***** Insert message in sent messages *****/ - DB_QueryINSERT ("can not create message", - "INSERT INTO msg_snt" - " (MsgCod,CrsCod,UsrCod,Expanded,CreatTime)" - " VALUES" - " (%ld,%ld,%ld,'N',NOW())", - MsgCod, - Gbl.Hierarchy.Crs.CrsCod, - Gbl.Usrs.Me.UsrDat.UsrCod); + Msg_DB_CreateSntMsg (MsgCod); /***** Increment number of messages sent by me *****/ Prf_DB_IncrementNumMsgSntUsr (Gbl.Usrs.Me.UsrDat.UsrCod); @@ -1360,86 +1325,6 @@ static unsigned long Msg_RemoveSomeRecOrSntMsgsUsr (const struct Msg_Messages *M return NumMsgs; } -/*****************************************************************************/ -/*************** Delete all received or sent messages of a user **************/ -/*****************************************************************************/ - -void Msg_DelAllRecAndSntMsgsUsr (long UsrCod) - { - /***** Move messages from msg_rcv to msg_rcv_deleted *****/ - /* Insert messages into msg_rcv_deleted */ - DB_QueryINSERT ("can not remove received messages", - "INSERT IGNORE INTO msg_rcv_deleted" - " (MsgCod,UsrCod,Notified,Open,Replied)" - " SELECT MsgCod," - "UsrCod," - "Notified," - "Open," - "Replied" - " FROM msg_rcv" - " WHERE UsrCod=%ld", - UsrCod); - - /* Delete messages from msg_rcv *****/ - DB_QueryDELETE ("can not remove received messages", - "DELETE FROM msg_rcv" - " WHERE UsrCod=%ld", - UsrCod); - - /***** Move message from msg_snt to msg_snt_deleted *****/ - /* Insert message into msg_snt_deleted */ - DB_QueryINSERT ("can not remove sent messages", - "INSERT IGNORE INTO msg_snt_deleted" - " (MsgCod,CrsCod,UsrCod,CreatTime)" - " SELECT MsgCod," - "CrsCod," - "UsrCod," - "CreatTime" - " FROM msg_snt" - " WHERE UsrCod=%ld", - UsrCod); - - /* Delete message from msg_snt *****/ - DB_QueryDELETE ("can not remove sent messages", - "DELETE FROM msg_snt" - " WHERE UsrCod=%ld", - UsrCod); - } - -/*****************************************************************************/ -/**** Insert a message y su destinatario in the table of messages received ***/ -/*****************************************************************************/ - -static void Msg_DB_CreateRcvMsg (long MsgCod,long UsrCod,bool NotifyByEmail) - { - /***** Insert message received in the database *****/ - DB_QueryINSERT ("can not create received message", - "INSERT INTO msg_rcv" - " (MsgCod,UsrCod,Notified,Open,Replied,Expanded)" - " VALUES" - " (%ld,%ld,'%c','N','N','N')", - MsgCod, - UsrCod, - NotifyByEmail ? 'Y' : - 'N'); - } - -/*****************************************************************************/ -/******** Update received message by setting Replied field to true ***********/ -/*****************************************************************************/ - -static void Msg_DB_SetRcvMsgAsReplied (long MsgCod) - { - /***** Update received message by setting Replied field to true *****/ - DB_QueryUPDATE ("can not update a received message", - "UPDATE msg_rcv" - " SET Replied='Y'" - " WHERE MsgCod=%ld" - " AND UsrCod=%ld", - MsgCod, - Gbl.Usrs.Me.UsrDat.UsrCod); - } - /*****************************************************************************/ /************ Delete a message from the received message table ***************/ /*****************************************************************************/ @@ -1448,27 +1333,10 @@ static void Msg_MoveRcvMsgToDeleted (long MsgCod,long UsrCod) { /***** Move message from msg_rcv to msg_rcv_deleted *****/ /* Insert message into msg_rcv_deleted */ - DB_QueryINSERT ("can not remove a received message", - "INSERT IGNORE INTO msg_rcv_deleted" - " (MsgCod,UsrCod,Notified,Open,Replied)" - " SELECT MsgCod," - "UsrCod," - "Notified," - "Open," - "Replied" - " FROM msg_rcv" - " WHERE MsgCod=%ld" - " AND UsrCod=%ld", - MsgCod, - UsrCod); + Msg_DB_MoveRcvMsgToDeleted (MsgCod,UsrCod); /* Delete message from msg_rcv *****/ - DB_QueryDELETE ("can not remove a received message", - "DELETE FROM msg_rcv" - " WHERE MsgCod=%ld" - " AND UsrCod=%ld", - MsgCod, - UsrCod); + Msg_DB_RemoveRcvMsg (MsgCod,UsrCod); /***** If message content is not longer necessary, move it to msg_content_deleted *****/ if (Msg_DB_CheckIfSntMsgIsDeleted (MsgCod)) @@ -1487,22 +1355,10 @@ static void Msg_MoveSntMsgToDeleted (long MsgCod) { /***** Move message from msg_snt to msg_snt_deleted *****/ /* Insert message into msg_snt_deleted */ - DB_QueryINSERT ("can not remove a sent message", - "INSERT IGNORE INTO msg_snt_deleted" - " (MsgCod,CrsCod,UsrCod,CreatTime)" - " SELECT MsgCod," - "CrsCod," - "UsrCod," - "CreatTime" - " FROM msg_snt" - " WHERE MsgCod=%ld", - MsgCod); + Msg_DB_MoveSntMsgToDeleted (MsgCod); /* Delete message from msg_snt *****/ - DB_QueryDELETE ("can not remove a sent message", - "DELETE FROM msg_snt" - " WHERE MsgCod=%ld", - MsgCod); + Msg_DB_RemoveSntMsg (MsgCod); /***** If message content is not longer necessary, move it to msg_content_deleted *****/ if (Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (MsgCod)) @@ -1538,75 +1394,6 @@ static void Msg_MoveMsgContentToDeleted (long MsgCod) MsgCod); } -/*****************************************************************************/ -/***** Delete the subject and content of all completely deleted messages *****/ -/*****************************************************************************/ - -void Msg_DB_MoveUnusedMsgsContentToDeleted (void) - { - /***** Move messages from msg_content to msg_content_deleted *****/ - /* Insert message content into msg_content_deleted */ - DB_QueryINSERT ("can not remove the content of some messages", - "INSERT IGNORE INTO msg_content_deleted" - " (MsgCod,Subject,Content)" - " SELECT MsgCod," - "Subject," - "Content" - " FROM msg_content" - " WHERE MsgCod NOT IN" - " (SELECT MsgCod" - " FROM msg_snt)" - " AND MsgCod NOT IN" - " (SELECT DISTINCT MsgCod" - " FROM msg_rcv)"); - - /* Messages in msg_content_deleted older than a certain time - should be deleted to ensure the protection of personal data */ - - /* Delete message from msg_content *****/ - DB_QueryDELETE ("can not remove the content of some messages", - "DELETE FROM msg_content" - " WHERE MsgCod NOT IN" - " (SELECT MsgCod" - " FROM msg_snt)" - " AND MsgCod NOT IN" - " (SELECT DISTINCT MsgCod" - " FROM msg_rcv)"); - } - -/*****************************************************************************/ -/******************** Check if a sent message is deleted *********************/ -/*****************************************************************************/ - -static bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod) - { - /***** Get if the message code is in table of sent messages not deleted *****/ - return (DB_QueryCOUNT ("can not check if a sent message is deleted", - "SELECT COUNT(*)" - " FROM msg_snt" - " WHERE MsgCod=%ld", - MsgCod) == 0); // The message has been deleted - // by its author when it is not present - // in table of sent messages undeleted - } - -/*****************************************************************************/ -/***** Check if a received message has been deleted by all its recipients ****/ -/*****************************************************************************/ - -static bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod) - { - /***** Get if the message code is in table of received messages not deleted *****/ - return (DB_QueryCOUNT ("can not check if a received message" - " is deleted by all recipients", - "SELECT COUNT(*)" - " FROM msg_rcv" - " WHERE MsgCod=%ld", - MsgCod) == 0); // The message has been deleted - // by all its recipients when it is not present - // in table of received messages undeleted - } - /*****************************************************************************/ /******** Get number of received messages that haven't been read by me *******/ /*****************************************************************************/ @@ -1932,401 +1719,6 @@ static void Msg_PutLinkToViewBannedUsers(void) Txt_Banned_users); } -/*****************************************************************************/ -/**** Get the number of unique messages sent by any teacher from a course ****/ -/*****************************************************************************/ - -unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod) - { - return (unsigned) - DB_QueryCOUNT ("can not get the number of messages sent by teachers", - "SELECT COUNT(*)" - " FROM msg_snt," - "crs_users" - " WHERE msg_snt.CrsCod=%ld" - " AND crs_users.CrsCod=%ld" - " AND crs_users.Role IN (%u,%u)" - " AND msg_snt.UsrCod=crs_users.UsrCod", - CrsCod, - CrsCod, - (unsigned) Rol_NET, // Non-editing teacher - (unsigned) Rol_TCH); // Teacher - } - -/*****************************************************************************/ -/************** Get the number of unique messages sent by a user *************/ -/*****************************************************************************/ - -unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod) - { - return (unsigned) - DB_QueryCOUNT ("can not get the number of messages sent by a user", - "SELECT" - " (SELECT COUNT(*)" - " FROM msg_snt" - " WHERE UsrCod=%ld)" - " +" - " (SELECT COUNT(*)" - " FROM msg_snt_deleted" - " WHERE UsrCod=%ld)", - UsrCod, - UsrCod); - } - -/*****************************************************************************/ -/******** Get the number of unique messages sent from this location **********/ -/******** (all the platform, current degree or current course) **********/ -/*****************************************************************************/ - -unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) - { - const char *Table = "msg_snt"; - - /***** Get the number of messages sent from this location - (all the platform, current degree or current course) from database *****/ - switch (MsgStatus) - { - case Msg_STATUS_ALL: - case Msg_STATUS_NOTIFIED: - Table = "msg_snt"; - break; - case Msg_STATUS_DELETED: - Table = "msg_snt_deleted"; - break; - } - switch (Scope) - { - case HieLvl_SYS: - return (unsigned) DB_GetNumRowsTable (Table); - case HieLvl_CTY: - return (unsigned) - DB_QueryCOUNT ("can not get number of sent messages", - "SELECT COUNT(*)" - " FROM ins_instits," - "ctr_centers," - "deg_degrees," - "crs_courses," - "%s" - " WHERE ins_instits.CtyCod=%ld" - " AND ins_instits.InsCod=ctr_centers.InsCod" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=%s.CrsCod", - Table, - Gbl.Hierarchy.Cty.CtyCod, - Table); - case HieLvl_INS: - return (unsigned) - DB_QueryCOUNT ("can not get number of sent messages", - "SELECT COUNT(*)" - " FROM ctr_centers," - "deg_degrees," - "crs_courses," - "%s" - " WHERE ctr_centers.InsCod=%ld" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=%s.CrsCod", - Table, - Gbl.Hierarchy.Ins.InsCod, - Table); - case HieLvl_CTR: - return (unsigned) - DB_QueryCOUNT ("can not get number of sent messages", - "SELECT COUNT(*)" - " FROM deg_degrees," - "crs_courses," - "%s" - " WHERE deg_degrees.CtrCod=%ld" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=%s.CrsCod", - Table, - Gbl.Hierarchy.Ctr.CtrCod, - Table); - case HieLvl_DEG: - return (unsigned) - DB_QueryCOUNT ("can not get number of sent messages", - "SELECT COUNT(*)" - " FROM crs_courses," - "%s" - " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.CrsCod=%s.CrsCod", - Table, - Gbl.Hierarchy.Deg.DegCod, - Table); - case HieLvl_CRS: - return (unsigned) - DB_QueryCOUNT ("can not get number of sent messages", - "SELECT COUNT(*)" - " FROM %s" - " WHERE CrsCod=%ld", - Table, - Gbl.Hierarchy.Crs.CrsCod); - default: - return 0; - } - } - -/*****************************************************************************/ -/****** Get the number of unique messages received from this location ********/ -/****** (all the platform, current degree or current course) ********/ -/*****************************************************************************/ - -unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) - { - char *Table; - - /***** Get the number of unique messages sent from this location - (all the platform, current degree or current course) from database *****/ - switch (MsgStatus) - { - case Msg_STATUS_ALL: - case Msg_STATUS_DELETED: - Table = (MsgStatus == Msg_STATUS_ALL) ? "msg_rcv" : - "msg_rcv_deleted"; - switch (Scope) - { - case HieLvl_SYS: - return (unsigned) DB_GetNumRowsTable (Table); - case HieLvl_CTY: - return (unsigned) - DB_QueryCOUNT ("can not get number of received messages", - "SELECT COUNT(*)" - " FROM ins_instits," - "ctr_centers," - "deg_degrees," - "crs_courses," - "%s," - "msg_snt" - " WHERE ins_instits.CtyCod=%ld" - " AND ins_instits.InsCod=ctr_centers.InsCod" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=%s.MsgCod", - Table, - Gbl.Hierarchy.Cty.CtyCod, - Table); - case HieLvl_INS: - return (unsigned) - DB_QueryCOUNT ("can not get number of received messages", - "SELECT COUNT(*)" - " FROM ctr_centers," - "deg_degrees," - "crs_courses," - "%s," - "msg_snt" - " WHERE ctr_centers.InsCod=%ld" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=%s.MsgCod", - Table, - Gbl.Hierarchy.Ins.InsCod, - Table); - case HieLvl_CTR: - return (unsigned) - DB_QueryCOUNT ("can not get number of received messages", - "SELECT COUNT(*)" - " FROM deg_degrees," - "crs_courses," - "%s," - "msg_snt" - " WHERE deg_degrees.CtrCod=%ld" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=%s.MsgCod", - Table, - Gbl.Hierarchy.Ctr.CtrCod, - Table); - case HieLvl_DEG: - return (unsigned) - DB_QueryCOUNT ("can not get number of received messages", - "SELECT COUNT(*)" - " FROM crs_courses," - "%s," - "msg_snt" - " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=%s.MsgCod", - Table, - Gbl.Hierarchy.Deg.DegCod, - Table); - case HieLvl_CRS: - return (unsigned) - DB_QueryCOUNT ("can not get number of received messages", - "SELECT COUNT(*)" - " FROM msg_snt," - "%s" - " WHERE msg_snt.CrsCod=%ld" - " AND msg_snt.MsgCod=%s.MsgCod", - Table, - Gbl.Hierarchy.Crs.CrsCod, - Table); - case HieLvl_UNK: - default: - return 0; - } - return 0; - case Msg_STATUS_NOTIFIED: - switch (Scope) - { - case HieLvl_SYS: - return (unsigned) - DB_QueryCOUNT ("can not get number of received messages", - "SELECT " - "(SELECT COUNT(*)" - " FROM msg_rcv" - " WHERE Notified='Y')" - " + " - "(SELECT COUNT(*)" - " FROM msg_rcv_deleted" - " WHERE Notified='Y')"); - case HieLvl_CTY: - return (unsigned) - DB_QueryCOUNT ("can not get number of received messages", - "SELECT " - "(SELECT COUNT(*)" - " FROM ins_instits," - "ctr_centers," - "deg_degrees," - "crs_courses," - "msg_snt," - "msg_rcv" - " WHERE ins_instits.CtyCod=%ld" - " AND ins_instits.InsCod=ctr_centers.InsCod" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=msg_rcv.MsgCod" - " AND msg_rcv.Notified='Y')" - " + " - "(SELECT COUNT(*)" - " FROM ins_instits," - "ctr_centers," - "deg_degrees," - "crs_courses," - "msg_snt," - "msg_rcv_deleted" - " WHERE ins_instits.CtyCod=%ld" - " AND ins_instits.InsCod=ctr_centers.InsCod" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod" - " AND msg_rcv_deleted.Notified='Y')", - Gbl.Hierarchy.Cty.CtyCod, - Gbl.Hierarchy.Cty.CtyCod); - case HieLvl_INS: - return (unsigned) - DB_QueryCOUNT ("can not get number of received messages", - "SELECT " - "(SELECT COUNT(*)" - " FROM ctr_centers," - "deg_degrees," - "crs_courses," - "msg_snt," - "msg_rcv" - " WHERE ctr_centers.InsCod=%ld" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=msg_rcv.MsgCod" - " AND msg_rcv.Notified='Y')" - " + " - "(SELECT COUNT(*)" - " FROM ctr_centers," - "deg_degrees," - "crs_courses," - "msg_snt," - "msg_rcv_deleted" - " WHERE ctr_centers.InsCod=%ld" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod" - " AND msg_rcv_deleted.Notified='Y')", - Gbl.Hierarchy.Ins.InsCod, - Gbl.Hierarchy.Ins.InsCod); - case HieLvl_CTR: - return (unsigned) - DB_QueryCOUNT ("can not get number of received messages", - "SELECT " - "(SELECT COUNT(*)" - " FROM deg_degrees," - "crs_courses," - "msg_snt," - "msg_rcv" - " WHERE deg_degrees.CtrCod=%ld" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=msg_rcv.MsgCod" - " AND msg_rcv.Notified='Y')" - " + " - "(SELECT COUNT(*)" - " FROM deg_degrees," - "crs_courses," - "msg_snt," - "msg_rcv_deleted" - " WHERE deg_degrees.CtrCod=%ld" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod" - " AND msg_rcv_deleted.Notified='Y')", - Gbl.Hierarchy.Ctr.CtrCod, - Gbl.Hierarchy.Ctr.CtrCod); - case HieLvl_DEG: - return (unsigned) - DB_QueryCOUNT ("can not get number of received messages", - "SELECT " - "(SELECT COUNT(*)" - " FROM crs_courses," - "msg_snt," - "msg_rcv" - " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=msg_rcv.MsgCod" - " AND msg_rcv.Notified='Y')" - " + " - "(SELECT COUNT(*)" - " FROM crs_courses," - "msg_snt," - "msg_rcv_deleted" - " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.CrsCod=msg_snt.CrsCod" - " AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod" - " AND msg_rcv_deleted.Notified='Y')", - Gbl.Hierarchy.Deg.DegCod, - Gbl.Hierarchy.Deg.DegCod); - case HieLvl_CRS: - return (unsigned) - DB_QueryCOUNT ("can not get number of received messages", - "SELECT " - "(SELECT COUNT(*)" - " FROM msg_snt," - "msg_rcv" - " WHERE msg_snt.CrsCod=%ld" - " AND msg_snt.MsgCod=msg_rcv.MsgCod" - " AND msg_rcv.Notified='Y')" - " + " - "(SELECT COUNT(*)" - " FROM msg_snt," - "msg_rcv_deleted" - " WHERE msg_snt.CrsCod=%ld" - " AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod" - " AND msg_rcv_deleted.Notified='Y')", - Gbl.Hierarchy.Crs.CrsCod, - Gbl.Hierarchy.Crs.CrsCod); - case HieLvl_UNK: - default: - return 0; - } - return 0; - default: - return 0; - } - } - /*****************************************************************************/ /***** Set string with number of messages and number of unread messages ******/ /*****************************************************************************/ @@ -3688,34 +3080,6 @@ static void Msg_UnbanSender (void) Gbl.Usrs.Other.UsrDat.FullName); } -/*****************************************************************************/ -/**************** Chech if a user is banned by another user ******************/ -/*****************************************************************************/ - -bool Msg_DB_CheckIfUsrIsBanned (long FromUsrCod,long ToUsrCod) - { - /***** Get if FromUsrCod is banned by ToUsrCod *****/ - return (DB_QueryCOUNT ("can not check if a user is banned", - "SELECT COUNT(*)" - " FROM msg_banned" - " WHERE FromUsrCod=%ld" - " AND ToUsrCod=%ld", - FromUsrCod,ToUsrCod) != 0); - } - -/*****************************************************************************/ -/************************ Remove user from banned table **********************/ -/*****************************************************************************/ - -void Msg_DB_RemoveUsrFromBanned (long UsrCod) - { - DB_QueryDELETE ("can not remove user from table of banned users", - "DELETE FROM msg_banned" - " WHERE FromUsrCod=%ld" - " OR ToUsrCod=%ld", - UsrCod,UsrCod); - } - /*****************************************************************************/ /*********** List banned users, who can not sent messages to me **************/ /*****************************************************************************/ @@ -3730,22 +3094,8 @@ void Msg_ListBannedUsrs (void) unsigned NumUsrs; struct UsrData UsrDat; - /***** Get my banned users *****/ - NumUsrs = (unsigned) - DB_QuerySELECT (&mysql_res,"can not get banned users", - "SELECT msg_banned.FromUsrCod" - " FROM msg_banned," - "usr_data" - " WHERE msg_banned.ToUsrCod=%ld" - " AND msg_banned.FromUsrCod=usr_data.UsrCod" - " ORDER BY usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName", - Gbl.Usrs.Me.UsrDat.UsrCod); - - if (NumUsrs == 0) // If not result ==> sent message is deleted - Ale_ShowAlert (Ale_INFO,Txt_You_have_not_banned_any_sender); - else + /***** Get users banned by me *****/ + if ((NumUsrs = Msg_DB_GetUsrsBannedByMe (&mysql_res))) { /***** Initialize structure with user's data *****/ Usr_UsrDataConstructor (&UsrDat); @@ -3755,42 +3105,42 @@ void Msg_ListBannedUsrs (void) NULL,NULL, NULL,Box_NOT_CLOSABLE,2); - /***** List users *****/ - for (NumUsr = 1; - NumUsr <= NumUsrs; - NumUsr++) - { - /* Get user's code */ - UsrDat.UsrCod = DB_GetNextCode (mysql_res); + /***** List users *****/ + for (NumUsr = 1; + NumUsr <= NumUsrs; + NumUsr++) + { + /* Get user's code */ + UsrDat.UsrCod = DB_GetNextCode (mysql_res); - /* Get user's data from database */ - if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, - Usr_DONT_GET_PREFS, - Usr_DONT_GET_ROLE_IN_CURRENT_CRS)) - { - HTM_TR_Begin (NULL); + /* Get user's data from database */ + if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, + Usr_DONT_GET_PREFS, + Usr_DONT_GET_ROLE_IN_CURRENT_CRS)) + { + HTM_TR_Begin (NULL); - /* Put form to unban user */ - HTM_TD_Begin ("class=\"BM\""); - Frm_BeginForm (ActUnbUsrLst); - Usr_PutParamUsrCodEncrypted (UsrDat.EnUsrCod); - Ico_PutIconLink ("lock.svg",Txt_Sender_banned_click_to_unban_him); - Frm_EndForm (); - HTM_TD_End (); + /* Put form to unban user */ + HTM_TD_Begin ("class=\"BM\""); + Frm_BeginForm (ActUnbUsrLst); + Usr_PutParamUsrCodEncrypted (UsrDat.EnUsrCod); + Ico_PutIconLink ("lock.svg",Txt_Sender_banned_click_to_unban_him); + Frm_EndForm (); + HTM_TD_End (); - /* Show photo */ - HTM_TD_Begin ("class=\"LM\" style=\"width:30px;\""); - Pho_ShowUsrPhotoIfAllowed (&UsrDat,"PHOTO21x28",Pho_ZOOM,false); - HTM_TD_End (); + /* Show photo */ + HTM_TD_Begin ("class=\"LM\" style=\"width:30px;\""); + Pho_ShowUsrPhotoIfAllowed (&UsrDat,"PHOTO21x28",Pho_ZOOM,false); + HTM_TD_End (); - /* Write user's full name */ - HTM_TD_Begin ("class=\"DAT LM\""); - HTM_Txt (UsrDat.FullName); - HTM_TD_End (); + /* Write user's full name */ + HTM_TD_Begin ("class=\"DAT LM\""); + HTM_Txt (UsrDat.FullName); + HTM_TD_End (); - HTM_TR_End (); - } - } + HTM_TR_End (); + } + } /***** End table and box *****/ Box_BoxTableEnd (); @@ -3798,6 +3148,8 @@ void Msg_ListBannedUsrs (void) /***** Free memory used for user's data *****/ Usr_UsrDataDestructor (&UsrDat); } + else // If not result ==> sent message is deleted + Ale_ShowAlert (Ale_INFO,Txt_You_have_not_banned_any_sender); /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); diff --git a/swad_message.h b/swad_message.h index 4ae5c29ef..84568236c 100644 --- a/swad_message.h +++ b/swad_message.h @@ -101,19 +101,10 @@ void Msg_ExpSntMsg (void); void Msg_ExpRecMsg (void); void Msg_ConSntMsg (void); void Msg_ConRecMsg (void); -void Msg_DB_SetReceivedMsgAsOpen (long MsgCod,long UsrCod); - -void Msg_DelAllRecAndSntMsgsUsr (long UsrCod); -void Msg_DB_MoveUnusedMsgsContentToDeleted (void); void Msg_ShowSntMsgs (void); void Msg_ShowRecMsgs (void); -unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod); -unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod); -unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus); -unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus); - void Msg_PutHiddenParamsMsgsFilters (void *Messages); void Msg_GetNotifMessage (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], char **ContentStr,long MsgCod,bool GetContent); @@ -128,8 +119,6 @@ void Msg_PutHiddenParamMsgCod (long MsgCod); void Msg_BanSenderWhenShowingMsgs (void); void Msg_UnbanSenderWhenShowingMsgs (void); void Msg_UnbanSenderWhenListingUsrs (void); -bool Msg_DB_CheckIfUsrIsBanned (long FromUsrCod,long ToUsrCod); -void Msg_DB_RemoveUsrFromBanned (long UsrCod); void Msg_ListBannedUsrs (void); #endif diff --git a/swad_message_database.c b/swad_message_database.c index 17f89875d..78b40cb79 100644 --- a/swad_message_database.c +++ b/swad_message_database.c @@ -75,6 +75,72 @@ extern struct Globals Gbl; /***************************** Private prototypes ****************************/ /*****************************************************************************/ +/*****************************************************************************/ +/************* Insert message subject and content in the database ************/ +/*****************************************************************************/ +// Return the code of the new inserted message + +long Msg_DB_CreateNewMsg (const char *Subject,const char *Content,long MedCod) + { + return + DB_QueryINSERTandReturnCode ("can not create message", + "INSERT INTO msg_content" + " (Subject,Content,MedCod)" + " VALUES" + " ('%s','%s',%ld)", + Subject, + Content, + MedCod); + } + +/*****************************************************************************/ +/************* Insert a message in the table of sent messages ****************/ +/*****************************************************************************/ + +void Msg_DB_CreateSntMsg (long MsgCod) + { + DB_QueryINSERT ("can not create sent message", + "INSERT INTO msg_snt" + " (MsgCod,CrsCod,UsrCod,Expanded,CreatTime)" + " VALUES" + " (%ld,%ld,%ld,'N',NOW())", + MsgCod, + Gbl.Hierarchy.Crs.CrsCod, + Gbl.Usrs.Me.UsrDat.UsrCod); + } + +/*****************************************************************************/ +/*********** Insert a message in the table of received messages **************/ +/*****************************************************************************/ + +void Msg_DB_CreateRcvMsg (long MsgCod,long UsrCod,bool NotifyByEmail) + { + DB_QueryINSERT ("can not create received message", + "INSERT INTO msg_rcv" + " (MsgCod,UsrCod,Notified,Open,Replied,Expanded)" + " VALUES" + " (%ld,%ld,'%c','N','N','N')", + MsgCod, + UsrCod, + NotifyByEmail ? 'Y' : + 'N'); + } + +/*****************************************************************************/ +/******** Update received message by setting Replied field to true ***********/ +/*****************************************************************************/ + +void Msg_DB_SetRcvMsgAsReplied (long MsgCod) + { + DB_QueryUPDATE ("can not update a received message", + "UPDATE msg_rcv" + " SET Replied='Y'" + " WHERE MsgCod=%ld" + " AND UsrCod=%ld", + MsgCod, + Gbl.Usrs.Me.UsrDat.UsrCod); + } + /*****************************************************************************/ /**************************** Expand a sent message **************************/ /*****************************************************************************/ @@ -158,6 +224,61 @@ void Msg_DB_ContractRcvMsg (long MsgCod) Gbl.Usrs.Me.UsrDat.UsrCod); } +/*****************************************************************************/ +/********************** Mark a received message as open **********************/ +/*****************************************************************************/ + +void Msg_DB_SetRcvMsgAsOpen (long MsgCod,long UsrCod) + { + /***** Mark message as read by user *****/ + DB_QueryUPDATE ("can not mark a received message as open", + "UPDATE msg_rcv" + " SET Open='Y'" + " WHERE MsgCod=%ld" + " AND UsrCod=%ld", + MsgCod, + UsrCod); + } + +/*****************************************************************************/ +/******************* Insert received message into deleted ********************/ +/*****************************************************************************/ + +void Msg_DB_MoveRcvMsgToDeleted (long MsgCod,long UsrCod) + { + DB_QueryINSERT ("can not remove a received message", + "INSERT IGNORE INTO msg_rcv_deleted" + " (MsgCod,UsrCod,Notified,Open,Replied)" + " SELECT MsgCod," + "UsrCod," + "Notified," + "Open," + "Replied" + " FROM msg_rcv" + " WHERE MsgCod=%ld" + " AND UsrCod=%ld", + MsgCod, + UsrCod); + } + +/*****************************************************************************/ +/******************* Insert received message into deleted ********************/ +/*****************************************************************************/ + +void Msg_DB_MoveSntMsgToDeleted (long MsgCod) + { + DB_QueryINSERT ("can not remove a sent message", + "INSERT IGNORE INTO msg_snt_deleted" + " (MsgCod,CrsCod,UsrCod,CreatTime)" + " SELECT MsgCod," + "CrsCod," + "UsrCod," + "CreatTime" + " FROM msg_snt" + " WHERE MsgCod=%ld", + MsgCod); + } + /*****************************************************************************/ /************************* Make "from"/"to" subquery *************************/ /*****************************************************************************/ @@ -487,7 +608,541 @@ void Msg_DB_GetStatusOfRcvMsg (long MsgCod, } /*****************************************************************************/ -/********************* Get number of user I have banned **********************/ +/******************** Check if a sent message is deleted *********************/ +/*****************************************************************************/ + +bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod) + { + return (DB_QueryCOUNT ("can not check if a sent message is deleted", + "SELECT COUNT(*)" + " FROM msg_snt" + " WHERE MsgCod=%ld", + MsgCod) == 0); // The message has been deleted + // by its author when it is not present + // in table of sent messages undeleted + } + +/*****************************************************************************/ +/***** Check if a received message has been deleted by all its recipients ****/ +/*****************************************************************************/ + +bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod) + { + return (DB_QueryCOUNT ("can not check if a received message" + " is deleted by all recipients", + "SELECT COUNT(*)" + " FROM msg_rcv" + " WHERE MsgCod=%ld", + MsgCod) == 0); // The message has been deleted + // by all its recipients when it is not present + // in table of received messages undeleted + } + +/*****************************************************************************/ +/******** Get the number of unique messages sent from this location **********/ +/******** (all the platform, current degree or current course) **********/ +/*****************************************************************************/ + +unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) + { + const char *Table = "msg_snt"; + + /***** Get the number of messages sent from this location + (all the platform, current degree or current course) from database *****/ + switch (MsgStatus) + { + case Msg_STATUS_ALL: + case Msg_STATUS_NOTIFIED: + Table = "msg_snt"; + break; + case Msg_STATUS_DELETED: + Table = "msg_snt_deleted"; + break; + } + switch (Scope) + { + case HieLvl_SYS: + return (unsigned) DB_GetNumRowsTable (Table); + case HieLvl_CTY: + return (unsigned) + DB_QueryCOUNT ("can not get number of sent messages", + "SELECT COUNT(*)" + " FROM ins_instits," + "ctr_centers," + "deg_degrees," + "crs_courses," + "%s" + " WHERE ins_instits.CtyCod=%ld" + " AND ins_instits.InsCod=ctr_centers.InsCod" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=%s.CrsCod", + Table, + Gbl.Hierarchy.Cty.CtyCod, + Table); + case HieLvl_INS: + return (unsigned) + DB_QueryCOUNT ("can not get number of sent messages", + "SELECT COUNT(*)" + " FROM ctr_centers," + "deg_degrees," + "crs_courses," + "%s" + " WHERE ctr_centers.InsCod=%ld" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=%s.CrsCod", + Table, + Gbl.Hierarchy.Ins.InsCod, + Table); + case HieLvl_CTR: + return (unsigned) + DB_QueryCOUNT ("can not get number of sent messages", + "SELECT COUNT(*)" + " FROM deg_degrees," + "crs_courses," + "%s" + " WHERE deg_degrees.CtrCod=%ld" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=%s.CrsCod", + Table, + Gbl.Hierarchy.Ctr.CtrCod, + Table); + case HieLvl_DEG: + return (unsigned) + DB_QueryCOUNT ("can not get number of sent messages", + "SELECT COUNT(*)" + " FROM crs_courses," + "%s" + " WHERE crs_courses.DegCod=%ld" + " AND crs_courses.CrsCod=%s.CrsCod", + Table, + Gbl.Hierarchy.Deg.DegCod, + Table); + case HieLvl_CRS: + return (unsigned) + DB_QueryCOUNT ("can not get number of sent messages", + "SELECT COUNT(*)" + " FROM %s" + " WHERE CrsCod=%ld", + Table, + Gbl.Hierarchy.Crs.CrsCod); + default: + return 0; + } + } + +/*****************************************************************************/ +/****** Get the number of unique messages received from this location ********/ +/****** (all the platform, current degree or current course) ********/ +/*****************************************************************************/ + +unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) + { + char *Table; + + /***** Get the number of unique messages sent from this location + (all the platform, current degree or current course) from database *****/ + switch (MsgStatus) + { + case Msg_STATUS_ALL: + case Msg_STATUS_DELETED: + Table = (MsgStatus == Msg_STATUS_ALL) ? "msg_rcv" : + "msg_rcv_deleted"; + switch (Scope) + { + case HieLvl_SYS: + return (unsigned) DB_GetNumRowsTable (Table); + case HieLvl_CTY: + return (unsigned) + DB_QueryCOUNT ("can not get number of received messages", + "SELECT COUNT(*)" + " FROM ins_instits," + "ctr_centers," + "deg_degrees," + "crs_courses," + "%s," + "msg_snt" + " WHERE ins_instits.CtyCod=%ld" + " AND ins_instits.InsCod=ctr_centers.InsCod" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=%s.MsgCod", + Table, + Gbl.Hierarchy.Cty.CtyCod, + Table); + case HieLvl_INS: + return (unsigned) + DB_QueryCOUNT ("can not get number of received messages", + "SELECT COUNT(*)" + " FROM ctr_centers," + "deg_degrees," + "crs_courses," + "%s," + "msg_snt" + " WHERE ctr_centers.InsCod=%ld" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=%s.MsgCod", + Table, + Gbl.Hierarchy.Ins.InsCod, + Table); + case HieLvl_CTR: + return (unsigned) + DB_QueryCOUNT ("can not get number of received messages", + "SELECT COUNT(*)" + " FROM deg_degrees," + "crs_courses," + "%s," + "msg_snt" + " WHERE deg_degrees.CtrCod=%ld" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=%s.MsgCod", + Table, + Gbl.Hierarchy.Ctr.CtrCod, + Table); + case HieLvl_DEG: + return (unsigned) + DB_QueryCOUNT ("can not get number of received messages", + "SELECT COUNT(*)" + " FROM crs_courses," + "%s," + "msg_snt" + " WHERE crs_courses.DegCod=%ld" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=%s.MsgCod", + Table, + Gbl.Hierarchy.Deg.DegCod, + Table); + case HieLvl_CRS: + return (unsigned) + DB_QueryCOUNT ("can not get number of received messages", + "SELECT COUNT(*)" + " FROM msg_snt," + "%s" + " WHERE msg_snt.CrsCod=%ld" + " AND msg_snt.MsgCod=%s.MsgCod", + Table, + Gbl.Hierarchy.Crs.CrsCod, + Table); + case HieLvl_UNK: + default: + return 0; + } + return 0; + case Msg_STATUS_NOTIFIED: + switch (Scope) + { + case HieLvl_SYS: + return (unsigned) + DB_QueryCOUNT ("can not get number of received messages", + "SELECT " + "(SELECT COUNT(*)" + " FROM msg_rcv" + " WHERE Notified='Y')" + " + " + "(SELECT COUNT(*)" + " FROM msg_rcv_deleted" + " WHERE Notified='Y')"); + case HieLvl_CTY: + return (unsigned) + DB_QueryCOUNT ("can not get number of received messages", + "SELECT " + "(SELECT COUNT(*)" + " FROM ins_instits," + "ctr_centers," + "deg_degrees," + "crs_courses," + "msg_snt," + "msg_rcv" + " WHERE ins_instits.CtyCod=%ld" + " AND ins_instits.InsCod=ctr_centers.InsCod" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=msg_rcv.MsgCod" + " AND msg_rcv.Notified='Y')" + " + " + "(SELECT COUNT(*)" + " FROM ins_instits," + "ctr_centers," + "deg_degrees," + "crs_courses," + "msg_snt," + "msg_rcv_deleted" + " WHERE ins_instits.CtyCod=%ld" + " AND ins_instits.InsCod=ctr_centers.InsCod" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod" + " AND msg_rcv_deleted.Notified='Y')", + Gbl.Hierarchy.Cty.CtyCod, + Gbl.Hierarchy.Cty.CtyCod); + case HieLvl_INS: + return (unsigned) + DB_QueryCOUNT ("can not get number of received messages", + "SELECT " + "(SELECT COUNT(*)" + " FROM ctr_centers," + "deg_degrees," + "crs_courses," + "msg_snt," + "msg_rcv" + " WHERE ctr_centers.InsCod=%ld" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=msg_rcv.MsgCod" + " AND msg_rcv.Notified='Y')" + " + " + "(SELECT COUNT(*)" + " FROM ctr_centers," + "deg_degrees," + "crs_courses," + "msg_snt," + "msg_rcv_deleted" + " WHERE ctr_centers.InsCod=%ld" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod" + " AND msg_rcv_deleted.Notified='Y')", + Gbl.Hierarchy.Ins.InsCod, + Gbl.Hierarchy.Ins.InsCod); + case HieLvl_CTR: + return (unsigned) + DB_QueryCOUNT ("can not get number of received messages", + "SELECT " + "(SELECT COUNT(*)" + " FROM deg_degrees," + "crs_courses," + "msg_snt," + "msg_rcv" + " WHERE deg_degrees.CtrCod=%ld" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=msg_rcv.MsgCod" + " AND msg_rcv.Notified='Y')" + " + " + "(SELECT COUNT(*)" + " FROM deg_degrees," + "crs_courses," + "msg_snt," + "msg_rcv_deleted" + " WHERE deg_degrees.CtrCod=%ld" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod" + " AND msg_rcv_deleted.Notified='Y')", + Gbl.Hierarchy.Ctr.CtrCod, + Gbl.Hierarchy.Ctr.CtrCod); + case HieLvl_DEG: + return (unsigned) + DB_QueryCOUNT ("can not get number of received messages", + "SELECT " + "(SELECT COUNT(*)" + " FROM crs_courses," + "msg_snt," + "msg_rcv" + " WHERE crs_courses.DegCod=%ld" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=msg_rcv.MsgCod" + " AND msg_rcv.Notified='Y')" + " + " + "(SELECT COUNT(*)" + " FROM crs_courses," + "msg_snt," + "msg_rcv_deleted" + " WHERE crs_courses.DegCod=%ld" + " AND crs_courses.CrsCod=msg_snt.CrsCod" + " AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod" + " AND msg_rcv_deleted.Notified='Y')", + Gbl.Hierarchy.Deg.DegCod, + Gbl.Hierarchy.Deg.DegCod); + case HieLvl_CRS: + return (unsigned) + DB_QueryCOUNT ("can not get number of received messages", + "SELECT " + "(SELECT COUNT(*)" + " FROM msg_snt," + "msg_rcv" + " WHERE msg_snt.CrsCod=%ld" + " AND msg_snt.MsgCod=msg_rcv.MsgCod" + " AND msg_rcv.Notified='Y')" + " + " + "(SELECT COUNT(*)" + " FROM msg_snt," + "msg_rcv_deleted" + " WHERE msg_snt.CrsCod=%ld" + " AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod" + " AND msg_rcv_deleted.Notified='Y')", + Gbl.Hierarchy.Crs.CrsCod, + Gbl.Hierarchy.Crs.CrsCod); + case HieLvl_UNK: + default: + return 0; + } + return 0; + default: + return 0; + } + } + +/*****************************************************************************/ +/**** Get the number of unique messages sent by any teacher from a course ****/ +/*****************************************************************************/ + +unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod) + { + return (unsigned) + DB_QueryCOUNT ("can not get the number of messages sent by teachers", + "SELECT COUNT(*)" + " FROM msg_snt," + "crs_users" + " WHERE msg_snt.CrsCod=%ld" + " AND crs_users.CrsCod=%ld" + " AND crs_users.Role IN (%u,%u)" + " AND msg_snt.UsrCod=crs_users.UsrCod", + CrsCod, + CrsCod, + (unsigned) Rol_NET, // Non-editing teacher + (unsigned) Rol_TCH); // Teacher + } + +/*****************************************************************************/ +/************** Get the number of unique messages sent by a user *************/ +/*****************************************************************************/ + +unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod) + { + return (unsigned) + DB_QueryCOUNT ("can not get the number of messages sent by a user", + "SELECT" + " (SELECT COUNT(*)" + " FROM msg_snt" + " WHERE UsrCod=%ld)" + " +" + " (SELECT COUNT(*)" + " FROM msg_snt_deleted" + " WHERE UsrCod=%ld)", + UsrCod, + UsrCod); + } + +/*****************************************************************************/ +/****************** Remove message from received messages ********************/ +/*****************************************************************************/ + +void Msg_DB_RemoveRcvMsg (long MsgCod,long UsrCod) + { + DB_QueryDELETE ("can not remove a received message", + "DELETE FROM msg_rcv" + " WHERE MsgCod=%ld" + " AND UsrCod=%ld", + MsgCod, + UsrCod); + } + +/*****************************************************************************/ +/******************* Remove message from sent messages ***********************/ +/*****************************************************************************/ + +void Msg_DB_RemoveSntMsg (long MsgCod) + { + DB_QueryDELETE ("can not remove a sent message", + "DELETE FROM msg_snt" + " WHERE MsgCod=%ld", + MsgCod); + } + +/*****************************************************************************/ +/*************** Remove all received or sent messages of a user **************/ +/*****************************************************************************/ + +void Msg_DB_RemoveAllRecAndSntMsgsUsr (long UsrCod) + { + /***** Move messages from msg_rcv to msg_rcv_deleted *****/ + /* Insert messages into msg_rcv_deleted */ + DB_QueryINSERT ("can not remove received messages", + "INSERT IGNORE INTO msg_rcv_deleted" + " (MsgCod,UsrCod,Notified,Open,Replied)" + " SELECT MsgCod," + "UsrCod," + "Notified," + "Open," + "Replied" + " FROM msg_rcv" + " WHERE UsrCod=%ld", + UsrCod); + + /* Delete messages from msg_rcv *****/ + DB_QueryDELETE ("can not remove received messages", + "DELETE FROM msg_rcv" + " WHERE UsrCod=%ld", + UsrCod); + + /***** Move message from msg_snt to msg_snt_deleted *****/ + /* Insert message into msg_snt_deleted */ + DB_QueryINSERT ("can not remove sent messages", + "INSERT IGNORE INTO msg_snt_deleted" + " (MsgCod,CrsCod,UsrCod,CreatTime)" + " SELECT MsgCod," + "CrsCod," + "UsrCod," + "CreatTime" + " FROM msg_snt" + " WHERE UsrCod=%ld", + UsrCod); + + /* Delete message from msg_snt *****/ + DB_QueryDELETE ("can not remove sent messages", + "DELETE FROM msg_snt" + " WHERE UsrCod=%ld", + UsrCod); + } + +/*****************************************************************************/ +/***** Delete the subject and content of all completely deleted messages *****/ +/*****************************************************************************/ + +void Msg_DB_MoveUnusedMsgsContentToDeleted (void) + { + /***** Move messages from msg_content to msg_content_deleted *****/ + /* Insert message content into msg_content_deleted */ + DB_QueryINSERT ("can not remove the content of some messages", + "INSERT IGNORE INTO msg_content_deleted" + " (MsgCod,Subject,Content)" + " SELECT MsgCod," + "Subject," + "Content" + " FROM msg_content" + " WHERE MsgCod NOT IN" + " (SELECT MsgCod" + " FROM msg_snt)" + " AND MsgCod NOT IN" + " (SELECT DISTINCT MsgCod" + " FROM msg_rcv)"); + + /* Messages in msg_content_deleted older than a certain time + should be deleted to ensure the protection of personal data */ + + /* Delete message from msg_content *****/ + DB_QueryDELETE ("can not remove the content of some messages", + "DELETE FROM msg_content" + " WHERE MsgCod NOT IN" + " (SELECT MsgCod" + " FROM msg_snt)" + " AND MsgCod NOT IN" + " (SELECT DISTINCT MsgCod" + " FROM msg_rcv)"); + } + +/*****************************************************************************/ +/******************** Get number of users I have banned **********************/ /*****************************************************************************/ unsigned Msg_DB_GetNumUsrsBannedByMe (void) @@ -499,3 +1154,50 @@ unsigned Msg_DB_GetNumUsrsBannedByMe (void) " WHERE ToUsrCod=%ld", Gbl.Usrs.Me.UsrDat.UsrCod); } + +/*****************************************************************************/ +/************************* Get users I have banned ***************************/ +/*****************************************************************************/ + +unsigned Msg_DB_GetUsrsBannedByMe (MYSQL_RES **mysql_res) + { + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get banned users", + "SELECT msg_banned.FromUsrCod" + " FROM msg_banned," + "usr_data" + " WHERE msg_banned.ToUsrCod=%ld" + " AND msg_banned.FromUsrCod=usr_data.UsrCod" + " ORDER BY usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName", + Gbl.Usrs.Me.UsrDat.UsrCod); + } + +/*****************************************************************************/ +/**************** Chech if a user is banned by another user ******************/ +/*****************************************************************************/ + +bool Msg_DB_CheckIfUsrIsBanned (long FromUsrCod,long ToUsrCod) + { + /***** Get if FromUsrCod is banned by ToUsrCod *****/ + return (DB_QueryCOUNT ("can not check if a user is banned", + "SELECT COUNT(*)" + " FROM msg_banned" + " WHERE FromUsrCod=%ld" + " AND ToUsrCod=%ld", + FromUsrCod,ToUsrCod) != 0); + } + +/*****************************************************************************/ +/************************ Remove user from banned table **********************/ +/*****************************************************************************/ + +void Msg_DB_RemoveUsrFromBanned (long UsrCod) + { + DB_QueryDELETE ("can not remove user from table of banned users", + "DELETE FROM msg_banned" + " WHERE FromUsrCod=%ld" + " OR ToUsrCod=%ld", + UsrCod,UsrCod); + } diff --git a/swad_message_database.h b/swad_message_database.h index 4cd07f5e3..8e7e8959e 100644 --- a/swad_message_database.h +++ b/swad_message_database.h @@ -30,6 +30,7 @@ #include // To access MySQL databases // #include "swad_course.h" +#include "swad_hierarchy_level.h" // #include "swad_notification.h" // #include "swad_statistic.h" @@ -47,10 +48,17 @@ /****************************** Public prototypes ****************************/ /*****************************************************************************/ +long Msg_DB_CreateNewMsg (const char *Subject,const char *Content,long MedCod); +void Msg_DB_CreateSntMsg (long MsgCod); +void Msg_DB_CreateRcvMsg (long MsgCod,long UsrCod,bool NotifyByEmail); +void Msg_DB_SetRcvMsgAsReplied (long MsgCod); void Msg_DB_ExpandSntMsg (long MsgCod); void Msg_DB_ExpandRcvMsg (long MsgCod); void Msg_DB_ContractSntMsg (long MsgCod); void Msg_DB_ContractRcvMsg (long MsgCod); +void Msg_DB_SetRcvMsgAsOpen (long MsgCod,long UsrCod); +void Msg_DB_MoveRcvMsgToDeleted (long MsgCod,long UsrCod); +void Msg_DB_MoveSntMsgToDeleted (long MsgCod); void Msg_DB_MakeFilterFromToSubquery (const struct Msg_Messages *Messages, char FilterFromToSubquery[Msg_MAX_BYTES_MESSAGES_QUERY + 1]); @@ -63,6 +71,23 @@ void Msg_DB_GetMsgSubject (long MsgCod,char Subject[Cns_MAX_BYTES_SUBJECT + 1]); bool Msg_DB_GetStatusOfSntMsg (long MsgCod); void Msg_DB_GetStatusOfRcvMsg (long MsgCod, bool *Open,bool *Replied,bool *Expanded); +bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod); +bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod); +unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus); +unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus); +unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod); +unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod); + +void Msg_DB_RemoveRcvMsg (long MsgCod,long UsrCod); +void Msg_DB_RemoveSntMsg (long MsgCod); +void Msg_DB_RemoveAllRecAndSntMsgsUsr (long UsrCod); +void Msg_DB_MoveUnusedMsgsContentToDeleted (void); + +//--------------------------- Users banned ------------------------------------ unsigned Msg_DB_GetNumUsrsBannedByMe (void); +unsigned Msg_DB_GetUsrsBannedByMe (MYSQL_RES **mysql_res); +bool Msg_DB_CheckIfUsrIsBanned (long FromUsrCod,long ToUsrCod); + +void Msg_DB_RemoveUsrFromBanned (long UsrCod); #endif diff --git a/swad_notification.c b/swad_notification.c index fffe4b6da..09f97cbf9 100644 --- a/swad_notification.c +++ b/swad_notification.c @@ -50,6 +50,7 @@ #include "swad_HTML.h" #include "swad_mark.h" #include "swad_message.h" +#include "swad_message_database.h" #include "swad_notice.h" #include "swad_notification.h" #include "swad_notification_database.h" @@ -907,7 +908,7 @@ void Ntf_GetNotifSummaryAndContent (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], Msg_GetNotifMessage (SummaryStr,ContentStr,Cod,GetContent); if (Gbl.WebService.IsWebService) /* Set the message as open by me, because I can read it in an extern application */ - Msg_DB_SetReceivedMsgAsOpen (Cod,UsrCod); + Msg_DB_SetRcvMsgAsOpen (Cod,UsrCod); break; case Ntf_EVENT_SURVEY: Svy_GetNotifSurvey (SummaryStr,ContentStr,Cod,GetContent); diff --git a/swad_profile.c b/swad_profile.c index 84fe33791..269fbda81 100644 --- a/swad_profile.c +++ b/swad_profile.c @@ -45,6 +45,7 @@ #include "swad_HTML.h" #include "swad_language.h" #include "swad_message.h" +#include "swad_message_database.h" #include "swad_network.h" #include "swad_nickname.h" #include "swad_notification.h" diff --git a/swad_record.c b/swad_record.c index e9ced8b5d..01b47b5c9 100644 --- a/swad_record.c +++ b/swad_record.c @@ -49,6 +49,7 @@ #include "swad_ID.h" #include "swad_logo.h" #include "swad_message.h" +#include "swad_message_database.h" #include "swad_network.h" #include "swad_parameter.h" #include "swad_photo.h"