From d000f770985f06ee3001e06cee8170f043fe1503 Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Sat, 28 Feb 2026 14:22:33 +0000 Subject: [PATCH] cleanup --- .gitignore | 2 + contrib/Makefile | 37 ++++++ contrib/genApiController.sh | 8 -- contrib/genController.sh | 8 -- .../kestrel-pkg/etc/kestrel/webenv.template | 12 -- contrib/{yavsc.service => template.service} | 12 +- contrib/yavsc | 111 ------------------ .../Controllers/Blogspot/BlogApiController.cs | 6 - .../Blogspot/FileSystemApiController.cs | 3 +- src/Org/Extensions/HostingExtensions.cs | 18 +-- src/Org/Makefile | 24 +--- src/Org/Views/Home/About.cshtml | 54 +++------ src/Org/Views/_ViewImports.cshtml | 2 +- 13 files changed, 77 insertions(+), 220 deletions(-) create mode 100644 contrib/Makefile delete mode 100755 contrib/genApiController.sh delete mode 100755 contrib/genController.sh delete mode 100644 contrib/kestrel-pkg/etc/kestrel/webenv.template rename contrib/{yavsc.service => template.service} (51%) delete mode 100644 contrib/yavsc diff --git a/.gitignore b/.gitignore index 19b51779..a8491e0f 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,5 @@ builds/ /binaries/Debug/yavscd yavsc-pre +*.env +generated/ diff --git a/contrib/Makefile b/contrib/Makefile new file mode 100644 index 00000000..cbc00cc5 --- /dev/null +++ b/contrib/Makefile @@ -0,0 +1,37 @@ +APP_PROJECTS=src/Org/Org.csproj src/Api/Api.csproj +SLNDIR=.. + +generated/%.service: template.service %.env .env + envsubst < template.service > $@ + +copy-service-Org: $(DESTDIR)/etc/systemd/system/Org.service + +$(DESTDIR)/etc/systemd/system/%.service: generated/%.service + sudo cp $^ $@ + sudo systemctl daemon-reload + +build_publish: + for f in $(APP_PROJECTS); do \ + ASPNETCORE_ENV=$(CONFIGURATION) dotnet publish $(SLNDIR)/$$f ; \ + done + +rmep: build_publish + sudo systemctl stop yavsc-api + sudo systemctl stop yavsc-org + for f in Api Org; do + pushd $(SLNDIR)/src/$$prj + SOURCE_DIR=bin/$(CONFIGURATION)/$(DOTNET_FRAMEWORK)/publish/ + mv $(SOURCE_DIR)/appsettings.json $(SOURCE_DIR)/appsettings.new.json + sudo cp -a $(SOURCE_DIR)/* $(DESTDIR) + sudo chown -R $(USER_AND_GROUP) $(DESTDIR) + sudo sync + popd + done + sudo systemctl start yavsc-org + sudo systemctl start yavsc-api + +showConfig: + @echo CONFIGURATION: $(CONFIGURATION) + @echo DESTDIR: $(DESTDIR) + +reinstall: copy-service-Org copy-service-Api rmep diff --git a/contrib/genApiController.sh b/contrib/genApiController.sh deleted file mode 100755 index f5f80e3e..00000000 --- a/contrib/genApiController.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -dnx gen controller -async -outDir ApiControllers -api -dc ApplicationDbContext -m "$1" -name "$2ApiController" - -# dnx gen controller -outDir Controllers -dc ApplicationDbContext -udl -m {model} -name {name}Controller - - -# dnx gen controller -outDir Controllers -dc ApplicationDbContext -udl -m Yavsc.Models.Booking.MusicianSettings -name InstrumentationController -async -scripts diff --git a/contrib/genController.sh b/contrib/genController.sh deleted file mode 100755 index 4db37db9..00000000 --- a/contrib/genController.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -dnx gen controller -async -udl -outDir Controllers -dc ApplicationDbContext -m "$1" -name "$2Controller" - -# dnx gen controller -outDir Controllers -dc ApplicationDbContext -udl -m {model} -name {name}Controller - - -# dnx gen controller -outDir Controllers -dc ApplicationDbContext -udl -m Yavsc.Models.Booking.MusicianSettings -name InstrumentationController -async -scripts diff --git a/contrib/kestrel-pkg/etc/kestrel/webenv.template b/contrib/kestrel-pkg/etc/kestrel/webenv.template deleted file mode 100644 index 1aa05e5e..00000000 --- a/contrib/kestrel-pkg/etc/kestrel/webenv.template +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# Dnx command for this web app -NAME=[myWebAppName] - -# root path to the server assets -ROOT=[/srv/www/[myRootDir]] - -# relative path to the project source tree, -# from the above root path -PROJECT=[approot/src/[projectName]] - diff --git a/contrib/yavsc.service b/contrib/template.service similarity index 51% rename from contrib/yavsc.service rename to contrib/template.service index 21380320..75b458bc 100644 --- a/contrib/yavsc.service +++ b/contrib/template.service @@ -1,5 +1,5 @@ [Unit] -Description=Yavsc +Description=yavsc-$APP_NAME After=syslog.target After=network.target @@ -11,17 +11,17 @@ RestartSec=5s Type=simple User=www-data Group=www-data -WorkingDirectory=/srv/www/yavsc/ -ExecStart=/srv/www/yavsc/Yavsc +WorkingDirectory=$DESTDIR +ExecStart=$DESTDIR/$APP_NAME Restart=always -Environment="HOME=/srv/www/yavsc" +Environment="HOME=$DESTDIR" Environment="ASPNETCORE_ENVIRONMENT=Production" -Environment="ASPNETCORE_ConnectionStrings__DefaultConnection=YOUR Postgresql CONNECTION STRING" +Environment="ASPNETCORE_ConnectionStrings__YavscConnection=Server=$YAVSC_CONNECTION_HOST;Port=$YAVSC_CONNECTION_PORT;Database=$YAVSC_CONNECTION_DATABASE;Username=$YAVSC_CONNECTION_USERNAME;Password=$YAVSC_CONNECTION_PASSWORD;" CapabilityBoundingSet=CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_BIND_SERVICE StandardOutput=syslog StandardError=syslog -SyslogIdentifier=yavsc +SyslogIdentifier=$APP_NAME [Install] WantedBy=multi-user.target diff --git a/contrib/yavsc b/contrib/yavsc deleted file mode 100644 index aa31221c..00000000 --- a/contrib/yavsc +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/bash -### BEGIN INIT INFO -# Provides: yavsc -# Required-Start: $local_fs $network $named $time $syslog $postgresql -# Required-Stop: $local_fs $network $named $time $syslog $postgresql -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Description: Script to run yavsc -### END INIT INFO - -# Author: Ivan Derevianko aka druss -# Modified by: Paul Schneider - -. /lib/init/vars.sh -. /lib/lsb/init-functions - -NAME=yavsc - -PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin - -TMP_SAVE_runlevel_VAR=$runlevel -unset runlevel - -running() { - if [ -f $PIDFILE ] - then - PID=$(cat $PIDFILE) - if kill -0 $PID 2>/dev/null - then - return 0 - fi - fi - return 1 -} - - -export WWW_USER=www-data -export ROOT=/srv/www/${NAME} -export DESC="$NAME" -export PIDFILE=/var/run/kestrel-${NAME}.pid -export LOGDIR=/var/log -export DOTNET_CLI_HOME=$ROOT -export ASPDOTNETCORE_ENVIRONMENT=Production -export ASPDOTNETCORE_LOGLEVEL=Information -status() { - if running; - then - echo "Service running $DESC ($NAME; pid: $PID)" - else - echo "Service stopped $DESC ($NAME)" - fi - echo WWW_USER: $WWW_USER ROOT:$ROOT DESC: $DESC NAME: $NAME PIDFILE: $PIDFILE LOGDIR=$LOGDIR -} - - -start() { - if running; then - echo "Service already running $DESC" "$NAME" - log_end_msg 0 - else - cd $ROOT - sleep 4 - log_daemon_msg "Starting service $NAME for user $WWW_USER" - if ! start-stop-daemon -SbmCv -u $WWW_USER -p $PIDFILE -d $ROOT -g www-data -x yavsc > "${LOGDIR}/kestrel-${NAME}.log" - then - log_daemon_msg "Could not start $NAME : $?, see ${LOGDIR}/kestrel-${NAME}.log" - log_end_msg 2 - else - log_daemon_msg "Service $DESC started ($NAME), logs: ${LOGDIR}/kestrel-${NAME}.log" - log_end_msg 0 - fi - fi - -} - -stop() { - if running - then - log_daemon_msg "Stopping service $NAME" - start-stop-daemon -K -p "$PIDFILE" - log_daemon_msg "$DESC stopped" - log_end_msg 0 - else - log_daemon_msg "$DESC Service not running" - log_end_msg 1 - fi -} - - -case "$1" in - start) - start - ;; - stop) - stop - ;; - restart) - stop - start - ;; - status) - status - ;; - - *) - echo "Usage: $0 {start|stop|restart}" -esac - -export runlevel=$TMP_SAVE_runlevel_VAR - - diff --git a/src/Api/Controllers/Blogspot/BlogApiController.cs b/src/Api/Controllers/Blogspot/BlogApiController.cs index b08ff9cc..1a45f9ac 100644 --- a/src/Api/Controllers/Blogspot/BlogApiController.cs +++ b/src/Api/Controllers/Blogspot/BlogApiController.cs @@ -1,11 +1,5 @@ -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; -using Yavsc.Helpers; using Yavsc.Models; using Yavsc.Models.Blog; using Yavsc.Server.Helpers; diff --git a/src/Api/Controllers/Blogspot/FileSystemApiController.cs b/src/Api/Controllers/Blogspot/FileSystemApiController.cs index f91b9e6e..7896efc2 100644 --- a/src/Api/Controllers/Blogspot/FileSystemApiController.cs +++ b/src/Api/Controllers/Blogspot/FileSystemApiController.cs @@ -61,7 +61,8 @@ namespace Yavsc.ApiControllers } catch (InvalidPathException ex) { pathex = ex; } - if (pathex!=null) { + if (pathex!=null) + { _logger.LogError($"invalid sub path: '{subdir}'."); return BadRequest(pathex); } diff --git a/src/Org/Extensions/HostingExtensions.cs b/src/Org/Extensions/HostingExtensions.cs index 02a22511..d9f59db2 100644 --- a/src/Org/Extensions/HostingExtensions.cs +++ b/src/Org/Extensions/HostingExtensions.cs @@ -282,9 +282,6 @@ public static class HostingExtensions .AddClientStore() .AddCorsPolicyService() .AddResourceStore() - //.AddInMemoryIdentityResources(Config.IdentityResources) - //.AddInMemoryClients(Config.TestingClients) - //.AddInMemoryApiScopes(Config.TestingApiScopes) .AddConfigurationStore(options => { options.ConfigureDbContext = b => b.UseNpgsql(connectionString, @@ -402,13 +399,20 @@ public static class HostingExtensions { using (var serviceScope = app.ApplicationServices.GetRequiredService().CreateScope()) { - serviceScope.ServiceProvider.GetRequiredService().Database.Migrate(); - - var context = serviceScope.ServiceProvider.GetRequiredService(); try { - context.Database.Migrate(); + foreach (Type contextType in new Type[] + { + typeof(PersistedGrantDbContext), + typeof(ConfigurationDbContext), + typeof(ApplicationDbContext) + }) + { + ((DbContext)serviceScope.ServiceProvider + .GetRequiredService(contextType)) + .Database.Migrate(); + } } catch (InvalidOperationException ex) { diff --git a/src/Org/Makefile b/src/Org/Makefile index aeff3eb8..42b6a44f 100644 --- a/src/Org/Makefile +++ b/src/Org/Makefile @@ -1,30 +1,8 @@ -DESTDIR=/srv/www/yavsc -CONFIGURATION=Release -USER_AND_GROUP=www-data:www-data -SERVICE_PROD=yavsc -DOTNET_FRAMEWORK=net9.0 + all: css js dotnet build -showConfig: - @echo CONFIGURATION: $(CONFIGURATION) - @echo DESTDIR: $(DESTDIR) - @echo SERVICE_PROD: $(SERVICE_PROD) - -publish: - ASPNETCORE_ENV=$(CONFIGURATION) dotnet publish - -install_service: - sudo cp ../../contrib/yavsc.service /etc/systemd/system - sudo systemctl enable yavsc - -pushInProd: publish - sudo systemctl stop $(SERVICE_PROD) - sudo cp -a bin/$(CONFIGURATION)/$(DOTNET_FRAMEWORK)/publish/* $(DESTDIR) - sudo chown -R $(USER_AND_GROUP) $(DESTDIR) - sudo sync - sudo systemctl start $(SERVICE_PROD) %.css: %.scss scss $^ > $@ diff --git a/src/Org/Views/Home/About.cshtml b/src/Org/Views/Home/About.cshtml index c288fb44..dbde9bc5 100755 --- a/src/Org/Views/Home/About.cshtml +++ b/src/Org/Views/Home/About.cshtml @@ -7,32 +7,25 @@ == L'objectif -Cette application est construite pour mettre en relation des artistes -du domaine musical avec leur public. +Cette application est construite pour mettre en relation des artistes du domaine musical avec leur public. == Le fonctionnement Les utilisateurs du site sont soit artiste, soit client, soit administrateur. ils ont tous droit à leur blog. Pour les artistes, c'est un moyen de promouvoir leur activité. Ils peuvent y publier des articles, truffés de vidéos et photos. -Pour les clients, c'est un moyen de casser la glace avec leurs idoles, -par la description détaillées de leur centres d'intérêts. +Pour les clients, c'est un moyen de casser la glace avec leurs idoles, par la description détaillées de leur centres d'intérêts. -L'application propulse aussi une messagerie instantanée, disponible depuis -un navigateur Web ou depuis l'appplication mobile, -pouvant garantir la preservation du secret sur toute information personnelle, -du client comme du prestataire. +L'application propulse aussi une messagerie instantanée, disponible depuis un navigateur Web ou depuis l'appplication mobile, +pouvant garantir la preservation du secret sur toute information personnelle, du client comme du prestataire. Puis viennent (ou pas) une prise commande, un payement du client, la prestation, une collecte du retour du client, et un paiement du prestataire de services. -Ni le client ni le prestataire ne sont anonymes pour l'applications, -il sont même formellement authentifies par l'acquitement d'une première +Ni le client ni le prestataire ne sont anonymes pour l'applications, il sont même formellement authentifies par l'acquitement d'une première facturation en ligne, ou à l'occasion de la saisie de leur profil proféssionnel. -Durant la phase de construction d'un contrat de prestation, -le client et l'artiste peuvent profiter d'un canal de communication privé et anonyme, -qui est fermé à la validation définitive du dit contrat. +Durant la phase de construction d'un contrat de prestation, le client et l'artiste peuvent profiter d'un canal de communication privé et anonyme, qui est fermé à la validation définitive du dit contrat. Valider un contrat, c'est: @@ -41,50 +34,37 @@ Valider un contrat, c'est: * Le faire signer des deux parties * Mettre en œuvre d'éventuels paiement d'arrhes -Une fois validé, le contrat est publié à destination des deux parties. la facture est publiée à destination du client, -qui peut l'honorer auprès du système, auquel cas ce client est marqué solvable, et le contrat est marqué approvisionné. +Une fois validé, le contrat est publié à destination des deux parties. la facture est publiée à destination du client, qui peut l'honorer auprès du système, auquel cas ce client est marqué solvable, et le contrat est marqué approvisionné. -En cas de défaut d'approvisionnement, le système prendra soin de marquer le contrat comme provisoire, et de prévenir l'artiste -d'effectuer toute prestation en relation tant le paiement associé laisse à douter. +En cas de défaut d'approvisionnement, le système prendra soin de marquer le contrat comme provisoire, et de prévenir l'artiste d'effectuer toute prestation en relation tant le paiement associé laisse à douter. Une fois sa prestation associée exécutée, les paiements relatifs sont effectués auprès de l'artiste. -Pour un contrat exécuté et non honoré par le client, le processus de poursuite en recouvrement est engagé, sinon, le contrat est archivé, -des attestations de paiement sont disponibles pour l'artiste et la facture est marquée payée, puis repostée au client. +Pour un contrat exécuté et non honoré par le client, le processus de poursuite en recouvrement est engagé, sinon, le contrat est archivé, des attestations de paiement sont disponibles pour l'artiste et la facture est marquée payée, puis repostée au client. === Pour l'artiste L'artiste choisit plusieurs paramètres qui vont faire son profil : -* Le type d'activités qu'il veut promouvoir, le type de prestations qu'il fournit (est-ce un DJ, - un chanteur solo, un musicien solo, un ensemble musical classique, un groupe) -* La tarification de sa mise en contact avec un nouveau client - (combien je reçois par demande client traitée sans lourdeur de plus d'une journée) +* Le type d'activités qu'il veut promouvoir, le type de prestations qu'il fournit (est-ce un DJ, un chanteur solo, un musicien solo, un ensemble musical classique, un groupe) +* La tarification de sa mise en contact avec un nouveau client (combien je reçois par demande client traitée sans lourdeur de plus d'une journée) * Le lieu où il exerce et, le cas échéant, sur combien de distance il pourrait se déplacer. -* un agenda Google optionnel, à consulter pour établir sa disponibilité -* Des paramètres supplémentaires en fonctions de son type d'activité par exemple, pour - les ensembles, leur taille, le cas échéant, leur répertoire ou des indications sur le style de leur musique) +* Un agenda Google optionnel, à consulter pour établir sa disponibilité +* Des paramètres supplémentaires en fonctions de son type d'activité par exemple, pour les ensembles, leur taille, le cas échéant, leur répertoire ou des indications sur le style de leur musique) === Pour le client -Il choisit un lieu et une date pour déclarer un événement avenir -(il peut bien-sûr en programmer autant qu'il le veut). +Il choisit un lieu et une date pour déclarer un événement avenir (il peut bien-sûr en programmer autant qu'il le veut). -Il peut, parcourir les publications des artistes, et entamer, -sur la base d'un de ses projets événementiel, la négociation d'un contrat de prestation. +Il peut, parcourir les publications des artistes, et entamer, sur la base d'un de ses projets événementiel, la négociation d'un contrat de prestation. Il a accès à la connaissance des journées connues comme libres des artistes par le système. == La confidentialité -À aucun moment, aucune adresse postale, aucune adresse e-mail ni aucun numéro de téléphone -ne sont transmis ni aux clients, ni aux artistes. Seul le système a accès à ces informations. +À aucun moment, aucune adresse postale, aucune adresse e-mail ni aucun numéro de téléphone ne sont transmis ni aux clients, ni aux artistes. Seul le système a accès à ces informations. De plus, le droit de retrait est permanent et sa mise en oeuvre immédiate. -Les artistes comme les clients peuvent demander leur désinscription, -qui désactive immédiatement les publications associées à leurs informations, -et programme la suppression complète de ces dites informations dans les quinze jours -à compter de la demande, sauf demande contradictoire. +Les artistes comme les clients peuvent demander leur désinscription, qui désactive immédiatement les publications associées à leurs informations, et programme la suppression complète de ces dites informations dans les quinze jours à compter de la demande, sauf demande contradictoire. L'opération est annulable, jusqu'à deux semaines après sa programmation. -

@Model

diff --git a/src/Org/Views/_ViewImports.cshtml b/src/Org/Views/_ViewImports.cshtml index 0904ddaa..24251229 100755 --- a/src/Org/Views/_ViewImports.cshtml +++ b/src/Org/Views/_ViewImports.cshtml @@ -34,7 +34,7 @@ @using IdentityServer8.EntityFramework.Entities; @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers -@addTagHelper *, Yavsc +@addTagHelper *, Org @inject IAuthorizationService AuthorizationService