mirror of
https://github.com/outline/outline.git
synced 2026-06-13 11:25:03 +03:00
a3b2615edf
* No longer upload avatars to public bucket * Public redirect * tests * test * test
52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
import { createHash } from "crypto";
|
|
import { AttachmentPreset } from "@shared/types";
|
|
import attachmentCreator from "@server/commands/attachmentCreator";
|
|
import { createContext } from "@server/context";
|
|
import { User } from "@server/models";
|
|
import { BaseTask, TaskPriority } from "./base/BaseTask";
|
|
|
|
type Props = {
|
|
/** The userId to operate on */
|
|
userId: string;
|
|
/** The original avatarUrl from the SSO provider */
|
|
avatarUrl: string;
|
|
};
|
|
|
|
/**
|
|
* A task that uploads the provided avatarUrl to S3 storage and updates the
|
|
* user's record with the new url.
|
|
*/
|
|
export default class UploadUserAvatarTask extends BaseTask<Props> {
|
|
public async perform(props: Props) {
|
|
const user = await User.findByPk(props.userId, {
|
|
rejectOnEmpty: true,
|
|
});
|
|
|
|
const hash = createHash("sha256").update(props.avatarUrl).digest("hex");
|
|
|
|
// If the user's avatar URL already contains this hash, skip the upload
|
|
if (user.avatarUrl?.includes(hash)) {
|
|
return;
|
|
}
|
|
|
|
const attachment = await attachmentCreator({
|
|
name: hash,
|
|
url: props.avatarUrl,
|
|
user,
|
|
preset: AttachmentPreset.Avatar,
|
|
ctx: createContext({ user }),
|
|
});
|
|
|
|
if (attachment) {
|
|
await user.update({ avatarUrl: attachment.url });
|
|
}
|
|
}
|
|
|
|
public get options() {
|
|
return {
|
|
attempts: 3,
|
|
priority: TaskPriority.Normal,
|
|
};
|
|
}
|
|
}
|