Commit graph yavsc/src/Yavsc.Api
Author SHA1 Message Date
709846c58d
Finalize FrontOffice accept/reject: role-aware, authz, signature; drop Signature.FilePath
FrontOfficeApiController.AcceptQuery/RejectQuery now resolve the actor
(provider vs client vs admin) from the query's PerformerId/ClientId and
authorize accordingly — a non-party caller is forbidden. Either party may
accept or reject. Acceptance may carry a PostIt signature, which is staged
on the query's linked estimate (Estimate.CommandId == queryId) and sets the
estimate's ProviderValidationDate / ClientValidationDate; a signature with
no linked estimate, or a signature on a reject, returns 400. Admin bypasses
authz but cannot sign.

The shared signature-staging logic (find-or-add the Signature row by
(EstimateId, Type), write Strokes/CoordinateMax/CapturedAtUtc) is extracted
into EstimateSignaturePersister, and BillingController.Sign now calls it.
The persister owns no disk I/O and no SaveChanges — the caller persists in
its own transaction.

Signature.Strokes is now the sole source of truth: drop the FilePath
property, remove the on-disk EstimateSignatureFileHelper (and its tests),
and add the DropSignatureFilePath migration. The legacy PNG prosign/clisign
flow is independent of Signature.FilePath and is unchanged.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-21 16:15:18 +01:00
22c33c5388
Hide inserted estimates from client list; redirect anon to /signin
Estimates with status Inserted (provider hasn't worked on them yet)
were showing up in the client's "Mes devis à valider" list. The
asclient endpoint now requires ProviderValidationDate to be set, so
only estimates the provider has actually established and submitted
are visible to the client. The asprovider endpoint is unchanged
(providers still need to see incoming unprocessed requests).

Also fix the anonymous-access redirect on Yavsc.Org: the application
cookie's LoginPath defaulted to /Account/Login, which has no
controller. Anonymous hits to a restricted page now redirect to the
real /signin endpoint (with /signout and /Account/AccessDenied set
to match the existing controller routes).

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-21 14:38:49 +01:00
156b9c46e1
changelog: add 1.0.8-rc15 entry
Cover the 60 commits since 1.0.8-rc14: blog attachments + Markdown
preview, the Estimate pipeline (list/edition/validation + API + EF
migrations), provider ongoing requests, file-ACL and genericEstimate
migrations, POSTIT_SETTINGS_JSON, billing filtered by user, shared
YavscMessageSender, Gitleaks CI, and the test stabilization wave.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-19 12:56:02 +01:00
bc6bebea06
post the file
Some checks failed
Dotnet build and test / build (pull_request) Has been cancelled
2026-09-18 13:38:42 +01:00
3bc4142383
refacto site settings
Some checks failed
Dotnet build and test / build (pull_request) Failing after 8m29s
2026-09-17 23:54:36 +01:00
d47dd0f4ba
better indications
All checks were successful
Dotnet build and test / build (pull_request) Successful in 10m36s
2026-09-16 18:53:17 +01:00
51a2a40c88
new defaults
All checks were successful
Dotnet build and test / build (pull_request) Successful in 21m36s
2026-09-16 18:23:52 +01:00
110ed279f5
Estimate lists
All checks were successful
Dotnet build and test / build (pull_request) Successful in 18m1s
2026-09-15 00:19:23 +01:00
2484876c5b
The Estimate is validated
Some checks failed
Dotnet build and test / build (pull_request) Failing after 7m28s
2026-09-13 23:29:06 +01:00
848f8be42f
Estimate UI
Some checks failed
Dotnet build and test / build (pull_request) Failing after 5m20s
2026-09-13 18:54:27 +01:00
f7e1f4a736
list only my billing codes
Some checks failed
Dotnet build and test / build (pull_request) Failing after 11m23s
2026-09-13 03:49:07 +01:00
cbb59f019d
got saved a RdvQuery 2026-09-13 03:09:12 +01:00
3836faf872
Use a shared YavscMessageSender 2026-09-12 13:57:25 +01:00
2397f4d3a8
Add provider ongoing requests flow and sort persistence 2026-09-12 13:29:49 +01:00
86091990c5
generic estimate 2026-09-12 12:59:44 +01:00
91fc7f168b
implements a dico 2026-09-11 12:45:13 +01:00
ebe9d0b740 correctif UTC sur le POST/PUT RDV 2026-09-06 19:48:51 +01:00
ad5e9090ee fix(api): harden billing/blog validation and update rc14 changelog 2026-09-06 19:16:41 +01:00
c4f65f664b setup the avatar 2026-09-04 20:25:06 +01:00
138467496f Fix set-avatar auth flow and API avatar upload stability 2026-09-04 19:03:08 +01:00
da7e93a19a renaming 2026-09-02 14:52:17 +01:00
341b49cbfa hitting the performer 2026-08-31 04:15:10 +01:00
fbc72f0c85 RdvQuery from PostIt 2026-08-31 03:37:09 +01:00
3c51e66e50 Exploration des activités 2026-08-31 02:14:04 +01:00
da994435cb List the activities 2026-08-31 00:25:53 +01:00
8d7bb8f6b6 An activity interface 2026-08-30 23:55:09 +01:00
6cd5346101 chore(release): bump version via gitversion for 1.0.8-rc8 2026-08-29 19:10:37 +01:00
c23e62c4c0 chore(release): bump version via gitversion for 1.0.8-rc7 2026-08-29 15:43:53 +01:00
9db5d8116d chore(release): bump version via gitversion for 1.0.8-rc6 2026-08-29 09:50:07 +01:00
729c364702 -MsBuild.GitVersion 2026-08-29 00:52:29 +01:00
34d7ac8947 chore(release): bump version via gitversion for 1.0.8-rc4 2026-08-26 23:08:23 +01:00
3206523365 Merge branch 'feat/ui-testing' into release/1.0.8-rc3 2026-08-23 23:26:59 +01:00
569ed6b304 chore(release): bump version via gitversion for 1.0.8-rc3 2026-08-23 23:19:48 +01:00
4596206e3d more reliable 2026-08-23 18:34:34 +01:00
a70d2f789e sdk version bump 2026-08-22 16:58:08 +01:00
b679707b83 using clauses cleanup 2026-08-22 03:34:48 +01:00
ec901e1f10 refacto API prefix + nav.back 2026-08-20 20:50:52 +01:00
ed058c2e42 chore(release): bump version via gitversion for 1.0.8-rc1 2026-08-18 19:18:36 +01:00
7769ec3188 Merge pull request 'release/1.0.7-rc1' (#36) from release/1.0.7-rc1 into release/1.0.7
Reviewed-on: #36
2026-08-18 17:27:48 +01:00
ae1ae471d7 chore(release): bump version via gitversion for 1.0.7-rc1 2026-08-18 17:20:59 +01:00
b0e220e111 refactor(blogacl): move BlogAcl + Circle controllers from Yavsc.Api to Yavsc.Blogs
These two controllers belong to the Blogs subsystem (their routes
/api/blogacl and /api/circle are blog-domain concerns, not the
generic Api surface). Moving them next to BlogApiController keeps
related code together and prepares the PostIt client to consume
them through the same BlogsApiUrl base address as the existing
BlogApiClient.

Mechanical changes only:
- Namespace Yavsc.Controllers -> Yavsc.Blogs.Controllers
- Drop unused 'using Yavsc.Helpers;' (no symbol in the new
  compilation unit depends on it; the build confirms it was
  dead since the controllers were first written)
- Fix typo in CircleApiController route: 'api/cirle' -> 'api/circle'
  (any client trying to call the documented route was hitting 404)

No functional changes to authorization or query shape. The known
security gaps in these controllers (GetBlogACL and GetCircle
return unfiltered collections, DeleteCircle has no ownership
check) are deliberately left untouched in this commit and will
be addressed in a follow-up.
2026-08-17 23:34:48 +01:00
633a305c35 Activity protection 2026-08-10 18:12:59 +01:00
f27f65c2d3 fixes the compile and timestamps to db 2026-07-11 03:26:13 +01:00
2e886eb361 Potential fix for pull request finding 'CodeQL / Missing cross-site request forgery token validation'
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-07-06 00:57:47 +01:00
135003a913 Identity reloaded 2026-07-05 23:56:10 +01:00
5e4d548708 refacto query status 2026-07-04 22:35:53 +01:00
f5a9a3ddef renaming Reviewed 2026-07-04 22:25:59 +01:00
bd51df6ed9 drop the deigner.cs 2026-07-04 16:06:02 +01:00
Lum
9c58523dc6 feat(api): POST /api/bill/estimate/{id}/sign — JSON signature capture
Adds a new JSON-bodied signature endpoint as a sibling of the
legacy PNG-based prosign/clisign routes. The legacy flow stays
intact: the TeX invoice templates (Bill_tex.cshtml,
Estimate_tex.cshtml) still consume the sign-{billingCode}-{id}.png
files the old endpoints write, and the new endpoint writes to a
distinct /signatures/ tree under UserFilesDirName. A future
migration commit will regenerate PNGs from the JSON payload and
decommission the PNG flow.

Scope
- New Signature entity (Yavsc.Server/Models/Billing/Signature.cs)
  with FK to Estimate, FK to ApplicationUser (Signer), Type
  (Pro/Client) enum, CoordinateMax (default 10_000), int[] Strokes
  (native Npgsql mapping), CapturedAtUtc, FilePath. Multiple
  versions per (EstimateId, Type) are allowed; the controller
  reads the most recent.
- New Estimate.Signatures nav collection (InverseProperty) so the
  composite index covers both sides of the relation.
- New DbSet<Signature> Signatures + composite index
  (EstimateId, Type, CapturedAtUtc DESC) in ApplicationDbContext
  OnModelCreating. DeleteBehavior.Cascade on Estimate deletion
  cleans up signatures automatically.
- New EstimateSignatureFileHelper (Server/Helpers) with
  ReceiveEstimateSignatureAsync(user, estimateId, type, payload).
  Writes a yavsc.signature/v1 JSON envelope to
  UserFilesDirName/{user}/signatures/sign-{type}-{estimateId}-{ticks}.json.
  Quota update lives in the controller, not the helper, because
  the helper has no DbContext access.
- New endpoint POST /api/bill/estimate/{id:long}/sign on
  BillingController. Authz is body-driven (the bearer token is the
  PostIt OAuth client, not the end user, so signerUserId is in
  the JSON body, validated against Estimate.OwnerId/ClientId).
  Returns 201 Created with the new Signature's metadata.

Plumbing
- SignatureSubmission (body type) lives next to BillingController
  in the same file — small enough to keep colocated.
- The legacy prosign/clisign routes are untouched. They keep
  the IFormFile PNG contract; the new endpoint is the JSON
  counterpart.

Tests
- New EstimateSignatureFileHelperTests in Yavsc.Org.Tests
  (8 tests, all green): filename format incl. lowercase type and
  ticks, envelope v1 round-trip (parsed via JsonDocument, not
  text matching), null payload rejected, non-positive
  estimateId rejected. Disk side effects are isolated to a
  per-test temp root via AbstractFileSystemHelpers.UserFilesDirName.
- Yavsc.Org.Tests full suite: 29/29 green.
- PostIt.Tests: 57/57 green (untouched by this commit).
- Builds: Yavsc.Server, Yavsc.Api, Yavsc.Org, Yavsc.Org.Tests
  all compile clean.

Out of scope
- EF migration: the Signatures table doesn't exist in the
  database yet. The migration is intentionally a separate
  commit so the generated SQL can be reviewed against the
  composite index and the int[] column type before it touches
  any prod database. Until the migration lands, the new
  endpoint will 500 on SaveChanges; the [DEV] button in
  PostIt is the only call site, so this is acceptable.
- SignalR handler that opens the signature page on a
  'devis received' push — commit 4.
2026-07-04 15:47:55 +01:00
728aa4198c Exploiting GitVersion 2026-06-28 14:11:26 +01:00