1- use chrono:: { Datelike , NaiveDate , NaiveTime } ;
1+ use chrono:: NaiveTime ;
22use chrono_tz:: Asia :: Kolkata ;
33use sqlx:: PgPool ;
44use std:: sync:: Arc ;
@@ -44,13 +44,16 @@ async fn execute_daily_task(pool: Arc<PgPool>) {
4444 . await ;
4545
4646 match members {
47- Ok ( members) => update_attendance ( members, & pool) . await ,
47+ Ok ( members) => {
48+ update_attendance ( & members, & pool) . await ;
49+ update_status_history ( & members, & pool) . await ;
50+ }
4851 // TODO: Handle this
4952 Err ( e) => error ! ( "Failed to fetch members: {:?}" , e) ,
5053 } ;
5154}
5255
53- async fn update_attendance ( members : Vec < Member > , pool : & PgPool ) {
56+ async fn update_attendance ( members : & Vec < Member > , pool : & PgPool ) {
5457 #[ allow( deprecated) ]
5558 let today = chrono:: Utc :: now ( )
5659 . with_timezone ( & Kolkata )
@@ -60,7 +63,7 @@ async fn update_attendance(members: Vec<Member>, pool: &PgPool) {
6063
6164 for member in members {
6265 let attendance = sqlx:: query (
63- "INSERT INTO Attendance (member_id, date, is_present, time_in, time_out)
66+ "INSERT INTO Attendance (member_id, date, is_present, time_in, time_out)
6467 VALUES ($1, $2, $3, $4, $5)
6568 ON CONFLICT (member_id, date) DO NOTHING" ,
6669 )
@@ -88,115 +91,42 @@ async fn update_attendance(members: Vec<Member>, pool: &PgPool) {
8891 }
8992 // This could have been called in `execute_daily_task()` but that would require us to loop through members twice.
9093 // Whether or not inserting attendance failed, Root will attempt to update AttendanceSummary. This can potentially fail too since insertion failed earlier. However, these two do not depend on each other and one of them failing is no reason to avoid trying the other.
91- update_attendance_summary ( member. member_id , pool) . await ;
9294 }
9395}
9496
95- async fn update_attendance_summary ( member_id : i32 , pool : & PgPool ) {
96- debug ! ( "Updating summary for member #{}" , member_id) ;
97+ async fn update_status_history ( members : & Vec < Member > , pool : & PgPool ) {
9798 #[ allow( deprecated) ]
9899 let today = chrono:: Utc :: now ( )
99100 . with_timezone ( & Kolkata )
100101 . date ( )
101102 . naive_local ( ) ;
102- let yesterday = today - chrono:: Duration :: days ( 1 ) ;
103-
104- let was_present_yesterday = sqlx:: query_scalar :: < _ , bool > (
105- r#"
106- SELECT is_present
107- FROM Attendance
108- WHERE member_id = $1 AND date = $2
109- "# ,
110- )
111- . bind ( member_id)
112- . bind ( yesterday)
113- . fetch_one ( pool)
114- . await ;
115-
116- match was_present_yesterday {
117- Ok ( true ) => {
118- update_days_attended ( member_id, today, pool) . await ;
119- }
120- Ok ( false ) => {
121- debug ! (
122- "Member ID: {} was absent yesterday, days_attended remains the same." ,
123- member_id
124- ) ;
125- }
126- Err ( e) => {
127- error ! ( "Could not fetch records from DB. Error: {}" , e) ;
128- }
129- }
130- }
103+ debug ! ( "Updating Status Update History on {}" , today) ;
131104
132- async fn update_days_attended ( member_id : i32 , today : NaiveDate , pool : & PgPool ) {
133- // Convert year and month into i32 cause SQLx cannot encode u32 into database types
134- let month: i32 = ( today. month0 ( ) + 1 ) as i32 ;
135- let year: i32 = today. year_ce ( ) . 1 as i32 ;
136-
137- let existing_days_attended = sqlx:: query_scalar :: < _ , i32 > (
138- r#"
139- SELECT days_attended
140- FROM AttendanceSummary
141- WHERE member_id = $1
142- AND year = $2
143- AND month = $3
144- "# ,
145- )
146- . bind ( member_id)
147- . bind ( year)
148- . bind ( month)
149- . fetch_optional ( pool)
150- . await ;
151-
152- match existing_days_attended {
153- Ok ( Some ( days_attended) ) => {
154- sqlx:: query (
155- r#"
156- UPDATE AttendanceSummary
157- SET days_attended = days_attended + 1
158- WHERE member_id = $1
159- AND year = $2
160- AND month = $3
161- "# ,
162- )
163- . bind ( member_id)
164- . bind ( year)
165- . bind ( month)
166- . execute ( pool)
167- . await
168- . unwrap ( ) ;
169-
170- debug ! (
171- "Updated days_attended for member ID: {}. New days_attended: {}" ,
172- member_id,
173- days_attended + 1
174- ) ;
175- }
176- Ok ( None ) => {
177- sqlx:: query (
178- r#"
179- INSERT INTO AttendanceSummary (member_id, year, month, days_attended)
180- VALUES ($1, $2, $3, 1)
181- "# ,
182- )
183- . bind ( member_id)
184- . bind ( year)
185- . bind ( month)
186- . execute ( pool)
187- . await
188- . unwrap ( ) ;
105+ for member in members {
106+ let status_update = sqlx:: query (
107+ "INSERT INTO StatusUpdateHistory (member_id, date, is_updated)
108+ VALUES ($1, $2, $3)
109+ ON CONFLICT (member_id, date) DO NOTHING" ,
110+ )
111+ . bind ( member. member_id )
112+ . bind ( today)
113+ . bind ( false )
114+ . execute ( pool)
115+ . await ;
189116
190- debug ! (
191- "Created new streak for member ID: {} for the month." ,
192- member_id
193- ) ;
194- }
195- Err ( e) => {
196- error ! (
197- "Error checking or updating streak for member ID {}: {:?}" ,
198- member_id, e
199- ) ;
117+ match status_update {
118+ Ok ( _) => {
119+ debug ! (
120+ "Status update record added for member ID: {}" ,
121+ member. member_id
122+ ) ;
123+ }
124+ Err ( e) => {
125+ error ! (
126+ "Failed to insert status update history for member ID: {}: {:?}" ,
127+ member. member_id, e
128+ ) ;
129+ }
200130 }
201131 }
202132}
0 commit comments