Remove tracks api

This commit is contained in:
Eugene Burmakin 2025-07-08 00:05:22 +02:00
parent e64e706b0f
commit 81eb759fb8
4 changed files with 5 additions and 202 deletions

View file

@ -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

View file

@ -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 {
<input type="checkbox" id="tracks_visible" name="tracks_visible" class='w-4' style="width: 20px;" ${this.tracksVisible ? 'checked' : ''} />
</label>
<button type="button" id="refresh-tracks-btn" class="btn btn-xs mt-2">Refresh Tracks</button>
<label for="speed_color_scale">Speed color scale</label>
<div class="join">
@ -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';
}
}
}
}

View file

@ -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

View file

@ -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