Extract user's profile
This commit is contained in:
parent
ce216d218b
commit
f2c5dc468c
10 changed files with 102 additions and 69 deletions
|
@ -39,7 +39,7 @@ module.exports = async (params, user, _, isSecure) =>
|
|||
return rej('too long location');
|
||||
}
|
||||
|
||||
user.location = location;
|
||||
user.profile.location = location;
|
||||
}
|
||||
|
||||
// Get 'bio' parameter
|
||||
|
@ -49,21 +49,19 @@ module.exports = async (params, user, _, isSecure) =>
|
|||
return rej('too long bio');
|
||||
}
|
||||
|
||||
user.bio = bio;
|
||||
user.profile.bio = bio;
|
||||
}
|
||||
|
||||
// Get 'birthday' parameter
|
||||
const birthday = params.birthday;
|
||||
if (birthday != null) {
|
||||
if (birthday != '') {
|
||||
if (!isValidBirthday(birthday)) {
|
||||
return rej('invalid birthday');
|
||||
}
|
||||
|
||||
user.birthday = birthday;
|
||||
} else {
|
||||
user.birthday = null;
|
||||
if (!isValidBirthday(birthday)) {
|
||||
return rej('invalid birthday');
|
||||
}
|
||||
|
||||
user.profile.birthday = birthday;
|
||||
} else {
|
||||
user.profile.birthday = null;
|
||||
}
|
||||
|
||||
// Get 'avatar_id' parameter
|
||||
|
@ -81,11 +79,9 @@ module.exports = async (params, user, _, isSecure) =>
|
|||
await User.update(user._id, {
|
||||
$set: {
|
||||
name: user.name,
|
||||
location: user.location,
|
||||
bio: user.bio,
|
||||
birthday: user.birthday,
|
||||
avatar_id: user.avatar_id,
|
||||
banner_id: user.banner_id
|
||||
banner_id: user.banner_id,
|
||||
profile: user.profile
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -65,14 +65,12 @@ export default async (req: express.Request, res: express.Response) => {
|
|||
token: secret,
|
||||
avatar_id: null,
|
||||
banner_id: null,
|
||||
birthday: null,
|
||||
created_at: new Date(),
|
||||
bio: null,
|
||||
description: null,
|
||||
email: null,
|
||||
followers_count: 0,
|
||||
following_count: 0,
|
||||
links: null,
|
||||
location: null,
|
||||
name: name,
|
||||
password: hash,
|
||||
posts_count: 0,
|
||||
|
@ -80,7 +78,17 @@ export default async (req: express.Request, res: express.Response) => {
|
|||
liked_count: 0,
|
||||
drive_capacity: 1073741824, // 1GB
|
||||
username: username,
|
||||
username_lower: username.toLowerCase()
|
||||
username_lower: username.toLowerCase(),
|
||||
profile: {
|
||||
bio: null,
|
||||
birthday: null,
|
||||
blood: null,
|
||||
gender: null,
|
||||
handedness: null,
|
||||
height: null,
|
||||
location: null,
|
||||
weight: null
|
||||
}
|
||||
});
|
||||
|
||||
// Response
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
<mk-list-user><a class="avatar-anchor" href={ CONFIG.url + '/' + user.username }><img class="avatar" src={ user.avatar_url + '?thumbnail&size=64' } alt="avatar"/></a>
|
||||
<mk-list-user>
|
||||
<a class="avatar-anchor" href={ CONFIG.url + '/' + user.username }>
|
||||
<img class="avatar" src={ user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
</a>
|
||||
<div class="main">
|
||||
<header>
|
||||
<div class="left"><a class="name" href={ CONFIG.url + '/' + user.username }>{ user.name }</a><span class="username">@{ user.username }</span></div>
|
||||
<a class="name" href={ CONFIG.url + '/' + user.username }>{ user.name }</a>
|
||||
<span class="username">@{ user.username }</span>
|
||||
</header>
|
||||
<div class="body">
|
||||
<p class="followed" if={ user.is_followed }>フォローされています</p>
|
||||
<div class="bio">{ user.bio }</div>
|
||||
<div class="description">{ user.description }</div>
|
||||
</div>
|
||||
</div>
|
||||
<mk-follow-button user={ user }></mk-follow-button>
|
||||
|
@ -41,31 +45,23 @@
|
|||
> header
|
||||
margin-bottom 2px
|
||||
|
||||
&:after
|
||||
content ""
|
||||
display block
|
||||
clear both
|
||||
> .name
|
||||
display inline
|
||||
margin 0
|
||||
padding 0
|
||||
color #777
|
||||
font-size 1em
|
||||
font-weight 700
|
||||
text-align left
|
||||
text-decoration none
|
||||
|
||||
> .left
|
||||
float left
|
||||
&:hover
|
||||
text-decoration underline
|
||||
|
||||
> .name
|
||||
display inline
|
||||
margin 0
|
||||
padding 0
|
||||
color #777
|
||||
font-size 1em
|
||||
font-weight 700
|
||||
text-align left
|
||||
text-decoration none
|
||||
|
||||
&:hover
|
||||
text-decoration underline
|
||||
|
||||
> .username
|
||||
text-align left
|
||||
margin 0 0 0 8px
|
||||
color #ccc
|
||||
> .username
|
||||
text-align left
|
||||
margin 0 0 0 8px
|
||||
color #ccc
|
||||
|
||||
> .body
|
||||
> .followed
|
||||
|
@ -78,7 +74,7 @@
|
|||
background #eefaff
|
||||
border-radius 4px
|
||||
|
||||
> .bio
|
||||
> .description
|
||||
cursor default
|
||||
display block
|
||||
margin 0
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<div class="title">
|
||||
<p class="name" href={ CONFIG.url + '/' + user.username }>{ user.name }</p>
|
||||
<p class="username">@{ user.username }</p>
|
||||
<p class="location" if={ user.location }><i class="fa fa-map-marker"></i>{ user.location }</p>
|
||||
<p class="location" if={ user.profile.location }><i class="fa fa-map-marker"></i>{ user.profile.location }</p>
|
||||
</div>
|
||||
<footer><a href={ '/' + user.username }>投稿</a><a href={ '/' + user.username + '/media' }>メディア</a><a href={ '/' + user.username + '/graphs' }>グラフ</a>
|
||||
<button onclick={ NotImplementedException }><i class="fa fa-ellipsis-h"></i></button>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<p class="name">{ user.name }</p>
|
||||
<p class="username">@{ user.username }</p>
|
||||
</div>
|
||||
<div class="bio">{ user.bio }</div>
|
||||
<div class="description">{ user.description }</div>
|
||||
<div class="status">
|
||||
<div>
|
||||
<p>投稿</p><a>{ user.posts_count }</a>
|
||||
|
@ -69,7 +69,7 @@
|
|||
font-size 0.8em
|
||||
color #999
|
||||
|
||||
> .bio
|
||||
> .description
|
||||
padding 0 16px
|
||||
font-size 0.7em
|
||||
color #555
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
<mk-big-follow-button user={ user }></mk-big-follow-button>
|
||||
<p class="followed" if={ user.is_followed }>フォローされています</p>
|
||||
</div>
|
||||
<div class="bio" if={ user.bio != '' }>{ user.bio }</div>
|
||||
<div class="birthday" if={ user.birthday }>
|
||||
<p><i class="fa fa-birthday-cake"></i>{ user.birthday.replace('-', '年').replace('-', '月') + '日' } ({ age(user.birthday) }歳)</p>
|
||||
<div class="description" if={ user.description }>{ user.description }</div>
|
||||
<div class="birthday" if={ user.profile.birthday }>
|
||||
<p><i class="fa fa-birthday-cake"></i>{ user.profile.birthday.replace('-', '年').replace('-', '月') + '日' } ({ age(user.profile.birthday) }歳)</p>
|
||||
</div>
|
||||
<div class="twitter" if={ user.twitter }>
|
||||
<p><i class="fa fa-twitter"></i><a href={ 'https://twitter.com/' + user.twitter.screen_name } target="_blank">@{ user.twitter.screen_name }</a></p>
|
||||
|
@ -39,7 +39,7 @@
|
|||
background #eefaff
|
||||
border-radius 4px
|
||||
|
||||
> .bio
|
||||
> .description
|
||||
padding 16px
|
||||
color #555
|
||||
border-top solid 1px #eee
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
<mk-user-preview><a class="avatar-anchor" href={ CONFIG.url + '/' + user.username }><img class="avatar" src={ user.avatar_url + '?thumbnail&size=64' } alt="avatar"/></a>
|
||||
<mk-user-preview>
|
||||
<a class="avatar-anchor" href={ CONFIG.url + '/' + user.username }>
|
||||
<img class="avatar" src={ user.avatar_url + '?thumbnail&size=64' } alt="avatar"/>
|
||||
</a>
|
||||
<div class="main">
|
||||
<header><a class="name" href={ CONFIG.url + '/' + user.username }>{ user.name }</a><span class="username">@{ user.username }</span></header>
|
||||
<header>
|
||||
<a class="name" href={ CONFIG.url + '/' + user.username }>{ user.name }</a>
|
||||
<span class="username">@{ user.username }</span>
|
||||
</header>
|
||||
<div class="body">
|
||||
<div class="bio">{ user.bio }</div>
|
||||
<div class="description">{ user.description }</div>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
|
@ -75,7 +81,7 @@
|
|||
|
||||
> .body
|
||||
|
||||
> .bio
|
||||
> .description
|
||||
cursor default
|
||||
display block
|
||||
margin 0
|
||||
|
|
|
@ -14,13 +14,13 @@
|
|||
<span class="username">@{ user.username }</span>
|
||||
<span class="followed" if={ user.is_followed }>フォローされています</span>
|
||||
</div>
|
||||
<div class="bio">{ user.bio }</div>
|
||||
<div class="description">{ user.description }</div>
|
||||
<div class="info">
|
||||
<p class="location" if={ user.location }>
|
||||
<i class="fa fa-map-marker"></i>{ user.location }
|
||||
<p class="location" if={ user.profile.location }>
|
||||
<i class="fa fa-map-marker"></i>{ user.profile.location }
|
||||
</p>
|
||||
<p class="birthday" if={ user.birthday }>
|
||||
<i class="fa fa-birthday-cake"></i>{ user.birthday.replace('-', '年').replace('-', '月') + '日' } ({ age(user.birthday) }歳)
|
||||
<p class="birthday" if={ user.profile.birthday }>
|
||||
<i class="fa fa-birthday-cake"></i>{ user.profile.birthday.replace('-', '年').replace('-', '月') + '日' } ({ age(user.profile.birthday) }歳)
|
||||
</p>
|
||||
</div>
|
||||
<div class="friends">
|
||||
|
@ -119,7 +119,7 @@
|
|||
background #f8f8f8
|
||||
border-radius 4px
|
||||
|
||||
> .bio
|
||||
> .description
|
||||
margin 8px 0
|
||||
color #333
|
||||
|
||||
|
|
23
test/api.js
23
test/api.js
|
@ -134,7 +134,11 @@ describe('API', () => {
|
|||
|
||||
describe('i/update', () => {
|
||||
it('アカウント設定を更新できる', () => new Promise(async (done) => {
|
||||
const me = await insertSakurako();
|
||||
const me = await insertSakurako({
|
||||
profile: {
|
||||
gender: 'female'
|
||||
}
|
||||
});
|
||||
|
||||
const myName = '大室櫻子';
|
||||
const myLocation = '七森中';
|
||||
|
@ -148,8 +152,10 @@ describe('API', () => {
|
|||
res.should.have.status(200);
|
||||
res.body.should.be.a('object');
|
||||
res.body.should.have.property('name').eql(myName);
|
||||
res.body.should.have.property('location').eql(myLocation);
|
||||
res.body.should.have.property('birthday').eql(myBirthday);
|
||||
res.body.should.have.property('profile').a('object');
|
||||
res.body.should.have.deep.property('profile.location').eql(myLocation);
|
||||
res.body.should.have.deep.property('profile.birthday').eql(myBirthday);
|
||||
res.body.should.have.deep.property('profile.gender').eql('female');
|
||||
done();
|
||||
});
|
||||
}));
|
||||
|
@ -159,11 +165,12 @@ describe('API', () => {
|
|||
birthday: '2000-09-07'
|
||||
});
|
||||
request('/i/update', {
|
||||
birthday: ''
|
||||
birthday: null
|
||||
}, me).then(res => {
|
||||
res.should.have.status(200);
|
||||
res.body.should.be.a('object');
|
||||
res.body.should.have.property('birthday').eql(null);
|
||||
res.body.should.have.property('profile').a('object');
|
||||
res.body.should.have.deep.property('profile.birthday').eql(null);
|
||||
done();
|
||||
});
|
||||
}));
|
||||
|
@ -1214,7 +1221,8 @@ async function insertSakurako(opts) {
|
|||
token: '!00000000000000000000000000000000',
|
||||
username: 'sakurako',
|
||||
username_lower: 'sakurako',
|
||||
password: '$2a$08$FnHXg3tP.M/kINWgQSXNqeoBsiVrkj.ecXX8mW9rfBzMRkibYfjYy' // HimawariDaisuki06160907
|
||||
password: '$2a$08$FnHXg3tP.M/kINWgQSXNqeoBsiVrkj.ecXX8mW9rfBzMRkibYfjYy', // HimawariDaisuki06160907
|
||||
profile: {}
|
||||
}, opts));
|
||||
}
|
||||
|
||||
|
@ -1223,7 +1231,8 @@ async function insertHimawari(opts) {
|
|||
token: '!00000000000000000000000000000001',
|
||||
username: 'himawari',
|
||||
username_lower: 'himawari',
|
||||
password: '$2a$08$OPESxR2RE/ZijjGanNKk6ezSqGFitqsbZqTjWUZPLhORMKxHCbc4O' // ilovesakurako
|
||||
password: '$2a$08$OPESxR2RE/ZijjGanNKk6ezSqGFitqsbZqTjWUZPLhORMKxHCbc4O', // ilovesakurako
|
||||
profile: {}
|
||||
}, opts));
|
||||
}
|
||||
|
||||
|
|
18
tools/migration/user-profile.js
Normal file
18
tools/migration/user-profile.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
db.users.find({}).forEach(function(user) {
|
||||
print(user._id);
|
||||
db.users.update({ _id: user._id }, {
|
||||
$rename: {
|
||||
bio: 'description'
|
||||
},
|
||||
$unset: {
|
||||
location: '',
|
||||
birthday: ''
|
||||
},
|
||||
$set: {
|
||||
profile: {
|
||||
location: user.location || null,
|
||||
birthday: user.birthday || null
|
||||
}
|
||||
}
|
||||
}, false, false);
|
||||
});
|
Loading…
Reference in a new issue