diff --git a/app/controllers/api/v1/tracks_controller.rb b/app/controllers/api/v1/tracks_controller.rb deleted file mode 100644 index d9cd497f..00000000 --- a/app/controllers/api/v1/tracks_controller.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -class Api::V1::TracksController < ApiController - def index - start_at = params[:start_at]&.to_datetime&.to_i - end_at = params[:end_at]&.to_datetime&.to_i || Time.zone.now.to_i - - tracks = current_api_user.tracks - .where('start_at <= ? AND end_at >= ?', Time.zone.at(end_at), Time.zone.at(start_at)) - .order(start_at: :asc) - - track_ids = tracks.pluck(:id) - serialized_tracks = TrackSerializer.new(current_api_user, track_ids).call - - render json: { tracks: serialized_tracks } - end - - def create - Tracks::CreateJob.perform_later(current_api_user.id) - - render json: { message: 'Track generation started' } - end -end diff --git a/app/javascript/controllers/maps_controller.js b/app/javascript/controllers/maps_controller.js index b9eb489e..4ec64f62 100644 --- a/app/javascript/controllers/maps_controller.js +++ b/app/javascript/controllers/maps_controller.js @@ -280,8 +280,8 @@ export default class extends BaseController { handleTrackUpdate(data) { // Get current time range for filtering const urlParams = new URLSearchParams(window.location.search); - const currentStartAt = urlParams.get('start_at') || this.getDefaultStartDate(); - const currentEndAt = urlParams.get('end_at') || this.getDefaultEndDate(); + const currentStartAt = urlParams.get('start_at') || new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(); + const currentEndAt = urlParams.get('end_at') || new Date().toISOString(); // Handle the track update handleIncrementalTrackUpdate( @@ -821,7 +821,7 @@ export default class extends BaseController { - +
@@ -857,10 +857,7 @@ export default class extends BaseController { tracksVisibleCheckbox.addEventListener("change", this.toggleTracksVisibility.bind(this)); } - const refreshTracksBtn = div.querySelector("#refresh-tracks-btn"); - if (refreshTracksBtn) { - refreshTracksBtn.addEventListener("click", this.refreshTracks.bind(this)); - } + // Add event listener to the form submission div.querySelector('#settings-form').addEventListener( @@ -1771,39 +1768,10 @@ export default class extends BaseController { // Track-related methods async initializeTracksLayer() { - // Use pre-loaded tracks data if available, otherwise fetch from API + // Use pre-loaded tracks data if available if (this.tracksData && this.tracksData.length > 0) { this.createTracksFromData(this.tracksData); } else { - await this.fetchTracks(); - } - } - - async fetchTracks() { - try { - // Get start and end dates from the current map view or URL params - const urlParams = new URLSearchParams(window.location.search); - const startAt = urlParams.get('start_at') || this.getDefaultStartDate(); - const endAt = urlParams.get('end_at') || this.getDefaultEndDate(); - - const response = await fetch(`/api/v1/tracks?start_at=${startAt}&end_at=${endAt}`, { - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${this.apiKey}` - } - }); - - if (response.ok) { - const data = await response.json(); - this.createTracksFromData(data.tracks || []); - } else { - console.warn('Failed to fetch tracks:', response.status); - // Create empty layer for layer control - this.tracksLayer = L.layerGroup(); - } - } catch (error) { - console.warn('Tracks API not available or failed:', error); // Create empty layer for layer control this.tracksLayer = L.layerGroup(); } @@ -1865,78 +1833,5 @@ export default class extends BaseController { - getDefaultStartDate() { - // Default to last week if no markers available - if (!this.markers || this.markers.length === 0) { - return new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(); - } - // Get start date from first marker - const firstMarker = this.markers[0]; - if (firstMarker && firstMarker[3]) { - const startDate = new Date(firstMarker[3] * 1000); - startDate.setHours(0, 0, 0, 0); - return startDate.toISOString(); - } - - return new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(); - } - - getDefaultEndDate() { - // Default to today if no markers available - if (!this.markers || this.markers.length === 0) { - return new Date().toISOString(); - } - - // Get end date from last marker - const lastMarker = this.markers[this.markers.length - 1]; - if (lastMarker && lastMarker[3]) { - const endDate = new Date(lastMarker[3] * 1000); - endDate.setHours(23, 59, 59, 999); - return endDate.toISOString(); - } - - return new Date().toISOString(); - } - - async refreshTracks() { - const refreshBtn = document.getElementById('refresh-tracks-btn'); - if (refreshBtn) { - refreshBtn.disabled = true; - refreshBtn.textContent = 'Refreshing...'; - } - - try { - // Trigger track creation on backend - const response = await fetch(`/api/v1/tracks`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${this.apiKey}` - }, - body: JSON.stringify({ - api_key: this.apiKey - }) - }); - - if (response.ok) { - const data = await response.json(); - showFlashMessage('notice', data.message || 'Tracks refreshed successfully'); - - // Refresh tracks display - await this.fetchTracks(); - } else { - throw new Error('Failed to refresh tracks'); - } - } catch (error) { - console.error('Error refreshing tracks:', error); - showFlashMessage('error', 'Failed to refresh tracks'); - } finally { - if (refreshBtn) { - refreshBtn.disabled = false; - refreshBtn.textContent = 'Refresh Tracks'; - } - } - } } diff --git a/config/routes.rb b/config/routes.rb index 5d507fa8..93ceb12d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -99,7 +99,6 @@ Rails.application.routes.draw do resources :areas, only: %i[index create update destroy] resources :points, only: %i[index create update destroy] - resources :tracks, only: %i[index create] resources :visits, only: %i[index update] do get 'possible_places', to: 'visits/possible_places#index', on: :member collection do diff --git a/spec/requests/api/v1/tracks_controller_spec.rb b/spec/requests/api/v1/tracks_controller_spec.rb deleted file mode 100644 index a2a9f137..00000000 --- a/spec/requests/api/v1/tracks_controller_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::V1::TracksController, type: :request do - let(:user) { create(:user) } - let(:api_key) { user.api_key } - - describe 'GET #index' do - let!(:track1) { create(:track, user: user, start_at: 2.days.ago, end_at: 2.days.ago + 1.hour) } - let!(:track2) { create(:track, user: user, start_at: 1.day.ago, end_at: 1.day.ago + 1.hour) } - - it 'returns tracks for the user' do - get "/api/v1/tracks", params: { api_key: api_key } - - expect(response).to have_http_status(:ok) - - json_response = JSON.parse(response.body) - expect(json_response['tracks']).to be_an(Array) - expect(json_response['tracks'].size).to eq(2) - - track_ids = json_response['tracks'].map { |t| t['id'] } - expect(track_ids).to include(track1.id, track2.id) - end - - it 'filters tracks by date range' do - start_at = 1.day.ago.beginning_of_day.iso8601 - end_at = 1.day.ago.end_of_day.iso8601 - - get "/api/v1/tracks", params: { - api_key: api_key, - start_at: start_at, - end_at: end_at - } - - expect(response).to have_http_status(:ok) - - json_response = JSON.parse(response.body) - expect(json_response['tracks'].size).to eq(1) - expect(json_response['tracks'].first['id']).to eq(track2.id) - end - - it 'requires authentication' do - get "/api/v1/tracks" - - expect(response).to have_http_status(:unauthorized) - end - end - - describe 'POST #create' do - it 'triggers track generation' do - expect { - post "/api/v1/tracks", params: { api_key: api_key } - }.to have_enqueued_job(Tracks::CreateJob).with(user.id) - - expect(response).to have_http_status(:ok) - - json_response = JSON.parse(response.body) - expect(json_response['message']).to eq('Track generation started') - end - - it 'requires authentication' do - post "/api/v1/tracks" - - expect(response).to have_http_status(:unauthorized) - end - end -end