migration applied

dotnet-7.0
Paul Schneider 2 years ago
parent ff2a72f112
commit efcb1620d6
41 changed files with 13882 additions and 913 deletions

@ -7,21 +7,21 @@ namespace Yavsc
public string Title { get; set; }
public string Slogan { get; set; }
public string StyleSheet { get; set; }
public string FavIcon { get; set; }
public string Logo { get; set; }
public string StyleSheet { get; set; }
public string FavIcon { get; set; }
public string Logo { get; set; }
/// <summary>
/// Conceptually,
/// This authorisation server only has this present site as unique audience.
/// </summary>
/// <returns></returns>
public string Audience { get; set; }
public string Audience { get; set; }
/// <summary>
/// it's a very small company, with one domaine name only,
/// so let it be the same as in the Audience field.
/// </summary>
/// <returns></returns>
public string Authority { get; set; }
public string Authority { get; set; }
/// <summary>
/// Owner's email
/// </summary>
@ -34,16 +34,16 @@ namespace Yavsc
public Contact Admin { get; set; }
public string DataDir { get; set; }
public string Avatars { get; set; }
public long Quota { get; set; }
public string Blog { get; set; }
public string Bills { get; set; }
public string Avatars { get; set; } = "avatars";
public long Quota { get; set; }
public string Blog { get; set; } = "blogs";
public string Bills { get; set; } = "bills";
public string GitRepository { get; set; } = "sources";
public string BusinessName { get; set; }
public string Street { get; set; }
public string PostalCode { get; set; }
public string CountryCode { get; set; }
public string BusinessName { get; set; }
public string Street { get; set; }
public string PostalCode { get; set; }
public string CountryCode { get; set; }
public string HomeViewName { get; set; }
/// <summary>
@ -51,7 +51,7 @@ namespace Yavsc
/// generated pdf files using pandoc
/// </summary>
/// <returns>The temporary directory to use</returns>
public string TempDir { get; set; } = "Temp";
public string TempDir { get; set; } = "temp";
/// <summary>
/// Only one performer will capture payments

@ -1,31 +1,132 @@
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Yavsc.Models;
using Yavsc.Helpers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Localization;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.Extensions.Options;
namespace Yavsc.Controllers;
public class HomeController : Controller
namespace Yavsc.Controllers
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
[AllowAnonymous]
public class HomeController : Controller
{
_logger = logger;
}
readonly ApplicationDbContext _dbContext;
public IActionResult Index()
{
return View();
}
readonly IHtmlLocalizer _localizer;
public IActionResult Privacy()
{
return View();
}
private SiteSettings siteSettings;
public HomeController(ILogger<HomeController> logger,
IHtmlLocalizer<Startup> localizer,
ApplicationDbContext context,
IOptions<SiteSettings> settingsOptions)
{
_localizer = localizer;
_dbContext = context;
siteSettings = settingsOptions.Value;
}
public async Task<IActionResult> Index(string id)
{
ViewBag.IsFromSecureProx = Request.Headers.ContainsKey(Constants.SshHeaderKey) && Request.Headers[Constants.SshHeaderKey] == "on";
ViewBag.SecureHomeUrl = "https://" + Request.Headers["X-Forwarded-Host"];
ViewBag.SshHeaderKey = Request.Headers[Constants.SshHeaderKey];
var uid = User.GetUserId();
long[] clicked = null;
if (uid == null)
{
await HttpContext.Session.LoadAsync();
var strclicked = HttpContext.Session.GetString("clicked");
if (strclicked != null) clicked = strclicked.Split(':').Select(c => long.Parse(c)).ToArray();
if (clicked == null) clicked = new long[0];
}
else clicked = _dbContext.DimissClicked.Where(d => d.UserId == uid).Select(d => d.NotificationId).ToArray();
var notes = _dbContext.Notification.Where(
n => !clicked.Contains(n.Id)
);
if (notes.Any()) this.Notify(notes);
ViewData["HaircutCommandCount"] = _dbContext.HairCutQueries.Where(
q => q.ClientId == uid && q.Status < QueryStatus.Failed
).Count();
var toShow = _dbContext.Activities
.Include(a => a.Forms)
.Include(a => a.Parent)
.Include(a => a.Children)
.Where(a => !a.Hidden)
.Where(a => a.ParentCode == id)
.OrderByDescending(a => a.Rate).ToList();
foreach (var a in toShow)
{
a.Children = a.Children.Where(c => !c.Hidden).ToList();
}
return View(toShow);
}
public async Task<IActionResult> About()
{
FileInfo fi = new FileInfo("wwwroot/version");
return View("About", fi.Exists ? _localizer["Version logicielle: "] + await fi.OpenText().ReadToEndAsync() : _localizer["Aucune information sur la version logicielle n'est publiée."]);
}
public IActionResult Privacy()
{
return View();
}
public IActionResult AboutMarkdown()
{
return View();
}
public IActionResult Contact()
{
return View();
}
public IActionResult Dash()
{
return View();
}
public ActionResult Chat()
{
if (User.Identity.IsAuthenticated)
{
ViewBag.IsAuthenticated = true;
string uid = User.GetUserId();
ViewBag.Contacts = _dbContext.Contact.Where(c => c.OwnerId == uid)
;
}
else ViewBag.IsAuthenticated = false;
return View();
}
public IActionResult Error()
{
var feature = this.HttpContext.Features.Get<IExceptionHandlerFeature>();
return View("~/Views/Shared/Error.cshtml", feature?.Error);
}
public IActionResult Status(int id)
{
ViewBag.StatusCode = id;
return View("~/Views/Shared/Status.cshtml");
}
public IActionResult Todo()
{
User.GetUserId();
return View();
}
public IActionResult VideoChat()
{
return View();
}
public IActionResult Audio()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}

