Release ready

This commit is contained in:
Ronald A. Richardson
2025-12-19 22:23:39 +08:00
parent e41cd62ea5
commit 1b714a7ef8
13 changed files with 830 additions and 649 deletions

View File

@@ -1,14 +1,35 @@
# 🚀 Fleetbase v0.7.22 — 2025-12-07
# 🚀 Fleetbase v0.7.23 — 2025-12-19
> "Organizations can now set their own alpha-numeric sender ID for SMS"
> "🤯 Insane optimization and performance upgrades + horizontal scaling support 🚀"
---
## ✨ Highlights
- **Custom Alphanumeric Sender ID for SMS:**
Organizations can now configure their own **Alphanumeric Sender ID** used when sending verification codes and other SMS notifications.
This feature improves brand recognition, enhances trust, and aligns outbound communication with each organizations identity.
Supported in regions/carriers where alphanumeric senders are allowed (e.g., Mongolia and others).
- Major performance and optimization improvements which support horizontal scaling
- Ability to resize images on upload using resize parameters
- Several patches in FleetOps - fixed service rates and missing translations, improvements and patch to scheduler
- Added a new `LanguageService` available in ember-core
- Minor `@fleetbase/ember-ui` improvements
### New Features
- **Improved API performance** with two-layer caching system (Redis + ETag validation) for user and organization data
- **Reduced bandwidth usage** with automatic HTTP 304 Not Modified responses via new ValidateETag middleware
- **Faster page loads** with intelligent cache invalidation that updates immediately when data changes
- **New UserCacheService class** for centralized cache management across the application
- **Image resizing support** for dynamic image dimensions via URL parameters
- Added `ApiModelCache` class - Provides intelligent Redis-based caching for API query results with automatic invalidation
- Added `HasApiModelCache` trait - Enables models to cache query results with a single method call
### Performance Improvements
- Optimized form data syncing to eliminate N+1 query problems, reducing database queries from N to 2 for relationship syncing
- Implemented cache stampede prevention to handle high concurrent load efficiently
- Added cache versioning system for automatic invalidation when data changes
### Developer Experience
- Added `X-Cache-Status` header to API responses for easy cache debugging (HIT/MISS visibility)
- Automatic multi-tenant cache key generation for company-scoped data isolation
- Graceful fallback to direct queries when cache is unavailable
---

View File

