https://github.com/user-attachments/assets/78db908e-cfe5-4803-b0dc-4f33bc457840 * starts to extract usernames out of `users/` GitHub API responses, and pass those along with e-mails in the collab sessions as part of the `User` data * adjusts various prefill and seed test methods so that the new data can be retrieved from GitHub properly * if there's an active call, where guests have write permissions and e-mails, allow to trigger `FillCoAuthors` action in the context of the git panel, that will fill in `co-authored-by:` lines, using e-mail and names (or GitHub handle names if name is absent) * the action tries to not duplicate such entries, if any are present already, and adds those below the rest of the commit input's text Concerns: * users with write permissions and no e-mails will be silently omitted — adding odd entries that try to indicate this or raising pop-ups is very intrusive (maybe, we can add `#`-prefixed comments?), logging seems pointless * it's not clear whether the data prefill will run properly on the existing users — seems tolerable now, as it seems that we get e-mails properly already, so we'll see GitHub handles instead of names in the worst case. This can be prefilled better later. * e-mails and names for a particular project may be not what the user wants. E.g. my `.gitconfig` has ``` [user] email = mail4score@gmail.com # .....snip [includeif "gitdir:**/work/zed/**/.git"] path = ~/.gitconfig.work ``` and that one has ``` [user] email = kirill@zed.dev ``` while my GitHub profile is configured so, that `mail4score@gmail.com` is the public, commit e-mail. So, when I'm a participant in a Zed session, wrong e-mail will be picked. The problem is, it's impossible for a host to get remote's collaborator git metadata for a particular project, as that might not even exist on disk for the client. Seems that we might want to add some "project git URL <-> user name and email" mapping in the settings(?). The design of this is not very clear, so the PR concentrates on the basics for now. When https://github.com/zed-industries/zed/pull/23308 lands, most of the issues can be solved by collaborators manually, before committing. Release Notes: - N/A
98 lines
2.5 KiB
Rust
98 lines
2.5 KiB
Rust
use crate::db::UserId;
|
|
use chrono::NaiveDateTime;
|
|
use sea_orm::entity::prelude::*;
|
|
use serde::Serialize;
|
|
|
|
/// A user model.
|
|
#[derive(Clone, Debug, Default, PartialEq, Eq, DeriveEntityModel, Serialize)]
|
|
#[sea_orm(table_name = "users")]
|
|
pub struct Model {
|
|
#[sea_orm(primary_key)]
|
|
pub id: UserId,
|
|
pub github_login: String,
|
|
pub github_user_id: i32,
|
|
pub github_user_created_at: Option<NaiveDateTime>,
|
|
pub email_address: Option<String>,
|
|
pub name: Option<String>,
|
|
pub admin: bool,
|
|
pub invite_code: Option<String>,
|
|
pub invite_count: i32,
|
|
pub inviter_id: Option<UserId>,
|
|
pub connected_once: bool,
|
|
pub metrics_id: Uuid,
|
|
pub created_at: NaiveDateTime,
|
|
pub accepted_tos_at: Option<NaiveDateTime>,
|
|
pub custom_llm_monthly_allowance_in_cents: Option<i32>,
|
|
}
|
|
|
|
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
|
pub enum Relation {
|
|
#[sea_orm(has_many = "super::access_token::Entity")]
|
|
AccessToken,
|
|
#[sea_orm(has_one = "super::billing_customer::Entity")]
|
|
BillingCustomer,
|
|
#[sea_orm(has_one = "super::room_participant::Entity")]
|
|
RoomParticipant,
|
|
#[sea_orm(has_many = "super::project::Entity")]
|
|
HostedProjects,
|
|
#[sea_orm(has_many = "super::channel_member::Entity")]
|
|
ChannelMemberships,
|
|
#[sea_orm(has_many = "super::user_feature::Entity")]
|
|
UserFeatures,
|
|
#[sea_orm(has_one = "super::contributor::Entity")]
|
|
Contributor,
|
|
}
|
|
|
|
impl Related<super::access_token::Entity> for Entity {
|
|
fn to() -> RelationDef {
|
|
Relation::AccessToken.def()
|
|
}
|
|
}
|
|
|
|
impl Related<super::billing_customer::Entity> for Entity {
|
|
fn to() -> RelationDef {
|
|
Relation::BillingCustomer.def()
|
|
}
|
|
}
|
|
|
|
impl Related<super::room_participant::Entity> for Entity {
|
|
fn to() -> RelationDef {
|
|
Relation::RoomParticipant.def()
|
|
}
|
|
}
|
|
|
|
impl Related<super::project::Entity> for Entity {
|
|
fn to() -> RelationDef {
|
|
Relation::HostedProjects.def()
|
|
}
|
|
}
|
|
|
|
impl Related<super::channel_member::Entity> for Entity {
|
|
fn to() -> RelationDef {
|
|
Relation::ChannelMemberships.def()
|
|
}
|
|
}
|
|
|
|
impl Related<super::user_feature::Entity> for Entity {
|
|
fn to() -> RelationDef {
|
|
Relation::UserFeatures.def()
|
|
}
|
|
}
|
|
|
|
impl ActiveModelBehavior for ActiveModel {}
|
|
|
|
pub struct UserFlags;
|
|
|
|
impl Linked for UserFlags {
|
|
type FromEntity = Entity;
|
|
|
|
type ToEntity = super::feature_flag::Entity;
|
|
|
|
fn link(&self) -> Vec<RelationDef> {
|
|
vec![
|
|
super::user_feature::Relation::User.def().rev(),
|
|
super::user_feature::Relation::Flag.def(),
|
|
]
|
|
}
|
|
}
|