@ -0,0 +1,31 @@
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Yavsc.Models;
namespace Yavsc.Controllers;
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
return View();
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}

@ -16,7 +16,8 @@ namespace Yavsc.Helpers
var notifs = SetupNotificationList(controller);
notifs.Add(new Notification { title = title, body = body });
}
public static void Notify(this Controller controller, IEnumerable<Notification> notes)
public static void Notify(this Controller controller, IEnumerable<Notification> notes)
{
var notifs = SetupNotificationList(controller);
notifs.AddRange(notes);

@ -99,7 +99,7 @@ namespace Yavsc.Migrations
column: x => x.PaymentId,
principalTable: "PayPalPayment",
principalColumn: "CreationToken",
onDelete: ReferentialAction.Restrict);
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_Project_PerformerProfile_PerformerId",
column: x => x.PerformerId,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -75,6 +75,8 @@ namespace Yavsc.Models
if (et.ClrType.GetInterface("IBaseTrackedEntity") != null)
et.FindProperty("DateCreated").SetAfterSaveBehavior(Microsoft.EntityFrameworkCore.Metadata.PropertySaveBehavior.Ignore);
}
builder.Entity<Activity>().Property(a=>a.ParentCode).IsRequired(false);
}
// this is not a failback procedure.

@ -3,7 +3,7 @@ using Microsoft.AspNetCore;
namespace Yavsc
{
public class Program
public class Program
{
public static void Main(string[] args)
{

@ -8,20 +8,18 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.Net.Http.Headers;
using Newtonsoft.Json;
using System.Net;
using Google.Apis.Util.Store;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Localization;
using Yavsc.Helpers;
using static System.Environment;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Yavsc.Models;
using Yavsc.Services;
using Microsoft.IdentityModel.Tokens;
namespace Yavsc
{
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Models;
using Services;
public partial class Startup
{
@ -50,15 +48,16 @@ namespace Yavsc
HostingFullName = $"{env.EnvironmentName} [{prodtag}/{devtag}/{stagetag}]";
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.AddEnvironmentVariables()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
builder.AddEnvironmentVariables();
Configuration = builder.Build();
var auth = Configuration["Site:Authority"];
var cxstr = Configuration["ConnectionStrings:Default"];
ConnectionString = cxstr;
AppDomain.CurrentDomain.SetData(Constants.YavscConnectionStringEnvName, ConnectionString);
@ -185,6 +184,15 @@ namespace Yavsc
options.AddPolicy("Authenticated", policy => policy.RequireAuthenticatedUser());
});
services.AddAuthentication("Bearer").AddJwtBearer("Bearer", options =>
{
options.Authority = siteSettings.GetValue<string>("ExternalUrl");
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false
};
});
/* FIXME services.AddSingleton<IAuthorizationHandler, HasBadgeHandler>();
services.AddSingleton<IAuthorizationHandler, HasTemporaryPassHandler>();
services.AddSingleton<IAuthorizationHandler, BlogEditHandler>();
@ -201,13 +209,14 @@ namespace Yavsc
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
/* var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
config.Filters.Add(new AuthorizeFilter(policy)); */
config.Filters.Add(new ProducesAttribute("application/json"));
// config.ModelBinders.Insert(0,new MyDateTimeModelBinder());
// config.ModelBinders.Insert(0,new MyDecimalModelBinder());
config.EnableEndpointRouting = false;
}).AddFormatterMappings(
config => config.SetMediaTypeMappingForFormat("text/pdf",
new MediaTypeHeaderValue("text/pdf"))
@ -298,7 +307,7 @@ namespace Yavsc
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
.CreateScope())
{
serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>()
.Database.Migrate();
}
}
@ -328,14 +337,13 @@ namespace Yavsc
ConfigureWebSocketsApp(app);
_logger.LogInformation("LocalApplicationData: " + Environment.GetFolderPath(SpecialFolder.LocalApplicationData, SpecialFolderOption.DoNotVerify));
_logger.LogInformation("LocalApplicationData: " + Environment.GetFolderPath(
Environment.SpecialFolder.LocalApplicationData, Environment.SpecialFolderOption.DoNotVerify));
CheckApp(env, loggerFactory);
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chat");
});
app.UseStatusCodePages().UseStaticFiles().UseAuthentication();
app.UseMvcWithDefaultRoute();
}
}