@@ -20,10 +20,10 @@
"require": {
"php": ">=8.0 <=8.2.28",
"appstract/laravel-opcache": "^4.0",
"fleetbase/core-api": "^1.6.28",
"fleetbase/fleetops-api": "^0.6.29",
"fleetbase/core-api": "^1.6.29",
"fleetbase/fleetops-api": "^0.6.30",
"fleetbase/registry-bridge": "^0.1.2",
"fleetbase/storefront-api": "^0.4.9",
"fleetbase/storefront-api": "^0.4.10",
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^10.0",
"laravel/octane": "^2.3",

496
api/composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,8 +4,6 @@ import { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';
export default class UserSerializer extends ApplicationSerializer.extend(EmbeddedRecordsMixin) {
/**
* Embedded relationship attributes
*
* @var {Object}
*/
get attrs() {
return {
@@ -16,22 +14,45 @@ export default class UserSerializer extends ApplicationSerializer.extend(Embedde
}
/**
* Customize serializer so that the password is never sent to the server via Ember Data
* Prevent partial payloads from overwriting fully-loaded
* user records in the store.
*
* @param {Snapshot} snapshot
* @param {Object} options
* @return {Object} json
* This runs ONLY on incoming data.
*/
normalize(modelClass, resourceHash, prop) {
let normalized = super.normalize(modelClass, resourceHash, prop);
// Existing user already loaded in the store?
let existing = this.store.peekRecord(normalized.data.type, normalized.data.id);
if (existing) {
let attrs = normalized.data.attributes || {};
for (let key in attrs) {
if (attrs[key] === null || attrs[key] === undefined) {
delete attrs[key];
}
}
}
return normalized;
}
/**
* Customize serializer so that sensitive or server-managed
* fields are never sent to the backend.
*/
serialize() {
const json = super.serialize(...arguments);
// delete the password always
// Never send password
delete json.password;
// delete verification attributes
// Verification flags
delete json.email_verified_at;
delete json.phone_verified_at;
// delete server managed dates
// Server-managed timestamps
delete json.deleted_at;
delete json.created_at;
delete json.updated_at;

View File

@@ -7,18 +7,24 @@
<form class="flex flex-col md:flex-row" {{on "submit" (perform this.saveProfile)}}>
<div class="w-32 flex flex-col justify-center mb-6 mr-6">
<Image src={{this.user.avatar_url}} @fallbackSrc={{config "defaultValues.userImage"}} alt={{this.user.name}} class="w-32 h-32 rounded-md" />
<FileUpload @name={{t "console.account.index.photos"}} @accept="image/*" @onFileAdded={{this.uploadNewPhoto}} @labelClass="flex flex-row items-center justify-center" as |queue|>
<FileUpload
@name={{t "console.account.index.photos"}}
@accept="image/*"
@onFileAdded={{this.uploadNewPhoto}}
@labelClass="flex flex-row items-center justify-center"
as |queue|
>
<a tabindex={{0}} class="flex items-center px-0 mt-2 text-xs no-underline truncate btn btn-sm btn-default" disabled={{queue.files.length}}>
{{#if queue.files.length}}
<div class="mr-1.5">
<Spinner />
</div>
<span>
{{t "common.uploading"}}
{{t "common.uploading"}}
</span>
{{else}}
<FaIcon @icon="image" class="mr-1.5" />
<span>
<span>
{{t "console.account.index.upload-new"}}
</span>
{{/if}}
@@ -34,11 +40,31 @@
</InputGroup>
<InputGroup @name={{t "common.date-of-birth"}} @type="date" @value={{this.user.date_of_birth}} />
<InputGroup @name={{t "common.timezone"}} @helpText={{t "console.account.index.timezone"}}>
<Select @value={{this.user.timezone}} @options={{this.timezones}} @onSelect={{fn (mut this.user.timezone)}} @placeholder={{t "console.account.index.timezone"}} />
<div class="fleetbase-model-select fleetbase-power-select ember-model-select">
<PowerSelect
@options={{this.timezones}}
@selected={{this.user.timezone}}
@onChange={{fn (mut this.user.timezone)}}
@placeholder={{t "console.account.index.timezone"}}
@triggerClass="form-select form-input"
@searchEnabled={{true}}
as |option|
>
<div>{{option}}</div>
</PowerSelect>
</div>
</InputGroup>
</div>
<div class="mt-3 flex items-center justify-end">
<Button @buttonType="submit" @type="primary" @size="lg" @icon="save" @text={{t "common.save-changes"}} @onClick={{perform this.saveProfile}} @isLoading={{not this.saveProfile.isIdle}} />
<Button
@buttonType="submit"
@type="primary"
@size="lg"
@icon="save"
@text={{t "common.save-changes"}}
@onClick={{perform this.saveProfile}}
@isLoading={{not this.saveProfile.isIdle}}
/>
</div>
</div>
</form>

View File

@@ -1,6 +1,6 @@
{
"name": "@fleetbase/console",
"version": "0.7.22",
"version": "0.7.23",
"private": true,
"description": "Modular logistics and supply chain operating system (LSOS)",
"repository": "https://github.com/fleetbase/fleetbase",
@@ -34,14 +34,14 @@
"dependencies": {
"@ember/legacy-built-in-components": "^0.4.2",
"@fleetbase/dev-engine": "^0.2.12",
"@fleetbase/ember-core": "^0.3.8",
"@fleetbase/ember-ui": "^0.3.14",
"@fleetbase/fleetops-data": "^0.1.23",
"@fleetbase/fleetops-engine": "^0.6.29",
"@fleetbase/ember-core": "^0.3.9",
"@fleetbase/ember-ui": "^0.3.15",
"@fleetbase/fleetops-data": "^0.1.24",
"@fleetbase/fleetops-engine": "^0.6.30",
"@fleetbase/iam-engine": "^0.1.6",
"@fleetbase/leaflet-routing-machine": "^3.2.17",
"@fleetbase/registry-bridge-engine": "^0.1.2",
"@fleetbase/storefront-engine": "^0.4.9",
"@fleetbase/storefront-engine": "^0.4.10",
"@formatjs/intl-datetimeformat": "^6.18.2",
"@formatjs/intl-numberformat": "^8.15.6",
"@formatjs/intl-pluralrules": "^5.4.6",
@@ -93,6 +93,7 @@
"ember-cli-babel": "^8.2.0",
"ember-cli-clean-css": "^3.0.0",
"ember-cli-dependency-checker": "^3.3.2",
"ember-cli-deprecation-workflow": "^4.0.0",
"ember-cli-dotenv": "^3.1.0",
"ember-cli-htmlbars": "^6.3.0",
"ember-cli-inject-live-reload": "^2.1.0",
@@ -149,9 +150,9 @@
},
"pnpm": {
"overrides": {
"@fleetbase/ember-core": "latest",
"@fleetbase/ember-ui": "latest",
"@fleetbase/fleetops-data": "latest"
"@fleetbase/ember-core": "^0.3.9",
"@fleetbase/ember-ui": "^0.3.15",
"@fleetbase/fleetops-data": "^0.1.24"
}
},
"prettier": {

838
console/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff