put logic into ServiceImpl so that it is tx protected