@ -0,0 +1,159 @@
@{
ViewData["Title"] = "About ";
}
<h1>@ViewData["Title"]</h1>
<environment names="Development">
**Version de Development**
<markdown>
## L'objectif
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.
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
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.
Valider un contrat, c'est:
* Choisir le type de contrat
* Se mettre d'accord sur les paramètres du contrat
* 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é.
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 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 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)
### 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 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.
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.
L'opération est annulable, jusqu'à deux semaines après sa programmation.
</markdown>
</environment>
<environment names="Lua,Development">
<markdown>
C'est mon site pérso, une configuration de _Yavsc_ (encore une autre très petite entreprise).
* [README](https://github.com/pazof/yavsc/blob/vnext/README.md)
* [license: GNU GPL v3](https://github.com/pazof/yavsc/blob/vnext/LICENSE)
</markdown>
</environment>
<environment names="Yavsc,Development">
<markdown>
Yet Another Very Small Company ...
* [README](https://github.com/pazof/yavsc/blob/vnext/README.md)
* [license: GNU FPL v3](https://github.com/pazof/yavsc/blob/vnext/LICENSE)
</markdown>
</environment>
<environment names="YavscPre,Development">
<markdown>
## Yet Another Very Small Company :
* [README](https://github.com/pazof/yavsc/blob/vnext/README.md)
* [license: GNU FPL v3](https://github.com/pazof/yavsc/blob/vnext/LICENSE)
En production:
* [Lua](http://pschneider.fr:85)
* [Yavsc](http://pschneider.fr:84)
</markdown>
</environment>
<environment names="coiffure,Development">
<markdown>
Vous êtes sur le site de commande en coiffure à domicile de Soraya Boudjouraf,
un as de la coiffure, qui oeuvre en région parisienne.
En validant un formulaire de commande ici, c'est à elle que vous notifiez votre demande.
Vous pouvez ![lui laisser votre numéro de téléphone](/HairCutCommand/HairCut?activityCode=Brush&performerId=1bd841ab-c305-4971-940d-7ddca818310c)
et/ou des détails sur votre demande,
elle vous rappelera.</markdown>
</environment>
<environment names="Development">
<markdown>
## Ceci est un site de développement.
Cette présente ressource ne concerne que le développement du logiciel qui la met en oeuvre.
Elle est éphémère, et pratiquement en permanence force de codes 500.
Veuillez excuser l'équipe de développement pour vous avoir fait part de cette adresse et pour la gêne occasionnnée.
La "pré-production" affiche les sites suivants:
* [Lua](https://pschneider.fr:85)
* [Yavsc](https://pschneider.fr:84)
</markdown>
</environment>
<p>
@Model
</p>

@ -0,0 +1,163 @@
@{
ViewData["Title"] = "About";
}
<h1>@ViewData["Title"]</h1>
<environment names="freefield,Development">
<markdown>
## O objetivo
Esta aplicação é construída para conectar artistas
do campo musical com seu público.
## Operation
Os usuários do site são artista, cliente ou administrador. Todos eles têm direito ao seu blog.
Para artistas, é uma maneira de promover seus negócios.
Eles podem publicar artigos, cheios de vídeos e fotos.
Para os clientes, é uma maneira de quebrar o gelo com seus ídolos,
pela descrição detalhada de seus centros de interesse.
O aplicativo também alimenta um mensageiro instantâneo, disponível desde
um navegador da web ou de um aplicativo para dispositivos móveis
pode garantir a preservação do sigilo sobre qualquer informação pessoal,
cliente e provedor.
Então venha (ou não) um pedido, um pagamento do cliente,
a entrega, uma coleta do retorno do cliente e um pagamento do provedor de serviços.
Nem o cliente nem o provedor são anônimos para os aplicativos,
eles são até formalmente autenticados pela aquisição de um primeiro
faturamento on-line ou ao entrar em seu perfil profissional.
Durante a fase de construção de um contrato de serviço,
o cliente e o artista podem se beneficiar de um canal de comunicação privado e anônimo,
que está fechado para a validação final do referido contrato.
Valide um contrato é:
* Escolha o tipo de contrato
* Concordo com os parâmetros do contrato
* Faça ambas as partes assinarem
* Implementar qualquer adiantamento
Uma vez validado, o contrato é publicado para ambas as partes. a fatura é publicada para o cliente,
quem pode homenageá-lo ao sistema, caso em que esse cliente recebe uma pontuação de solvente e o contrato é marcado como provisionado.
Em caso de falta de fornecimento, o sistema terá o cuidado de marcar o contrato como provisório, e avisar o artista
para executar qualquer serviço relacionado, pois o pagamento associado deixa dúvidas.
Depois que o serviço associado tiver sido executado, os pagamentos relativos serão feitos ao artista.
Para um contrato executado e não honrado pelo cliente, o processo de processo de recuperação é contratado, caso contrário, o contrato é arquivado,
Os certificados de pagamento estão disponíveis para o artista e a fatura é marcada como paga e depois repassada ao cliente.
### Para o artista
O artista escolhe vários parâmetros que farão o seu perfil:
* O tipo de atividades que ele quer promover, o tipo de serviços que ele oferece (é um DJ,
um cantor solo, um músico solo, um conjunto musical clássico, uma banda)
* O preço de seu contato com um novo cliente
(quanto recebo por solicitação de cliente processada sem peso de mais de um dia)
* O lugar onde ele pratica e, se sim, até onde ele pode se mover.
* um calendário opcional do Google, para consultar para estabelecer sua disponibilidade
* Parâmetros adicionais dependendo do tipo de atividade, por exemplo, para
conjuntos, seu tamanho, se houver, seu repertório ou indicações do estilo de sua música)
### Para o cliente
Ele escolhe um lugar e uma data para declarar um evento futuro
(Ele pode programar o quanto quiser).
Ele pode, navegar pelas publicações dos artistas e começar,
com base em um de seus projetos de eventos, a negociação de um contrato de serviço.
Ele tem acesso ao conhecimento de dias conhecidos como artistas livres pelo sistema.
## Confidencialidade
Em nenhum momento, nenhum endereço de correspondência, nenhum endereço de e-mail e nenhum número de telefone
não são transmitidos para clientes ou artistas. Apenas o sistema tem acesso a essas informações.
Além disso, o direito de retirada é permanente e sua implementação imediata.
Artistas e clientes podem solicitar sua desinscrição,
que imediatamente desativa as publicações associadas às suas informações,
e planeia a eliminação completa desta informação no prazo de quinze dias
do aplicativo, a menos que seja um pedido contraditório.
A operação é anulável até duas semanas após a sua programação.
</markdown>
</environment>
<environment names="Lua,Development">
<markdown>Este é o meu site perso, uma configuração de _Yavsc_ (outro negócio muito pequeno).
* [README](https://github.com/pazof/yavsc/blob/vnext/README.md)
* [licença: GNU GPL v3](https://github.com/pazof/yavsc/blob/vnext/LICENSE)
Outras instalações:
</markdown>
<markdown>
* [Coiffure](http://coiffure.pschneider.fr)
* [ZicMoove](http://linkmuse.pschneider.fr)
* [Yavsc](http://yavsc.pschneider.fr)
</markdown>
</environment>
<environment names="Yavsc">
<markdown>
Yet Another Very Small Company ...
* [README](https://github.com/pazof/yavsc/blob/vnext/README.md)
* [license: GNU FPL v3](https://github.com/pazof/yavsc/blob/vnext/LICENSE)
</markdown>
</environment>
<environment names="YavscPre">
<markdown>
## Yet Another Very Small Company :
* [README](https://github.com/pazof/yavsc/blob/vnext/README.md)
* [license: GNU FPL v3](https://github.com/pazof/yavsc/blob/vnext/LICENSE)
En production:
* [Lua](http://pschneider.fr:85)
* [Yavsc](http://pschneider.fr:84)
</markdown>
</environment>
<environment names="coiffure">
<markdown>
Você está no site da ordem em cabeleireiro em casa de Soraya Boudjouraf,
um ás de cabeleireiro, que trabalha na região de Paris.
Ao validar um formulário de pedido aqui, é para ela que você notifica sua solicitação.
Você pode [Deixe-lhe o seu número de telefone] (/ HairCutCommand / HairCut? ActivityCode = Brush & performerId = 1bd841ab-c305-4971-940d-7ddca818310c)
e / ou detalhes sobre o seu pedido,
ela vai ligar de volta.</markdown>
</environment>
<environment names="Development">
<markdown>
## Este é um site de desenvolvimento.
Este recurso só diz respeito ao desenvolvimento do software que o implementa.
É efêmero e praticamente constantemente força 500 códigos.
Por favor, desculpe a equipe de desenvolvimento para informá-lo sobre este endereço e pelo inconveniente.
A "pré-produção" exibe os seguintes sites:
* [Yavsc](https://yavsc.pschneider.fr)
* [Lua](https://lua.pschneider.fr)
</markdown>
</environment>
<p>
@Model
</p>

@ -0,0 +1,38 @@
@{
ViewData["Title"] = "À propos des restrictions d'accès";
}
<h1>@ViewData["Title"]</h1>
<markdown>
# Blog et fichiers utilisateurs
Par défaut, un envoi à destination du serveur est privé, visible seulement pour son possesseur (et l'administration).
L'utilisateur peu publier chacun de ces derniers à l'adresse :
* de tout le monde,
* ou d'une liste de cercles d'utilisateurs,
* ou de personne
Quand il s'agit d'un fichier, son adresse permanente relative à la racine du serveur web est: `/UserFiles/(Nom Utilisateur)/(cheminVersLeFichier)`
Les restrictions d'accès à ce fichier sont celles associées à tous les fichiers du même dossier.
Il n'y a pas de regle assiciée à chaque fichier individuellement,
elles appartiennent au dossier qui les contient.
Les billet de blog sont regroupés par utilisateur, à l'Url
/Blog/(Nom d'Utilisateur)
Ils sont aussi regroupés par titre :
/Title/(Titre de post)
Et ils possèdent une addresse permanente de la forme :
/Blogspot/Details/(Id Numerique De Post)
</markdown>

@ -0,0 +1,19 @@
@{
ViewData["Title"] = "À propos de Markdown";
}
<h1>@ViewData["Title"]</h1>
<markdown>
Quelques extensions à un Markdown de base :
* les video et audio: `![video: Ep. 28 - La France en commun - Une invitation à écrire un nouveau projet d'émancipation humaine](/images/testVideo.mp4)`
![video: Ep. 28 - La France en commun - Une invitation à écrire un nouveau projet d'émancipation humaine](/images/testVideo.mp4)
à faire:
* le tag "Numéro de ticket": "Ticket#6854"
* le tag "Titre d'article": "#1_great_title"
* le tag "User" = "@@(John Doe)" ou "@@jdoe"
</markdown>

@ -0,0 +1,9 @@
@{
ViewData["Title"] = "Page d'accueil";
}
@section scripts {
<script src="~/js/str.js">
</script>
}

@ -0,0 +1,10 @@
@Model BasketView
<ul>
<li>
<a asp-controller="HaircutCommand" asp-action="Index">
@Model.HairCutActiveQueryCount </a>
</li>
</ul>

@ -0,0 +1,13 @@
@{
ViewData["Title"] = "Conditions Générales de Vente";
}
<h2>@ViewData["Title"]</h2>
<markdown>
Le paiement intervient à la commande, quelque soit la date d'intervention.
Vous pouvez annuler votre commande depuis la [liste de vos commande en cours](/HairCutCommand/),
Vous pouvez demander le remboursement d'un paiement, dans le cadre d'une réclamation sur l'execution
de votre commande, en nous contactant via courrier éléctronique ou postal, [que vour retrouverez sur la page de contact](/Home/Contact), votre demande sera rapidement traitée.
</markdown>

@ -0,0 +1,22 @@
@{ ViewBag.Title = "Chat"; }
<h2>@ViewBag.Title</h2>
<label><input type="checkbox" id="mute" />Muet</label>
<div class="container disabled panel" id="chatview" data="fullchatview"
data-chans="yavsc" data-mutectl="mute" ></div>
@section scripts {
<!--Reference the autogenerated SignalR hub script. -->
<script src="~/api/signalr/hubs"></script>
<!-- SignalR script to update the chat page and send messages.-->
@if (!ViewBag.IsAuthenticated) { // Get the user name and store it to prepend to messages.
<script>
// var uname = prompt('Entrez votre nom:', '');
</script>
}
<script src="~/js/chat.js"></script>
}

@ -0,0 +1,17 @@
@{
ViewData["Title"] = "Contact";
}
<h2>@ViewData["Title"].</h2>
<h3>@ViewData["Message"]</h3>
<address>
Paul Schneider<br>
2 Boulevard Aristide Briand -
92150 Suresnes (France)
<abbr title="Phone">P:</abbr> +33 6 51 14 15 64
</address>
<address>
<strong>Support:</strong> <a href="mailto:contact@pschneider.fr">contact@pschneider.fr</a><br />
<strong>Marketing:</strong> <a href="mailto:paul@pschneider.fr">paul@pschneider.fr</a>
</address>

@ -0,0 +1,19 @@
@{
ViewData["Title"] = "Dash";
}
<div>
<video id="videoPlayer" controls></video>
</div>
@section scripts {
<script src="~/js/dash.all.min.js"></script>
<script>
(function(){
var url = "https://dash.akamaized.net/envivio/EnvivioDash3/manifest.mpd";
var player = dashjs.MediaPlayer().create();
player.initialize(document.querySelector("#videoPlayer"), url, true);
})();
</script>
}

@ -0,0 +1,8 @@
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

@ -0,0 +1,6 @@
@{
ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>
<p>Use this page to detail your site's privacy policy.</p>

@ -0,0 +1,17 @@
@{
ViewData["Title"] = "Todo (first)";
}
<h1>@ViewData["Title"]</h1>
<em>Linkmuse(trox)</em>
<markdown>
Les tags.
La librairie, les lives.
</markdown>
@{
ViewData["Title"] = "TODO";
}
<h1>@ViewData["Title"]</h1>
<em>Faster, stronger, shorter</em>
<markdown>
</markdown>

@ -0,0 +1,76 @@
@{ ViewBag.Title = "video Chat"; }
<input type="file" accept="video/*;capture=camcorder" id="cam">
<!-- <input type="file" accept="image/*;capture=camera" >
<input type="file" accept="audio/*;capture=microphone"> -->
<video autoplay id="localvideo">
</video>
@section scripts
{
<script>
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function (e) {
$('#localvideo').attr('src', e.target.result);
}
reader.readAsDataURL(input.files[0]);
}
}
$("#cam").change(function(){
readURL(this);
});
var errorCallback = function(e) {
console.log('Reeeejected!', e);
};
navigator.getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mediaDevices.getUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia;
// Not showing vendor prefixes.
navigator.mediaDevices.getUserMedia({video: true, audio: true},
function(localMediaStream) {
var video = document.querySelector('video');
video.src = window.URL.createObjectURL(localMediaStream);
// Note: onloadedmetadata doesn't fire in Chrome when using it with getUserMedia.
// See crbug.com/110938.
video.onloadedmetadata = function(e) {
// Ready to go. Do some stuff.
};
}, errorCallback);
if (navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({audio: true, video: false}, function(stream) {
if ("srcObject" in video) {
video.srcObject = "stream";
} else {
// Avoid using this in new browsers, as it is going away.
video.src = window.URL.createObjectURL(stream);
}
}, errorCallback);
} else {
video.src = $("#cam").attr('src'); // fallback.
}
$(document).ready(
function () {
}
);
</script>
}

@ -1,5 +1,5 @@
@{
ViewData["Title"] = "About ";
ViewData["Title"] = @SR["About"]+" "+@SiteSettings.Value.Title;
}
<h1>@ViewData["Title"]</h1>
<environment names="Development">
@ -98,6 +98,10 @@ C'est mon site pérso, une configuration de _Yavsc_ (encore une autre très peti
* [README](https://github.com/pazof/yavsc/blob/vnext/README.md)
* [license: GNU GPL v3](https://github.com/pazof/yavsc/blob/vnext/LICENSE)
Autres installations:
</markdown>
<markdown>
* [Yavsc](http://yavsc.pschneider.fr)
</markdown>
</environment>
@ -119,8 +123,8 @@ C'est mon site pérso, une configuration de _Yavsc_ (encore une autre très peti
En production:
* [Lua](http://pschneider.fr:85)
* [Yavsc](http://pschneider.fr:84)
* [Lua](https://lua.pschneider.fr)
* [Yavsc](https://yavsc.pschneider.fr)
</markdown>
</environment>
@ -140,7 +144,7 @@ elle vous rappelera.</markdown>
<environment names="Development">
<markdown>
## Ceci est un site de développement.
## Ceci est un site de développement.
Cette présente ressource ne concerne que le développement du logiciel qui la met en oeuvre.
Elle est éphémère, et pratiquement en permanence force de codes 500.
@ -149,8 +153,8 @@ Veuillez excuser l'équipe de développement pour vous avoir fait part de cette
La "pré-production" affiche les sites suivants:
* [Lua](https://pschneider.fr:85)
* [Yavsc](https://pschneider.fr:84)
* [Yavsc](https://yavsc.pschneider.fr)
* [Lua](https://lua.pschneider.fr)
</markdown>
</environment>

@ -1,5 +1,5 @@
@{
ViewData["Title"] = "About";
ViewData["Title"] = @SR["About"]+" "+@SiteSettings.Value.Title;
}
<h1>@ViewData["Title"]</h1>
<environment names="freefield,Development">
@ -122,8 +122,8 @@ Outras instalações:
En production:
* [Lua](http://pschneider.fr:85)
* [Yavsc](http://pschneider.fr:84)
* [Lua](https://lua.pschneider.fr)
* [Yavsc](https://yavsc.pschneider.fr)
</markdown>
</environment>

@ -1,5 +1,5 @@
@{
ViewData["Title"] = "À propos des restrictions d'accès";
ViewData["Title"] = @SR["À propos des restrictions d'accès"];
}
<h1>@ViewData["Title"]</h1>

@ -1,5 +1,5 @@
@{
ViewData["Title"] = "À propos de Markdown";
ViewData["Title"] = @SR["À propos de Markdown"];
}
<h1>@ViewData["Title"]</h1>

@ -1,5 +1,5 @@
@{
ViewData["Title"] = "Page d'accueil";
ViewData["Title"] = @SR["Page d'accueil"];
}
@section scripts {

@ -1,5 +1,5 @@
@{
ViewData["Title"] = "Dash";
ViewData["Title"] = @SR["Dash"];
}
<div>

@ -1,8 +1,103 @@
@{
ViewData["Title"] = "Home Page";
@model IEnumerable<Activity>
@{
ViewData["Title"] = @SR["Page d'accueil"];
int i=0;
bool multipleact = Model.Count()>1;
}
@section scripts {
<script>
$(document).ready(function(){
var car = $('.carousel').first();
var fi = car.children('.carousel-inner').first()
.children('.item').first();
var capt = fi.children('.carousel-caption-s');
fi.addClass('active');
car.animate({'background-color':'rgba(0, 0, 0, .5)'},500,function() {
car.animate({'background-color':'rgba(0, 0, 0, 0)'},500)
})
})
</script>
}
@section subbanner {
<div id="myCarousel" class="carousel slide" data-ride="carousel" data-interval="6000">
@if (multipleact) {
<ol class="carousel-indicators">
@{
foreach (var act in Model) {
if (i==0) {
<li data-target="#myCarousel" data-slide-to="0" class="active"></li>
} else {
<li data-target="#myCarousel" data-slide-to="@i"></li>
}
i++;
}
}
</ol> }
<div class="carousel-inner" role="listbox">
@{
string cls = "item";
i=0;
foreach (var act in Model) {
<div class="@cls" style="background-image: url('@act.Photo'); background-repeat: no-repeat; ">
<div class="carousel-caption-s" >
<p><em>@act.Name</em><br/>
@act.Description </p>
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
@if (act.Children.Count>0) {
<a asp-route-id="@act.Code" class="btn btn-default">
@foreach (Activity c in act.Children) {
 @Html.DisplayFor(subact=>c)
}
</a>
}
@foreach (var frm in act.Forms) {
<a class="btn btn-primary" asp-controller="FrontOffice" asp-action="@frm.ActionName" asp-route-id="@act.Code">
@frm.Title
</a>
}
</div>
</div>
i++;
cls = "item";
}
}
</div>
@if (multipleact) {
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
<span class="sr-only">Précédent</span>
</a>
<a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
<span class="sr-only">Suivant</span>
</a>
}
</div>
}
@section ctxmenu {
@if (ViewData["Announces"]!=null) {
<li><a asp-controller="Announces" class="badge" >
<img src="@SiteSettings.Value.Logo" alt="announces" title="Annonces @SiteSettings.Value.Title" /></a></li>
}
@if ((int)ViewData["HaircutCommandCount"]>0) {
<li><a asp-controller="HairCutCommand" class="badge" >
<img src="~/images/shoppingcart.svg" alt="basket" title="Vos bons de commande" />(@ViewData["HaircutCommandCount"])</a></li>
}
}
@section header {
<style>
.navbar {
margin-bottom: 0;
}
</style>
}

@ -1,6 +1,14 @@
@{
ViewData["Title"] = "Privacy Policy";
@{
ViewData["Title"] = @SR["Confidentialité"]+" "+@SiteSettings.Value.Title;
}
<h1>@ViewData["Title"]</h1>
<p>Use this page to detail your site's privacy policy.</p>
<markdown>
## La confidentialité
À aucun moment, aucune adresse postale, aucune adresse e-mail ni aucun numéro de téléphone
ne sont transmis à personne. Seul le système et son [possesseur](/Home/Contact) a accès à ces informations.
De plus, le droit de retrait est permanent et sa mise en oeuvre [immédiate](/Account/Delete).
</markdown>

@ -1,5 +1,5 @@
@{
ViewData["Title"] = "Todo (first)";
ViewData["Title"] = @SR["Todo (first)"];
}
<h1>@ViewData["Title"]</h1>
<em>Linkmuse(trox)</em>
@ -9,7 +9,7 @@ Les tags.
La librairie, les lives.
</markdown>
@{
ViewData["Title"] = "TODO";
ViewData["Title"] = @SR["TODO"];
}
<h1>@ViewData["Title"]</h1>
<em>Faster, stronger, shorter</em>

@ -54,7 +54,7 @@ $("#cam").change(function(){
if (navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({audio: true, video: false}, function(stream) {
if ("srcObject" in video) {
video.srcObject = "stream";
video.srcObject = stream;
} else {
// Avoid using this in new browsers, as it is going away.
video.src = window.URL.createObjectURL(stream);

@ -31,3 +31,5 @@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@inject IAuthorizationService AuthorizationService
@inject Microsoft.AspNetCore.Mvc.Localization.IHtmlLocalizer<Yavsc.Startup> SR
@inject Microsoft.Extensions.Options.IOptions<SiteSettings> SiteSettings

@ -7,7 +7,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0-preview.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.4" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.3" />
<PackageReference Include="Google.Apis.Compute.v1" Version="1.60.0.2987" />
<PackageReference Include="MarkdownDeep-av.NET" Version="1.5.27" />
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
@ -17,6 +18,7 @@
<PackageReference Include="pazof.rules" Version="1.1.3" />
<PackageReference Include="RazorEngine.NetCore" Version="3.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.4" />
</ItemGroup>

@ -1,86 +0,0 @@
{
"Site": {
"Authority": "dev.pschneider.fr",
"Title": "Yavsc dev",
"Slogan": "Yavsc : WIP.",
"Banner": "/images/it/neworleans-louisiana-bywater-1973969-o.jpg",
"HomeViewName": "Home",
"FavIcon": "/favicon-dev.ico",
"Logo": "/images/logo-dev.png",
"StyleSheet":"/css/dev.css",
"Owner": {
"Name": "Paul",
"EMail": "paul@pschneider.fr",
"PostalAddress": {
"Street1": "2 Blv A. Briand",
"Street2": "Apt 284 - Bat V",
"PostalCode": "92150",
"City": "Suresnes",
"State": "France",
"Province": null
}
},
"Admin": {
"Name": "Paul",
"EMail": "contact@pschneider.fr"
},
"Avatars": "Avatars-Dev",
"Quota": 200000000,
"Bills": "Bills-Dev",
"Blog": "Blog-Dev",
"TempDir": "Temp-Dev",
"GitRepository": "/home/paul/workspace/tmp/test"
},
"Smtp": {
"Host": "localhost",
"Port": 25,
"Domain": "pschneider.fr",
"EnableSSL": false
},
"Logging": {
"IncludeScopes": true,
"LogLevel": {
"Default": "Debug",
"System": "Warning",
"Microsoft": "Warning"
}
},
"ConnectionStrings": {
"Default": "Server=localhost;Port=5432;Database=YavscDev;Username=yavscdev;Password=admin;"
},
"Authentication": {
"Google": {
"ApiKey": "AIzaSyD_f77q1ZG5GaGwx6Ifa7apmLuz4zbMZAw",
"BrowserApiKey": "AIzaSyCC_Dwpf2bTNybhpUsii-elIHyRnapduSY",
"GoogleServiceAccountJson": "google-secret.json",
"GoogleWebClientJson": "yavsc-client-secret.json"
} ,
"Facebook": {
"AppId": "552433071604577",
"AppToken": "552433071604577|Ahk_Jkn3i-0jixWV2wEiNQDqIFs"
},
"PayPal": {
"Mode": "sandbox",
"ClientId": "Ae9FgyE-R885ZSSiwtR_XlhaicGDqK5OEU912XOEQ5_LasTUtUtjT5zxAsb3tCl7croFnPtCAvYPeUAn",
"ClientSecret": "EEYfxQNQp0rNdfTcCxmujtmvUEXASJ5FOK8F5acBB9_57hE67WwPheU0V4whE7Qgp1dd3p2IJYDExYXj",
"Accounts": [{
"ApiUsername": "paul_api1.pschneider.fr",
"ApiPassword": "XE5TQ3VC5KB9B8AU",
"Signature": "AFcWxV21C7fd0v3bYYYRCpSSRl31AnnEkKSPDeEm60yAsJkxHLEYDMUy"
}],
"ApplicationId": "APP-80W284485P519543T",
"MerchantAccountId": "JL6JTE8C8SKLQ",
"MerchantAccountUserName": "paul_api1.pschneider.fr"
},
"Societeinfo": {
"ApiKey": "1b631h12vctbu25cqk2snlgbubebak6fd2f39t82jp7614a1asl"
},
"GitHub": {
"ApiKey": "f248b78b21ee57f54a6cce7e7014f8ebf0620577"
},
"Twitter": {
"ClientId": "fJAhbkzk9WZdTpCyjGHw1wBbx",
"ClientSecret": "2tP84RWq6VkY4iwgQE9Rb75Nc5lmdX6XU2ppNMxF4h7ErBCbyg"
}
}
}

@ -5,5 +5,70 @@
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
"AllowedHosts": "*",
"ConnectionStrings": {
"Default": "Server=[YOURSERVERNAME];Port=5432;Database=[YOURDBNAME];Username=[YOURDBUSERNAME];Password=[YOURDBPASSW];"
},
"Site": {
"Title": "Yavsc",
"Slogan": "Yavsc!",
"StyleSheet": "/css/default.css",
"Authority": "http://127.0.0.1:5000/",
"Owner": {
"Name": "[Site owner's name]",
"EMail": "[Site owner's e-mail address]"
},
"Admin": {
"Name": "[a name for a site admin]",
"EMail": "[an e-mail for a site admin]"
},
"Avatars": "Avatars",
"Quota": 200000000,
"Bills": "Bills",
"Blog": "Blog",
"TempDir": "Temp"
},
"Smtp": {
"Host": "[YOURSMTPHOST]",
"Port": 25,
"EnableSSL": false
},
"DataProtection": {
"Keys": {
"Dir": "DataProtection-Keys"
},
"RSAParamFile": "RSA-Params.json",
"ExpiresInHours": 168
},
"Authentication": {
"PayPal": {
"Mode": "[sandbox|production]",
"ClientId": "[Your PayPal REST API ClientId]",
"Secret": "[Your PayPal REST API Secret]"
},
"Google": {
"ApiKey": "[Your ApiKey]",
"ClientId": "[Your ClientId]",
"ClientSecret": "[Your ClientSecret]",
"ServiceAccount": {
"project_id": "[Yours]",
"private_key_id": "[Yours]",
"private_key": "-----[Yours]---\n",
"client_email": "[Yours]@appspot.gserviceaccount.com",
"client_id": "[Yours]",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www41.googleapis.com/robot/v1/[Yours].com"
}
},
"Facebook": {
"ClientId": "[Your ClientId]",
"ClientSecret": "[Your ClientSecret]"
},
"Twitter": {
"ClientId": "[Your ClientId]",
"ClientSecret": "[Your ClientSecret]"
}
}
}

Loading…