Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore: Move initial avatar upload to background worker (#3727)
* chore: Async user avatar upload processor * chore: Async team avatar upload * Refactor to task for retries * Docs Include avatarUrl in task props to prevent race condition Remove transaction around upload fetch request
- Loading branch information
Showing
14 changed files
with
187 additions
and
74 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import { Team, User } from "@server/models"; | ||
import { Event, TeamEvent, UserEvent } from "@server/types"; | ||
import UploadTeamAvatarTask from "../tasks/UploadTeamAvatarTask"; | ||
import UploadUserAvatarTask from "../tasks/UploadUserAvatarTask"; | ||
import BaseProcessor from "./BaseProcessor"; | ||
|
||
export default class AvatarProcessor extends BaseProcessor { | ||
static applicableEvents: Event["name"][] = ["users.create", "teams.create"]; | ||
|
||
async perform(event: UserEvent | TeamEvent) { | ||
// The uploads are performed in a separate task to allow for retrying in the | ||
// case of failures as it involves network calls to third party services. | ||
|
||
if (event.name === "users.create") { | ||
const user = await User.findByPk(event.userId, { | ||
rejectOnEmpty: true, | ||
}); | ||
|
||
if (user.avatarUrl) { | ||
await UploadUserAvatarTask.schedule({ | ||
userId: event.userId, | ||
avatarUrl: user.avatarUrl, | ||
}); | ||
} | ||
} | ||
|
||
if (event.name === "teams.create") { | ||
const team = await Team.findByPk(event.teamId, { | ||
rejectOnEmpty: true, | ||
}); | ||
|
||
if (team.avatarUrl) { | ||
await UploadTeamAvatarTask.schedule({ | ||
teamId: event.teamId, | ||
avatarUrl: team.avatarUrl, | ||
}); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import { v4 as uuidv4 } from "uuid"; | ||
import { Team } from "@server/models"; | ||
import { uploadToS3FromUrl } from "@server/utils/s3"; | ||
import BaseTask, { TaskPriority } from "./BaseTask"; | ||
|
||
type Props = { | ||
/* The teamId to operate on */ | ||
teamId: string; | ||
/* The original avatarUrl from the SSO provider */ | ||
avatarUrl: string; | ||
}; | ||
|
||
/** | ||
* A task that uploads the provided avatarUrl to S3 storage and updates the | ||
* team's record with the new url. | ||
*/ | ||
export default class UploadTeamAvatarTask extends BaseTask<Props> { | ||
public async perform(props: Props) { | ||
const team = await Team.findByPk(props.teamId, { | ||
rejectOnEmpty: true, | ||
}); | ||
|
||
const avatarUrl = await uploadToS3FromUrl( | ||
props.avatarUrl, | ||
`avatars/${team.id}/${uuidv4()}`, | ||
"public-read" | ||
); | ||
|
||
if (avatarUrl) { | ||
await team.update({ avatarUrl }); | ||
} | ||
} | ||
|
||
public get options() { | ||
return { | ||
attempts: 3, | ||
priority: TaskPriority.Normal, | ||
}; | ||
} | ||
} |
Oops, something went wrong.