Thomas Heartman
336eab9c5a
feat: allow slack-app and webhook to listen to schedule suspended events ( #5821 )
...
This PR adds the schedule suspended event to the slack-app and webhook
definitions.
It also slightly tweaks the markdown formatting of change requests to
add a definite article. This means the snapshot also needs to be
updated.
2024-01-10 15:14:31 +05:30
renovate[bot]
92ae2235a0
chore(deps): update dependency @biomejs/biome to v1.4.1 ( #5709 )
...
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg )](https://renovatebot.com )
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@biomejs/biome](https://biomejs.dev )
([source](https://togithub.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome ))
| [`1.4.0` ->
`1.4.1`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/1.4.0/1.4.1 )
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@biomejs%2fbiome/1.4.1?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@biomejs%2fbiome/1.4.1?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@biomejs%2fbiome/1.4.0/1.4.1?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@biomejs%2fbiome/1.4.0/1.4.1?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
---
### Release Notes
<details>
<summary>biomejs/biome (@​biomejs/biome)</summary>
###
[`v1.4.1`](https://togithub.com/biomejs/biome/blob/HEAD/CHANGELOG.md#141-2023-11-30 )
[Compare
Source](889593e3f9...a887513062
)
##### Editors
- Fix [#​933](https://togithub.com/biomejs/biome/issues/933 ). Some
files are properly ignored in the LSP too. E.g. `package.json`,
`tsconfig.json`, etc.
##### Formatter
##### Bug fixes
- Fix some accidental line breaks when printing array expressions within
arrow functions and other long lines
[#​917](https://togithub.com/biomejs/biome/pull/917 ). Contributed
by [@​faultyserver](https://togithub.com/faultyserver )
- Match Prettier's breaking strategy for `ArrowChain` layouts
[#​934](https://togithub.com/biomejs/biome/pull/934 ). Contributed
by [@​faultyserver](https://togithub.com/faultyserver )
- Fix double-printing of leading comments in arrow chain expressions
[#​951](https://togithub.com/biomejs/biome/pull/951 ). Contributed
by [@​faultyserver](https://togithub.com/faultyserver )
##### Linter
##### Bug fixes
- Fix [#​910](https://togithub.com/biomejs/biome/issues/910 ),
where the rule `noSvgWithoutTitle` should skip elements that have
`aria-hidden` attributes. Contributed by
[@​vasucp1207](https://togithub.com/vasucp1207 )
##### New features
- Add [useForOf](https://biomejs.dev/linter/rules/use-for-of ) rule.
The rule recommends a for-of loop when the loop index is only used to
read from an array that is being iterated.
Contributed by [@​victor-teles](https://togithub.com/victor-teles )
##### Enhancement
- Implements
[#​924](https://togithub.com/biomejs/biome/issues/924 ) and
[#​920](https://togithub.com/biomejs/biome/issues/920 ).
[noUselessElse](https://biomejs.dev/linter/rules/no-useless-else ) now
ignores `else` clauses that follow at least one `if` statement that
doesn't break early. Contributed by
[@​Conaclos](https://togithub.com/Conaclos )
For example, the following code is no longer reported by the rule:
```js
function f(x) {
if (x < 0) {
// this `if` doesn't break early.
} else if (x > 0) {
return x;
} else {
// This `else` block was previously reported as useless.
}
}
```
##### Bug fixes
- Fix [#​918](https://togithub.com/biomejs/biome/issues/918 ),
[useSimpleNumberKeys](https://biomejs.dev/linter/rules/use-simple-number-keys )
no longer repports false positive on comments. Contributed by
[@​kalleep](https://togithub.com/kalleep )
- Fix [#​953](https://togithub.com/biomejs/biome/issues/953 ),
[noRedeclare](https://biomejs.dev/linter/rules/no-redeclare ) no longer
reports type parameters with the same name in different mapped types as
redeclarations. Contributed by
[@​Conaclos](https://togithub.com/Conaclos )
- Fix [#​608](https://togithub.com/biomejs/biome/issues/608 ),
[useExhaustiveDependencies](https://biomejs.dev/linter/rules/use-exhaustive-dependencies )
no longer repports missing dependencies for React hooks without
dependency array. Contributed by
[@​kalleep](https://togithub.com/kalleep )
##### Parser
</details>
---
### Configuration
📅 **Schedule**: Branch creation - "after 7pm every weekday,before 5am
every weekday" in timezone Europe/Madrid, Automerge - At any time (no
schedule defined).
🚦 **Automerge**: Enabled.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/ ). View
repository job log
[here](https://developer.mend.io/github/Unleash/unleash ).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMDMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjEyNy4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: David Leek <david@getunleash.io>
2024-01-10 09:11:49 +00:00
Mateusz Kwasniewski
2c0c4e70ea
feat: Schedule daily metrics deletion ( #5807 )
2024-01-10 08:52:40 +01:00
Thomas Heartman
920e80c17e
chore: add schedule suspended event type ( #5820 )
...
To facilitate emitting this event in Enterprise
2024-01-10 13:21:11 +05:30
renovate[bot]
51e2d3ed46
chore(deps): update dependency node to v18.19.0 ( #4957 )
...
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg )](https://renovatebot.com )
This PR contains the following updates:
| Package | Type | Update | Change | Pending | Age | Adoption | Passing
| Confidence |
|---|---|---|---|---|---|---|---|---|
| [node](https://togithub.com/nodejs/node ) | | minor | `18.18.0` ->
`18.19.0` | |
[![age](https://developer.mend.io/api/mc/badges/age/github-tags/node/v18.19.0?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/github-tags/node/v18.19.0?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/github-tags/node/18.18.0/v18.19.0?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/node/18.18.0/v18.19.0?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
|
[@types/node](https://togithub.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node )
([source](https://togithub.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node ))
| devDependencies | minor | [`18.17.19` ->
`18.19.4`](https://renovatebot.com/diffs/npm/@types%2fnode/18.17.19/18.19.4 )
| `18.19.6` (+1) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/18.19.4?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/18.19.4?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/18.17.19/18.19.4?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/18.17.19/18.19.4?slim=true )](https://docs.renovatebot.com/merge-confidence/ )
|
---
### Release Notes
<details>
<summary>nodejs/node (node)</summary>
###
[`v18.19.0`](https://togithub.com/nodejs/node/compare/v18.18.2...v18.19.0 )
[Compare
Source](https://togithub.com/nodejs/node/compare/v18.18.2...v18.19.0 )
###
[`v18.18.2`](https://togithub.com/nodejs/node/compare/v18.18.1...v18.18.2 )
[Compare
Source](https://togithub.com/nodejs/node/compare/v18.18.1...v18.18.2 )
###
[`v18.18.1`](https://togithub.com/nodejs/node/releases/tag/v18.18.1 ):
2023-10-10, Version 18.18.1 'Hydrogen' (LTS),
@​richardlau
[Compare
Source](https://togithub.com/nodejs/node/compare/v18.18.0...v18.18.1 )
##### Notable Changes
This release addresses some regressions that appeared in Node.js
18.18.0:
- (Windows) FS can not handle certain characters in file name
[#​48673](https://togithub.com/nodejs/node/issues/48673 )
- 18 and 20 node images give error - Text file busy (after re-build
images)
[nodejs/docker-node#1968 ](https://togithub.com/nodejs/docker-node/issues/1968 )
- libuv update in 18.18.0 breaks webpack's thread-loader
[#​49911](https://togithub.com/nodejs/node/issues/49911 )
The libuv 1.45.0 and 1.46.0 updates that were released in Node.js
18.18.0 have been temporarily reverted.
##### Commits
- \[[`3e3a75cc46`](https://togithub.com/nodejs/node/commit/3e3a75cc46 )]
- ***Revert*** "**build**: sync libuv header change" (Richard Lau)
[#​50036](https://togithub.com/nodejs/node/pull/50036 )
- \[[`14ece2c479`](https://togithub.com/nodejs/node/commit/14ece2c479 )]
- ***Revert*** "**deps**: upgrade to libuv 1.45.0" (Richard Lau)
[#​50036](https://togithub.com/nodejs/node/pull/50036 )
- \[[`022352acbe`](https://togithub.com/nodejs/node/commit/022352acbe )]
- ***Revert*** "**deps**: upgrade to libuv 1.46.0" (Richard Lau)
[#​50036](https://togithub.com/nodejs/node/pull/50036 )
- \[[`d9f138189c`](https://togithub.com/nodejs/node/commit/d9f138189c )]
- ***Revert*** "**deps**: add missing thread-common.c in uv.gyp"
(Richard Lau)
[#​50036](https://togithub.com/nodejs/node/pull/50036 )
- \[[`7a3e1ffbb8`](https://togithub.com/nodejs/node/commit/7a3e1ffbb8 )]
- **fs**: make sure to write entire buffer (Robert Nagy)
[#​49211](https://togithub.com/nodejs/node/pull/49211 )
- \[[`04cba95a67`](https://togithub.com/nodejs/node/commit/04cba95a67 )]
- **test**: add `tmpdir.resolve()` (Livia Medeiros)
[#​49079](https://togithub.com/nodejs/node/pull/49079 )
</details>
---
### Configuration
📅 **Schedule**: Branch creation - "after 7pm every weekday,before 5am
every weekday" in timezone Europe/Madrid, Automerge - At any time (no
schedule defined).
🚦 **Automerge**: Enabled.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/ ). View
repository job log
[here](https://developer.mend.io/github/Unleash/unleash ).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4wLjMiLCJ1cGRhdGVkSW5WZXIiOiIzNy4xMjcuMCIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Ivar Conradi Østhus <ivar@getunleash.ai>
2024-01-10 07:23:19 +00:00
Ivar Conradi Østhus
6d4a727bdf
fix: remove unsued metric 'optimal304DiffingCounter' ( #5810 )
...
This metric was used while developing the optimal304 feature. The
feature flag has been removed and this data is not longer being
collected and this will remove the metric from Prometheus.
2024-01-09 18:54:28 +01:00
Gard Rimestad
24b202ef0b
feat: include environment type label in feature_toggle_update metrics ( #5809 )
...
This is needed in order to identify what type of an environment a toggle
is updated in. This can be test, development, pre-production or
production.
2024-01-09 16:33:00 +01:00
Mateusz Kwasniewski
a1b04e4b8d
feat: Aggregate daily metrics ( #5804 )
2024-01-09 13:46:49 +01:00
Gard Rimestad
adc47fd778
feat: add db metrics for environment-store ( #5808 )
...
This will give us prometheus metrics on environment lookups in the
database
2024-01-09 13:17:16 +01:00
Gastón Fournier
eb7882e2eb
feat: add automated actions flag ( #5805 )
...
Just a flag for an enterprise feature
2024-01-09 11:42:28 +00:00
Mateusz Kwasniewski
8955a9906d
feat: extended metrics options ui ( #5786 )
2024-01-08 14:49:41 +01:00
Gastón Fournier
1724219487
feat: encrypt emails at rest for demo login ( #5759 )
...
## About the changes
This allows us to encrypt emails at signup for demo users to further
secure our demo instance. Currently, emails are anonymized before
displaying events performed by demo users. But this means that emails
are stored at rest in our DB. By encrypting the emails at login, we're
adding another layer of protection.
This can be enabled with a flag and requires the encryption key and the
initialization vector (IV for short) to be present as environment
variables.
2024-01-05 14:21:20 +01:00
Christopher Kolstad
e769ceab05
task: Add an X-Unleash-Version header to register response ( #5774 )
...
Related to our work for making Edge bulk metrics a 1st class citizen of
Unleash, this PR adds an X-Unleash-Version header to the response from
client registration.
Based on when we add the new `/api/client/metrics/bulk` endpoint, Edge
can use the response header from upstream to decide whether to post
metrics to `/edge/metrics` or `/api/client/metrics/bulk`.
2024-01-05 11:54:28 +01:00
Jaanus Sellin
75e81515c8
chore: disable search feedback by default ( #5767 )
2024-01-04 14:44:17 +00:00
Christopher Kolstad
4c574a1e50
task: add kill-switch for edge bulk metrics ( #5758 )
...
If the kill switch is enabled unleash returns 404 and a json body explaining why a 404 was given, encouraging users to upgrade to the most recent version of Edge.
2024-01-04 11:21:48 +01:00
Fredrik Strand Oseberg
70600552d2
Feat/add feedback to new strategy form ( #5745 )
...
This PR adds the feedback form to the new create / edit strategy form
behind a feature flag.
* Add feedback form
* Minor refactor to useFeedback
2024-01-03 15:43:22 +01:00
Ivar Conradi Østhus
31124e4a90
fix: add feature-flag for license
2024-01-03 15:25:54 +01:00
Jaanus Sellin
a73d87a943
feat: make feedback available for OSS ( #5748 )
2024-01-03 15:08:01 +02:00
Christopher Kolstad
e993846471
task: add timer for client feature query ( #5734 )
...
Adds a database query timer for the client features query.
2024-01-02 16:02:03 +01:00
Jaanus Sellin
dc0df235dd
chore: remove private projects flag ( #5743 )
2024-01-02 15:53:26 +02:00
Jaanus Sellin
f53204c9b2
feat: add feature flag for posting feedback ( #5741 )
2024-01-02 13:10:54 +02:00
Christopher Kolstad
1fd233abc2
chore: make security optional for /edge/validate endpoint ( #5739 )
...
We've had a couple of misunderstandings from people surprised that
Unleash allows posts against the `/edge/validate` endpoint without an
API key. It is intentional that this endpoint does not require an
Authorization header, so this PR updates our OpenAPI spec to clarify
that there is no security required for `/edge/validate`
2024-01-02 10:09:49 +01:00
Christopher Kolstad
3a7824a2e8
Added a check that allows posting edge bulk metrics with a client token ( #5735 )
...
This allows bulk metrics posted with a Client token to be accepted.
Previously you needed an admin token to have bulk metrics accepted
2024-01-02 09:51:01 +01:00
Jaanus Sellin
e4c9a257ad
feat: make local storage work and make feedback url configurable ( #5738 )
...
Make storage work react way.
Make feedback url configurable by env variable.
2023-12-29 13:19:08 +02:00
Jaanus Sellin
55bd0a6760
feat: keep feedback submission in local storage ( #5737 )
...
Now it will track if feedback has been submitted in local storage.
2023-12-29 10:08:19 +02:00
Tymoteusz Czech
71a65b1d6b
Fix: strategy import ( #5731 )
...
Some optional properties of `strategy` where not included after importing
2023-12-27 19:37:51 +01:00
David Leek
9ac1070f43
feat: implement createdByUserId for all features ( #5725 )
...
## About the changes
Implements setting values on the created_by_user_id column on the
features table in the db
2023-12-22 14:33:16 +01:00
David Leek
1dadd23594
chore:system user and events created by userid migrations ( #5612 )
...
## About the changes
Migrations for:
- Adds column is_system to users
- Inserts unleash_system_user id -1337 to users
includes `is_system: false` in the activeUsers and activeAccounts where filter
Tested by running:
`
select * into users_pre_check from users where id > -1;
delete from users where id > -1;
`
before starting unleash, then inspecting users table after unleash has
started and verifying that an 'admin' user has been created.
---------
Co-authored-by: Christopher Kolstad <chriswk@getunleash.ai>
2023-12-22 11:19:39 +01:00
Nuno Góis
fb94138c5c
chore: support full path schemas ( #5723 )
...
This backwards compatible change allows us to specify a schema `id`
(full path) which to me feels a bit better than specifying the schema
name as a string, since a literal string is prone to typos.
### Before
```ts
requestBody: createRequestSchema(
'createResourceSchema',
),
responses: {
...getStandardResponses(400, 401, 403, 415),
201: resourceCreatedResponseSchema(
'resourceSchema',
),
},
```
### After
```ts
requestBody: createRequestSchema(
createResourceSchema.$id,
),
responses: {
...getStandardResponses(400, 401, 403, 415),
201: resourceCreatedResponseSchema(
resourceSchema.$id,
),
},
```
2023-12-22 08:17:23 +00:00
andreas-unleash
f0c0504b31
fix: email link ( #5719 )
...
Fixes missing base url
Relates to
#[1-1827](https://linear.app/unleash/issue/1-1827/email-link-to-revive-feature-is-wrong )
Signed-off-by: andreas-unleash <andreas@getunleash.ai>
2023-12-21 14:51:15 +02:00
Mateusz Kwasniewski
029af91e9e
fix: is after undefined parsing ( #5718 )
2023-12-21 13:25:10 +01:00
Nuno Góis
efa691d120
chore: helper methods to extract user data from req ( #5710 )
...
With the recent changes it's common that we'll need both the id and
processed username from the auth user in the request, so this PR
provides some helper methods to simplify this.
2023-12-21 12:06:20 +00:00
Mateusz Kwasniewski
60d3768ab1
fix: copy last seen at from env ( #5713 )
2023-12-21 12:37:28 +01:00
David Leek
4e56d1d8d5
feat: implement column created_by_user_id in feature_tag ( #5695 )
...
## About the changes
Adds the new nullable column created_by_user_id to the data used by
feature-tag-store and feature-tag-service. Also updates openapi schemas.
2023-12-21 10:00:45 +01:00
Fredrik Strand Oseberg
3ab331dce7
feat: increase unleash width ( #5707 )
...
This PR adds two feature flags:
* One is to add some holiday cheer to the unleash logo
* The other allows us to increase the width of unleash if the screen
allows it
<img width="1837" alt="Skjermbilde 2023-12-20 kl 16 18 16"
src="https://github.com/Unleash/unleash/assets/16081982/a25ccfb0-fd99-470f-8583-3ba9ef9186f9 ">
2023-12-21 08:42:28 +01:00
Jaanus Sellin
8e7e389d1d
fix: context updated event now does stores correct fields ( #5705 )
2023-12-20 15:57:17 +02:00
Nuno Góis
1a79921a38
chore: incoming webhook events ( #5693 )
...
https://linear.app/unleash/issue/2-1748/create-new-incoming-webhook-events
Adds new events for write operations on incoming webhooks and their
tokens.
2023-12-20 11:48:25 +00:00
David Leek
5603e8683d
chore: list users and groups under each role in projectaccessadded event ( #5581 )
...
## About the changes
Changes the project access added event to list all users and groups
added to each role instead of in root event.
2023-12-19 10:16:17 +01:00
Mateusz Kwasniewski
7800d9d1b4
feat: export all features in project ( #5677 )
2023-12-19 08:57:10 +01:00
Jaanus Sellin
d0facc7101
fix: adjust page limit normalization ( #5672 )
2023-12-18 14:33:45 +02:00
Jaanus Sellin
3b635132f9
feat: enable sorting by project ( #5671 )
2023-12-18 14:33:38 +02:00
Jaanus Sellin
4af0abc6c2
fix: increase page size in backend to 100 ( #5669 )
2023-12-18 14:18:05 +02:00
Jaanus Sellin
f4268347da
fix: last seen now sorts nulls last ( #5664 )
...
Two changes were needed to sort better
1. Since we are still using `last seen` from `features` table for
backwards compatibility, we needed to add it to sort condition.
2. Nulls break the order, so now sorting nulls as last.
2023-12-18 10:36:50 +02:00
Thomas Heartman
ab2281d7e7
fix: make username nullable in user-schema ( #5656 )
...
I noticed I was getting warnings logged in my local instance when
visiting the users page (`/admin/users`)
```json
{
"schema": "#/components/schemas/publicSignupTokensSchema",
"errors": [
{
"instancePath": "/tokens/0/users/0/username",
"schemaPath": "#/components/schemas/userSchema/properties/username/type",
"keyword": "type",
"params": {
"type": "string"
},
"message": "must be string"
}
]
}
```
It was complaining because one of my users doesn't have a username, so
the value returned from the API was:
```json
{
"users": [
{
"id": 2,
"name": "2mas",
"username": null
}
]
}
```
This adjustment fixes that oversight by allowing `null` values for the
username.
2023-12-16 08:28:22 +01:00
Pedro Papadopolis
24c2a70138
feat: Make compression middleware optional ( #5306 )
...
## Why
Currently AWS API Gateway doesn't have compression enabled by default,
this PR will make it easier to for example deploy Unleash over to AWS
Lambda without further configuration in API Gateway, frameworks like
Serverless requires a bit more work to set up compression and some times
one might not need compression at all.
## How
Create a new config flag called `disableCompression` which will not
include `compression` middleware in express' instance when set as true.
2023-12-16 08:06:26 +01:00
Jaanus Sellin
dafec2e672
fix: reducing of features will not break order anymore ( #5654 )
2023-12-15 14:46:40 +02:00
Mateusz Kwasniewski
8283edfc0a
feat: Sort by stale ( #5653 )
2023-12-15 11:56:06 +00:00
Nuno Góis
8be09510e8
chore: clean up banners feature flag ( #5648 )
...
Cleans up some leftover references to the `banners` feature flag.
Related to https://github.com/Unleash/unleash/pull/5348
2023-12-15 10:16:13 +00:00
Nuno Góis
f84fa81ebe
chore: add incomingWebhooks feature flag ( #5647 )
...
https://linear.app/unleash/issue/2-1683/feature-flag-add-a-new-incomingwebhooks-feature-flag-for-this-feature
Adds a new `incomingWebhooks` feature flag.
2023-12-15 10:15:52 +00:00
Jaanus Sellin
fa087fb473
refactor: move search implementation out of strategies store ( #5642 )
...
This is first step of refactoring. Next steps follow with possibly a
query builder, or atleast using some reusable methods.
2023-12-14 15:45:36 +02:00