Skip to content

Commit 44d9e66

Browse files
authored
Remove hardcoded secrets (#914)
* build(backend): hoist dotenvy dep * build(config): add new dep * feat(config): remove card coded api tokens * ci: add env variables as arg * ci: add new build args * ci: add new env variables * feat(config): add default loaders for mal credentials Signed-off-by: Diptesh Choudhuri <ignisda2001@gmail.com> * feat(config): add config params for music tracking * docs: add link for backup * docs: change order of sections * feat(backend): discogs stuff * feat(*): remove all discogs and music stuff * ci: change order of args * fix(frontend): change key location * refactor(frontend): change response signature * chore(frontend): remove root layout * feat(frontend): add error boundary to dashboard layout * perf(backend): reduce duplicate queries * feat(frontend): add note about drag and drop * fix(frontend): better logic for next entry * feat(backend): store episode name in calendar event * Revert "feat(backend): store episode name in calendar event" This reverts commit e8e4be8. * feat(backend): return episode name for upcoming * feat(frontend): display correct name * feat(frontend): display tooltip if episode * chore(docs): better grammar * chore(backend): remove location of deps * feat(backend): add attribute to struct * chore(frontend): add new list item to errors * feat(backend): move auth providers to resolver level * feat(backend): correctly classify as mutations * feat(frontend): add btn to reload page * feat(frontend): display error message in boundary * feat(backend): get access to db in auth handler * chore(backend): remove useless code check --------- Signed-off-by: Diptesh Choudhuri <ignisda2001@gmail.com>
1 parent 5683121 commit 44d9e66

File tree

24 files changed

+359
-246
lines changed

24 files changed

+359
-246
lines changed

.github/workflows/release.yml

+2
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ jobs:
130130
tags: ${{ steps.required_args.outputs.image_names }}
131131
build-args: |
132132
APP_VERSION=${{ steps.required_args.outputs.APP_VERSION }}
133+
DEFAULT_TMDB_ACCESS_TOKEN=${{ secrets.DEFAULT_TMDB_ACCESS_TOKEN }}
134+
DEFAULT_MAL_CLIENT_ID=${{ secrets.DEFAULT_MAL_CLIENT_ID }}
133135
134136
upload-kodi-plugin:
135137
runs-on: ubuntu-20.04

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ async-graphql = { version = "=7.0.6", features = [
1111
"tracing",
1212
] }
1313
chrono = "=0.4.38"
14+
dotenvy_macro = "=0.15.7"
1415
nanoid = "=0.4.0"
1516
schematic = { version = "=0.16.4", features = [
1617
"config",

Dockerfile

+12-4
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,30 @@ COPY . .
3131
RUN cargo chef prepare --recipe-path recipe.json
3232

3333
FROM backend-chef AS backend-builder
34+
# build specific
3435
ARG TARGETARCH
35-
ARG APP_VERSION
3636
ARG BUILD_PROFILE=release
37+
# application specific
38+
ARG APP_VERSION
39+
ARG DEFAULT_TMDB_ACCESS_TOKEN
40+
ARG DEFAULT_MAL_CLIENT_ID
41+
RUN test -n "$APP_VERSION" && \
42+
test -n "$DEFAULT_TMDB_ACCESS_TOKEN" && \
43+
test -n "$DEFAULT_MAL_CLIENT_ID"
3744
ENV RUST_TARGET_TRIPLE_arm64="aarch64-unknown-linux-gnu"
3845
ENV RUST_TARGET_TRIPLE_amd64="x86_64-unknown-linux-gnu"
3946
ENV TARGET_CC="clang"
4047
ENV TARGET_AR="llvm-ar"
4148
ENV CFLAGS_aarch64_unknown_linux_gnu="--sysroot=/usr/aarch64-linux-gnu"
4249
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc
43-
ENV APP_VERSION=$APP_VERSION
44-
RUN test -n "$APP_VERSION"
4550
COPY --from=backend-planner /app/recipe.json recipe.json
4651
RUN rustup target add $(eval "echo \$RUST_TARGET_TRIPLE_$TARGETARCH")
4752
RUN cargo chef cook --profile $BUILD_PROFILE --target $(eval "echo \$RUST_TARGET_TRIPLE_$TARGETARCH") --recipe-path recipe.json
4853
COPY . .
49-
RUN ./apps/backend/ci/build-app.sh
54+
RUN APP_VERSION=$APP_VERSION \
55+
DEFAULT_TMDB_ACCESS_TOKEN=$DEFAULT_TMDB_ACCESS_TOKEN \
56+
DEFAULT_MAL_CLIENT_ID=$DEFAULT_MAL_CLIENT_ID \
57+
./apps/backend/ci/build-app.sh
5058

5159
FROM $NODE_BASE_IMAGE
5260
LABEL org.opencontainers.image.source="https://github.com/IgnisDa/ryot"

apps/backend/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ derive_more = { version = "=1.0.0-beta.6", features = [
3131
"add_assign",
3232
], default-features = false }
3333
dotenvy = "=0.15.7"
34-
dotenvy_macro = "=0.15.7"
34+
dotenvy_macro = { workspace = true }
3535
educe = { version = "=0.6.0", features = ["Debug"], default-features = false }
3636
enum_meta = "=0.7.0"
3737
flate2 = "=1.0.30"

apps/backend/src/exporter.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,27 @@ struct ExportJob {
2929
#[derive(Default)]
3030
pub struct ExporterQuery;
3131

32+
impl AuthProvider for ExporterQuery {}
33+
3234
#[Object]
3335
impl ExporterQuery {
3436
/// Get all the export jobs for the current user.
3537
async fn user_exports(&self, gql_ctx: &Context<'_>) -> Result<Vec<ExportJob>> {
3638
let service = gql_ctx.data_unchecked::<Arc<ExporterService>>();
37-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
39+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
3840
service.user_exports(user_id).await
3941
}
4042
}
4143

4244
#[derive(Default)]
4345
pub struct ExporterMutation;
4446

47+
impl AuthProvider for ExporterMutation {
48+
fn is_mutation(&self) -> bool {
49+
true
50+
}
51+
}
52+
4553
#[Object]
4654
impl ExporterMutation {
4755
/// Deploy a job to export data for a user.
@@ -51,7 +59,7 @@ impl ExporterMutation {
5159
to_export: Vec<ExportItem>,
5260
) -> Result<bool> {
5361
let service = gql_ctx.data_unchecked::<Arc<ExporterService>>();
54-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
62+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
5563
service.deploy_export_job(user_id, to_export).await
5664
}
5765
}
@@ -63,8 +71,6 @@ pub struct ExporterService {
6371
exercise_service: Arc<ExerciseService>,
6472
}
6573

66-
impl AuthProvider for ExporterService {}
67-
6874
impl ExporterService {
6975
pub fn new(
7076
config: Arc<config::AppConfig>,

apps/backend/src/fitness/resolver.rs

+21-15
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ struct EditCustomExerciseInput {
128128
#[derive(Default)]
129129
pub struct ExerciseQuery;
130130

131+
impl AuthProvider for ExerciseQuery {}
132+
131133
#[Object]
132134
impl ExerciseQuery {
133135
/// Get all the parameters related to exercises.
@@ -143,7 +145,7 @@ impl ExerciseQuery {
143145
input: ExercisesListInput,
144146
) -> Result<SearchResults<ExerciseListItem>> {
145147
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
146-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
148+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
147149
service.exercises_list(user_id, input).await
148150
}
149151

@@ -154,7 +156,7 @@ impl ExerciseQuery {
154156
input: SearchInput,
155157
) -> Result<SearchResults<WorkoutListItem>> {
156158
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
157-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
159+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
158160
service.user_workout_list(user_id, input).await
159161
}
160162

@@ -175,7 +177,7 @@ impl ExerciseQuery {
175177
workout_id: String,
176178
) -> Result<workout::Model> {
177179
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
178-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
180+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
179181
service.workout_details(&user_id, workout_id).await
180182
}
181183

@@ -186,7 +188,7 @@ impl ExerciseQuery {
186188
exercise_id: String,
187189
) -> Result<UserExerciseDetails> {
188190
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
189-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
191+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
190192
service.user_exercise_details(user_id, exercise_id).await
191193
}
192194

@@ -197,14 +199,20 @@ impl ExerciseQuery {
197199
input: UserMeasurementsListInput,
198200
) -> Result<Vec<user_measurement::Model>> {
199201
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
200-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
202+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
201203
service.user_measurements_list(&user_id, input).await
202204
}
203205
}
204206

205207
#[derive(Default)]
206208
pub struct ExerciseMutation;
207209

210+
impl AuthProvider for ExerciseMutation {
211+
fn is_mutation(&self) -> bool {
212+
true
213+
}
214+
}
215+
208216
#[Object]
209217
impl ExerciseMutation {
210218
/// Create a user measurement.
@@ -214,7 +222,7 @@ impl ExerciseMutation {
214222
input: user_measurement::Model,
215223
) -> Result<DateTimeUtc> {
216224
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
217-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
225+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
218226
service.create_user_measurement(&user_id, input).await
219227
}
220228

@@ -225,7 +233,7 @@ impl ExerciseMutation {
225233
timestamp: DateTimeUtc,
226234
) -> Result<bool> {
227235
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
228-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
236+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
229237
service.delete_user_measurement(user_id, timestamp).await
230238
}
231239

@@ -236,7 +244,7 @@ impl ExerciseMutation {
236244
input: UserWorkoutInput,
237245
) -> Result<String> {
238246
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
239-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
247+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
240248
service.create_user_workout(&user_id, input).await
241249
}
242250

@@ -247,14 +255,14 @@ impl ExerciseMutation {
247255
input: EditUserWorkoutInput,
248256
) -> Result<bool> {
249257
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
250-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
258+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
251259
service.edit_user_workout(user_id, input).await
252260
}
253261

254262
/// Delete a workout and remove all exercise associations.
255263
async fn delete_user_workout(&self, gql_ctx: &Context<'_>, workout_id: String) -> Result<bool> {
256264
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
257-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
265+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
258266
service.delete_user_workout(user_id, workout_id).await
259267
}
260268

@@ -265,7 +273,7 @@ impl ExerciseMutation {
265273
input: exercise::Model,
266274
) -> Result<String> {
267275
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
268-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
276+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
269277
service.create_custom_exercise(user_id, input).await
270278
}
271279

@@ -276,7 +284,7 @@ impl ExerciseMutation {
276284
input: EditCustomExerciseInput,
277285
) -> Result<bool> {
278286
let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
279-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
287+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
280288
service.edit_custom_exercise(user_id, input).await
281289
}
282290
}
@@ -288,8 +296,6 @@ pub struct ExerciseService {
288296
perform_application_job: MemoryStorage<ApplicationJob>,
289297
}
290298

291-
impl AuthProvider for ExerciseService {}
292-
293299
impl ExerciseService {
294300
pub fn new(
295301
db: &DatabaseConnection,
@@ -298,8 +304,8 @@ impl ExerciseService {
298304
perform_application_job: &MemoryStorage<ApplicationJob>,
299305
) -> Self {
300306
Self {
301-
db: db.clone(),
302307
config,
308+
db: db.clone(),
303309
file_storage_service,
304310
perform_application_job: perform_application_job.clone(),
305311
}

apps/backend/src/importer/mod.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -181,19 +181,27 @@ pub struct ImportResultResponse {
181181
#[derive(Default)]
182182
pub struct ImporterQuery;
183183

184+
impl AuthProvider for ImporterQuery {}
185+
184186
#[Object]
185187
impl ImporterQuery {
186188
/// Get all the import jobs deployed by the user.
187189
async fn import_reports(&self, gql_ctx: &Context<'_>) -> Result<Vec<import_report::Model>> {
188190
let service = gql_ctx.data_unchecked::<Arc<ImporterService>>();
189-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
191+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
190192
service.import_reports(user_id).await
191193
}
192194
}
193195

194196
#[derive(Default)]
195197
pub struct ImporterMutation;
196198

199+
impl AuthProvider for ImporterMutation {
200+
fn is_mutation(&self) -> bool {
201+
true
202+
}
203+
}
204+
197205
#[Object]
198206
impl ImporterMutation {
199207
/// Add job to import data from various sources.
@@ -203,7 +211,7 @@ impl ImporterMutation {
203211
input: DeployImportJobInput,
204212
) -> Result<bool> {
205213
let service = gql_ctx.data_unchecked::<Arc<ImporterService>>();
206-
let user_id = service.user_id_from_ctx(gql_ctx).await?;
214+
let user_id = self.user_id_from_ctx(gql_ctx).await?;
207215
service.deploy_import_job(user_id, input).await
208216
}
209217
}
@@ -214,8 +222,6 @@ pub struct ImporterService {
214222
timezone: Arc<chrono_tz::Tz>,
215223
}
216224

217-
impl AuthProvider for ImporterService {}
218-
219225
impl ImporterService {
220226
pub fn new(
221227
media_service: Arc<MiscellaneousService>,

apps/backend/src/jwt.rs

+2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ use anyhow::Result;
22
use chrono::{Duration, Utc};
33
use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, Validation};
44
use serde::{Deserialize, Serialize};
5+
use serde_with::skip_serializing_none;
56
use uuid::Uuid;
67

8+
#[skip_serializing_none]
79
#[derive(Debug, Deserialize, Serialize)]
810
pub struct Claims {
911
pub sub: String,

0 commit comments

Comments
 (0)