[IMP] mail: send cache control header on avatars

Before this PR cache control header for avatar was set to no-cache which is not
the right value.
This PR mark the avatar routes response as immutable when a unique string is
present. We also use the partner write_date as unique string when possible.

task-3551636

closes odoo/odoo#141326

X-original-commit: 3de4f1f1225229cbdb0512df5790ce491f04ea7e
Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
This commit is contained in:
Didier (did)
2023-11-07 21:02:27 +00:00
parent 7b1dd79f46
commit 4064508af5
11 changed files with 98 additions and 19 deletions
@@ -61,6 +61,8 @@ export class Persona extends Record {
/** @type {ImStatus} */
im_status;
isAdmin = false;
/** @type {string} */
write_date;
/**
* @returns {boolean}
@@ -854,15 +854,19 @@ export class ThreadService {
if (!persona) {
return DEFAULT_AVATAR;
}
const urlParams = {};
if (persona.write_date) {
urlParams.unique = persona.write_date;
}
if (persona.is_company === undefined && this.store.self?.user?.isInternalUser) {
this.personaService.fetchIsCompany(persona);
}
if (thread?.model === "discuss.channel") {
if (persona.type === "partner") {
return url(`/discuss/channel/${thread.id}/partner/${persona.id}/avatar_128`);
return url(`/discuss/channel/${thread.id}/partner/${persona.id}/avatar_128`, urlParams);
}
if (persona.type === "guest") {
return url(`/discuss/channel/${thread.id}/guest/${persona.id}/avatar_128`);
return url(`/discuss/channel/${thread.id}/guest/${persona.id}/avatar_128`, urlParams);
}
}
if (persona.type === "partner" && persona?.id) {
@@ -870,6 +874,7 @@ export class ThreadService {
field: "avatar_128",
id: persona.id,
model: "res.partner",
...urlParams,
});
return avatar;
}
@@ -878,6 +883,7 @@ export class ThreadService {
field: "avatar_128",
id: persona.user.id,
model: "res.users",
...urlParams,
});
return avatar;
}
@@ -66,7 +66,10 @@ patch(Thread.prototype, {
);
}
if (this.type === "chat") {
return `/web/image/res.partner/${this.chatPartner.id}/avatar_128`;
return url(
`/web/image/res.partner/${this.chatPartner.id}/avatar_128`,
assignDefined({}, { unique: this.chatPartner.write_date })
);
}
return super.imgUrl;
},
@@ -1000,7 +1000,7 @@ QUnit.test("chat - avatar: should have correct avatar", async () => {
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel img");
await contains(`img[data-src='/web/image/res.partner/${partnerId}/avatar_128']`);
await contains(`img[data-src$='/web/image/res.partner/${partnerId}/avatar_128']`);
});
QUnit.test("chat should be sorted by last activity time [REQUIRE FOCUS]", async () => {