From 8fed5013aad44674ab0185d8f57947936426d17a Mon Sep 17 00:00:00 2001 From: gunwt43 Date: Mon, 8 Sep 2025 23:13:22 +1000 Subject: [PATCH] Added GET endpoints for activities --- api/activity.py | 84 +++++++++++++++++++++++++++++-- fixing.env | 0 instance/reflexionpro_backend.db | Bin 0 -> 40960 bytes report.json | 44 ++++++++++++++++ 4 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 fixing.env create mode 100644 instance/reflexionpro_backend.db create mode 100644 report.json diff --git a/api/activity.py b/api/activity.py index d21b9d6..036fbc1 100644 --- a/api/activity.py +++ b/api/activity.py @@ -8,7 +8,6 @@ @activity_bp.route('', methods=['POST']) def create_activity(): data = request.get_json() - try: activity = Activity( user_id=data['user_id'], @@ -31,7 +30,7 @@ def create_activity(): min_elevation=data['min_elevation'] ) - # Handle optional time series data + # Optional time series time_series_list = data.get('time_series', []) for point in time_series_list: ts = ActivityTimeSeries( @@ -46,11 +45,88 @@ def create_activity(): db.session.add(activity) db.session.commit() - return jsonify({"message": "Activity and time series created", "activity_id": activity.id}), 201 except Exception as e: db.session.rollback() return jsonify({"error": str(e)}), 500 - \ No newline at end of file +# GET all activities +@activity_bp.route('', methods=['GET']) +def get_all_activities(): + activities = Activity.query.all() + result = [] + for activity in activities: + result.append({ + "id": activity.id, + "user_id": activity.user_id, + "begin_time": activity.begin_time.isoformat(), + "end_time": activity.end_time.isoformat(), + "activity_type": activity.activity_type, + "coach": activity.coach, + "average_speed": activity.average_speed, + "max_speed": activity.max_speed, + "average_heart_rate": activity.average_heart_rate, + "max_heart_rate": activity.max_heart_rate, + "calories": activity.calories, + "duration": activity.duration, + "moving_duration": activity.moving_duration, + "average_moving_speed": activity.average_moving_speed, + "distance": activity.distance, + "elevation_gain": activity.elevation_gain, + "elevation_loss": activity.elevation_loss, + "max_elevation": activity.max_elevation, + "min_elevation": activity.min_elevation, + "time_series": [ + { + "timestamp": ts.timestamp.isoformat(), + "longitude": ts.longitude, + "latitude": ts.latitude, + "elevation": ts.elevation, + "heart_rate": ts.heart_rate, + "cadence": ts.cadence + } for ts in activity.time_series + ] + }) + return jsonify(result) + +# GET single activity by ID +@activity_bp.route('/', methods=['GET']) +def get_activity(activity_id): + activity = Activity.query.get(activity_id) + if not activity: + return jsonify({"error": "Activity not found"}), 404 + + return jsonify({ + "id": activity.id, + "user_id": activity.user_id, + "begin_time": activity.begin_time.isoformat(), + "end_time": activity.end_time.isoformat(), + "activity_type": activity.activity_type, + "coach": activity.coach, + "average_speed": activity.average_speed, + "max_speed": activity.max_speed, + "average_heart_rate": activity.average_heart_rate, + "max_heart_rate": activity.max_heart_rate, + "calories": activity.calories, + "duration": activity.duration, + "moving_duration": activity.moving_duration, + "average_moving_speed": activity.average_moving_speed, + "distance": activity.distance, + "elevation_gain": activity.elevation_gain, + "elevation_loss": activity.elevation_loss, + "max_elevation": activity.max_elevation, + "min_elevation": activity.min_elevation, + "time_series": [ + { + "timestamp": ts.timestamp.isoformat(), + "longitude": ts.longitude, + "latitude": ts.latitude, + "elevation": ts.elevation, + "heart_rate": ts.heart_rate, + "cadence": ts.cadence + } for ts in activity.time_series + ] + }) + + diff --git a/fixing.env b/fixing.env new file mode 100644 index 0000000..e69de29 diff --git a/instance/reflexionpro_backend.db b/instance/reflexionpro_backend.db new file mode 100644 index 0000000000000000000000000000000000000000..da2ae6edaf330d0f80d83e550f21198e3b1312a1 GIT binary patch literal 40960 zcmeI4OKclO7{_;=HcnjH^g!_e6}By@Vu>VQuN^3rp!h#>?Dc#zvopW% zKd)V9uU%a;Jg(Gjr^P&FSvoAqvQ$zONs=<%Kl%_MP4D}<$H9jjIUaVHkruWe9Gv+> znwF1AhwjgO`@(OTm!>|M{A%Lyq)k!({ji&xPG@Il<&TeetY-3>t?#IY4Y`8UhexutwQ7vy(1 zGdqb~kF^Yoh575gCGrFbdZnvv`xbY?G~%o3+3GDGv|n`?oh3ADj^P;^74Ss1u)HQ` zj>yJ)Jc3%axg+#vQ40)9=aB~2=?o2jAiB-j&CXfWq8nBq61_yNOEeUR84CHBg{tbQ zOw&w*I!3^dHnCHy05~PN`NdR;rba^Ob8#FJ5HI zw8Lb@d@hzs=Ps$TEgZO6xh^`9$6KU0=J`<%H2s#LQ&$Xqa*L#>x^2!QolL~(hQs6C ztI+9PHQq2R)wHdK&_`Gl`8_GRo1Wwq$mxmX1F@QIQ3a#Dni?xQH3_cHOta6b8^4#R zx=xA-O2oAtyKb1guf(m5)vH?-C8omQ#808n^3-H@Yf+X&H+SDNY3@;(@7dxzb*S!m z*b}U}G!Qj?@14nXc79&|(1?rN^;<3G?DR8qzo(NW-nEWUc)y?_I_-CK8cIFieUiSI z0&2|jxDyc-DaYQX7%>Qk9`BcB+AJcsShQNVwZYT$lkj?-RH-uV*fm2-D7u%x8c5P~ zwv}GzXgca0n?|iLVn-Llyrp*A*&hda+m4)PFSSK*#uV3!?+#)2CibVZ#iG2Mi+fkh zY&5DE-0kJ)PGll(GTFr$=G|mO{WjlGWd!oa~#ve1*jbkQm^6kjX60;4?lQFZ# zbWXEK$H_6vGxEaj^?m8=(WCN%iI^99FI?Lql z9iB*MvsrofeIf0J%}iIk?Td+8L_MXV2_mg>gB6k(Fk%z}H78qKkGI|EvY3GQ9(Ps8 zw}J&_l1ba4^=Y!ny=Anhgv4z8Hg`0`jV;3aGVE?tf(c%uHLS;Vm3D@S%e-ggk`GSH zVvBWuS-2#+28kZ0Vh)O0M)+y3MWkl?mKPftV(vO#GaRpZfhZi0B#L*!2KkhBN#RO0 zZe}#fv(Q}VZpE5n3)Sfd0qf3|D*T?rHe85_YUeV!Q>n@9rP*QYsVF0LDf(@KHr`Xg z=KCQ1$uplz^g;ju5C8!X009sH0T2KI5C8!X009vA*9g2TPfN4w$Bw)qNoC*l=;GTs zlilHTlefmSn+vwMmqoXQ+>%arMGb3#>;3}s={iGxKEFh-b!Kwc(H5EOa?f47(z&~H z#n2YoRwKB{FVFlW(F*|tKmY_l00ck)1V8`;KmY_l00cnbIV5mmVx4~RJ^C_1aQ~lv z^p5}nAOHd&00JNY0w4eaAOHd&00JQJKPC|D|5Jy4mS!w^LjVB~009sH0T2KI5C8!X z009sHf#;FH-9xDtrRj3{