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,
        });
      }
    }
  }
}
