+ <%= form.submit "Import Heartbeats",
+ class: "bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded font-medium transition-colors inline-flex items-center gap-2",
+ data: { confirm: "Are you sure you want to import heartbeats? This will add new data to your account." } %>
+
+ <% end %>
+
+
+
+ <% end %>
+
diff --git a/config/routes.rb b/config/routes.rb
index 67aa8eb5..091223ed 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -113,6 +113,7 @@ def matches?(request)
resources :heartbeats, only: [] do
collection do
get :export
+ post :import
end
end
end
diff --git a/db/seeds.rb b/db/seeds.rb
index eda300e9..3061d068 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -7,7 +7,9 @@
# Creating test user
test_user = User.find_or_create_by(slack_uid: 'TEST123456') do |user|
user.username = 'testuser'
- user.is_admin = true
+
+ # Before you had user.is_admin = true, does not work, changed it to that, looks like it works but idk how to use the admin pages so pls check this, i just guess coded this, the cmd to seed the db works without errors
+ user.set_admin_level(:superadmin)
# Ensure timezone is set to avoid nil timezone issues
user.timezone = 'America/New_York'
end
From 0964b3ff583016b0df9a195d6265f3919b5465e6 Mon Sep 17 00:00:00 2001
From: Jeffrey Wang <66625372+JeffreyWangDev@users.noreply.github.com>
Date: Sun, 10 Aug 2025 14:22:32 -0400
Subject: [PATCH 2/3] Fix whitespace
Make linter happy
---
app/controllers/my/heartbeats_controller.rb | 2 +-
app/services/heartbeat_import_service.rb | 46 ++++++++++-----------
2 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/app/controllers/my/heartbeats_controller.rb b/app/controllers/my/heartbeats_controller.rb
index a70fa877..6759462d 100644
--- a/app/controllers/my/heartbeats_controller.rb
+++ b/app/controllers/my/heartbeats_controller.rb
@@ -88,7 +88,7 @@ def import
end
file = params[:heartbeat_file]
-
+
unless file.content_type == 'application/json' || file.original_filename.ends_with?('.json')
redirect_to my_settings_path, alert: "pls upload only json (download from the button above it)"
return
diff --git a/app/services/heartbeat_import_service.rb b/app/services/heartbeat_import_service.rb
index fb746404..f399ea55 100644
--- a/app/services/heartbeat_import_service.rb
+++ b/app/services/heartbeat_import_service.rb
@@ -10,11 +10,11 @@ def self.import_from_file(file_content, user)
raise StandardError, "Not json: #{e.message}"
end
- unless parsed_data.is_a?(Hash) && parsed_data['heartbeats'].is_a?(Array)
+ unless parsed_data.is_a?(Hash) && parsed_data["heartbeats"].is_a?(Array)
raise StandardError, "Not correct format, download from /my/settings on the offical hackatime then import here"
end
- heartbeats_data = parsed_data['heartbeats']
+ heartbeats_data = parsed_data["heartbeats"]
imported_count = 0
skipped_count = 0
errors = []
@@ -24,33 +24,33 @@ def self.import_from_file(file_content, user)
batch.each_with_index do |heartbeat_data, index|
begin
- time_value = if heartbeat_data['time'].is_a?(String)
- Time.parse(heartbeat_data['time']).to_f
+ time_value = if heartbeat_data["time"].is_a?(String)
+ Time.parse(heartbeat_data["time"]).to_f
else
- heartbeat_data['time'].to_f
+ heartbeat_data["time"].to_f
end
attrs = {
user_id: user.id,
time: time_value,
- entity: heartbeat_data['entity'],
- type: heartbeat_data['type'],
- category: heartbeat_data['category'] || 'coding',
- project: heartbeat_data['project'],
- language: heartbeat_data['language'],
- editor: heartbeat_data['editor'],
- operating_system: heartbeat_data['operating_system'],
- machine: heartbeat_data['machine'],
- branch: heartbeat_data['branch'],
- user_agent: heartbeat_data['user_agent'],
- is_write: heartbeat_data['is_write'] || false,
- line_additions: heartbeat_data['line_additions'],
- line_deletions: heartbeat_data['line_deletions'],
- lineno: heartbeat_data['lineno'],
- lines: heartbeat_data['lines'],
- cursorpos: heartbeat_data['cursorpos'],
- dependencies: heartbeat_data['dependencies'] || [],
- project_root_count: heartbeat_data['project_root_count'],
+ entity: heartbeat_data["entity"],
+ type: heartbeat_data["type"],
+ category: heartbeat_data["category"] || "coding",
+ project: heartbeat_data["project"],
+ language: heartbeat_data["language"],
+ editor: heartbeat_data["editor"],
+ operating_system: heartbeat_data["operating_system"],
+ machine: heartbeat_data["machine"],
+ branch: heartbeat_data["branch"],
+ user_agent: heartbeat_data["user_agent"],
+ is_write: heartbeat_data["is_write"] || false,
+ line_additions: heartbeat_data["line_additions"],
+ line_deletions: heartbeat_data["line_deletions"],
+ lineno: heartbeat_data["lineno"],
+ lines: heartbeat_data["lines"],
+ cursorpos: heartbeat_data["cursorpos"],
+ dependencies: heartbeat_data["dependencies"] || [],
+ project_root_count: heartbeat_data["project_root_count"],
source_type: :wakapi_import,
raw_data: heartbeat_data.slice(*Heartbeat.indexed_attributes)
}
From e19cd6c43bc0646201ed8396f96872946028cba1 Mon Sep 17 00:00:00 2001
From: Jeffrey Wang <66625372+JeffreyWangDev@users.noreply.github.com>
Date: Sun, 10 Aug 2025 14:24:38 -0400
Subject: [PATCH 3/3] Remove whitespace
Make linter happy
---
app/controllers/my/heartbeats_controller.rb | 12 ++++++------
app/services/heartbeat_import_service.rb | 6 +++---
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/app/controllers/my/heartbeats_controller.rb b/app/controllers/my/heartbeats_controller.rb
index 6759462d..d5c2f771 100644
--- a/app/controllers/my/heartbeats_controller.rb
+++ b/app/controllers/my/heartbeats_controller.rb
@@ -64,7 +64,7 @@ def export
end
}
- filename = "heartbeats_#{current_user.slack_uid}_#{start_date.strftime('%Y%m%d')}_#{end_date.strftime('%Y%m%d')}.json"
+ filename = "heartbeats_#{current_user.slack_uid}_#{start_date.strftime("%Y%m%d")}_#{end_date.strftime("%Y%m%d")}.json"
respond_to do |format|
format.json {
@@ -89,13 +89,13 @@ def import
file = params[:heartbeat_file]
- unless file.content_type == 'application/json' || file.original_filename.ends_with?('.json')
+ unless file.content_type == "application/json" || file.original_filename.ends_with?(".json")
redirect_to my_settings_path, alert: "pls upload only json (download from the button above it)"
return
end
begin
- file_content = file.read.force_encoding('UTF-8')
+ file_content = file.read.force_encoding("UTF-8")
rescue => e
redirect_to my_settings_path, alert: "error reading file: #{e.message}"
return
@@ -111,16 +111,16 @@ def import
if result[:errors].any?
error_count = result[:errors].length
if error_count <= 3
- message += ". Errors occurred: #{result[:errors].join('; ')}"
+ message += ". Errors occurred: #{result[:errors].join("; ")}"
else
- message += ". #{error_count} errors occurred. First few: #{result[:errors].first(2).join('; ')}..."
+ message += ". #{error_count} errors occurred. First few: #{result[:errors].first(2).join("; ")}..."
end
end
redirect_to root_path, notice: message
else
error_message = "Import failed: #{result[:error]}"
if result[:errors].any? && result[:errors].length > 1
- error_message += "Errors: #{result[:errors][1..2].join('; ')}"
+ error_message += "Errors: #{result[:errors][1..2].join("; ")}"
end
redirect_to my_settings_path, alert: error_message
end
diff --git a/app/services/heartbeat_import_service.rb b/app/services/heartbeat_import_service.rb
index f399ea55..f3d8e921 100644
--- a/app/services/heartbeat_import_service.rb
+++ b/app/services/heartbeat_import_service.rb
@@ -54,12 +54,12 @@ def self.import_from_file(file_content, user)
source_type: :wakapi_import,
raw_data: heartbeat_data.slice(*Heartbeat.indexed_attributes)
}
-
+
attrs[:fields_hash] = Heartbeat.generate_fields_hash(attrs)
print(attrs[:fields_hash])
print("\n")
records_to_upsert << attrs
-
+
rescue => e
errors << "Row #{index + 1}: #{e.message}"
next
@@ -99,7 +99,7 @@ def self.import_from_file(file_content, user)
imported_count: 0,
total_count: 0,
skipped_count: 0,
- errors: [e.message]
+ errors: [ e.message ]
}
end
end